android 用户定位和地图查询
来源:互联网 发布:数据库开发看什么书 编辑:程序博客网 时间:2024/04/27 19:06
这是一个基于android的用户定位和地图查询demo,demo中使用GPS定位,返回经纬度,稍作修改也可以使用Network或者别的方式定位。地图查询使用百度地图提供的URl接口下载地图。
demo:下载地址
注意1:使用GPS请到户外或窗口,否则可能查不到。2:地图查询时如果不输入查询地点(文本框空着),会默认查询用户所在地,如果用户没有定位自己,会默认查询北京天安门。3:如果百度地图修改自己的URL接口,地图查询可能会失败。
4:地图查询界面的地图没有做缩放和居中,感兴趣的同学可以自己设置下。
权限:
<uses-permission android:name="android.permission.INTERNET" /> <!-- 精确定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 粗糙定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
MainActivity.java:
package fk.androiddemo_028;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.support.v4.app.ActivityCompat;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.util.Iterator;import java.util.List;//在Mainfest中注册相关权限//创建LocationManager对象//选择LocationProvider(有多种定位方式可选,GPS,Network等)//绑定LocationListenerpublic class MainActivity extends Activity implements View.OnClickListener, LocationListener { Button but, testBut, bestBut, mapBut; TextView text, longText, latText; LocationManager manager;//管理用户定位服务 double lat = 39.9096045, lng = 116.397228;//这是北京天安门的经纬度 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); but = (Button) findViewById(R.id.button); but.setOnClickListener(this); testBut = (Button) findViewById(R.id.testButton); testBut.setOnClickListener(this); bestBut = (Button) findViewById(R.id.bestButton); bestBut.setOnClickListener(this); mapBut = (Button) findViewById(R.id.mapButton); mapBut.setOnClickListener(this); text = (TextView) findViewById(R.id.textView); longText = (TextView) findViewById(R.id.longitudeText); latText = (TextView) findViewById(R.id.latitudeText); //定义manager对象,getSystemService()方法根据名字得到一个系统服务 manager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); } @Override public void onClick(View v) { if (v == but) { //权限检查 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { System.out.println("没有相关权限!!"); return; } //开始定位(LocationProvider选用GPS定位方式,更新定位间隔时间毫秒,更新定位间隔距离米,定位监听器对象) manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); }else if(v==testBut){ //取得所有的可用的定位provider List<String> providers=manager.getAllProviders(); String provider=""; for(Iterator iterator = providers.iterator(); iterator.hasNext();){ provider+=iterator.next()+";"; } text.setText(provider); }else if(v==bestBut){//查询最好的定位方式 //Criteria可以设置一些查询条件 Criteria criteria=new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setPowerRequirement(Criteria.POWER_LOW); //是否需要提供海拔信息 criteria.setAltitudeRequired(false); //是否允许产生费用 criteria.setCostAllowed(false); //根据查询条件找到最好的provider text.setText(manager.getBestProvider(criteria,true)); } else if(v==mapBut){ Intent intent=new Intent(); intent.setClass(this, MapActivity.class); //向MapActivity传送本地的经纬度; intent.putExtra("lat",lat); intent.putExtra("lng",lng); startActivity(intent); } } @Override public void onLocationChanged(Location location) { //当位置改变后被调用 lng=location.getLongitude(); lat=location.getLatitude(); longText.setText(lng+""); latText.setText(lat+""); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { }}MapActivity.java:
package fk.androiddemo_028;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.location.Address;import android.location.Geocoder;import android.os.Handler;import android.os.Message;import android.os.Bundle;import android.view.View;import android.webkit.WebView;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.util.Iterator;import java.util.List;public class MapActivity extends Activity implements View.OnClickListener{ Button but; TextView resultText; EditText editText; WebView webView; MyHandler myHandler; double lat=0,lng=0; Address addr; ProgressDialog proDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); but=(Button)findViewById(R.id.but); but.setOnClickListener(this); editText=(EditText)findViewById(R.id.editText); resultText=(TextView)findViewById(R.id.resultText); webView=(WebView)findViewById(R.id.webView); myHandler=new MyHandler();//Handler需要在主线程定义 //读取MainActivity发来的经纬度 Intent intent=getIntent(); lat=intent.getDoubleExtra("lat", 39.9096045); lng=intent.getDoubleExtra("lng", 116.397228); } @Override public void onClick(View v) { //在界面上显示后台忙的进度对话框 proDialog=ProgressDialog.show(this,"后台忙。。。", "正在查找位置,请稍等O(∩_∩)O",true,false); //Geocoder查询可能较慢,所以放到子线程中 new GeocodingTask().start(); } private class GeocodingTask extends Thread{ @Override public void run() { try { //Geocoder提供地图查询功能 Geocoder geocoder=new Geocoder(MapActivity.this); //判断你的手机的geocoder是否可用 Boolean geoIsEnable=geocoder.isPresent(); //获取输入框内容 String addressName=editText.getText().toString().trim(); //根据经纬度查询地点,最多返回前3个(纬度,经度) List<Address> addressesFromLngLat=geocoder.getFromLocation(lat, lng, 3); //根据地点名称查询地点.注意这两个查询函数如果可能会查询较长时间(在找不到的情况下) List<Address> addressesFromAddrName=geocoder.getFromLocationName(addressName,3); //获取address更新经纬度 String result; Iterator iterateAddr; if (addressesFromAddrName.size() > 0) { iterateAddr = addressesFromAddrName.iterator(); addr = (Address) iterateAddr.next();//取第一个地址 lat = addr.getLatitude(); lng = addr.getLongitude(); result="可用否:"+geoIsEnable+";"+addressName+"共找到:"+addressesFromAddrName.size() +"个"; }else if(addressesFromLngLat.size()>0){ iterateAddr = addressesFromLngLat.iterator(); addr = (Address) iterateAddr.next();//取第一个地址 result="您现在位于:"+addr.getFeatureName(); }else{ result="什么都找不到"; } Bundle bundle=new Bundle(); bundle.putString("result", result); Message msg=new Message(); msg.setData(bundle); myHandler.sendMessage(msg);//将带有bundle的信息发给主线程来修改界面 } catch (Exception e) { System.out.println(e+"次界面"); } } } class MyHandler extends Handler { @Override public void handleMessage(Message msg) { Bundle bundle=msg.getData(); resultText.setText(bundle.getString("result")); webLoad(); proDialog.dismiss(); //关闭进度框 super.handleMessage(msg); } } public void webLoad(){ //根据URL从百度服务器下载地图(zoom:地图级别,scale:高清地图) String url = "http://api.map.baidu.com/staticimage?center=" + lng + "," + lat + "&width=" + webView.getWidth() + "&height=" + webView.getHeight() + "&zoom=12&scale=2"; webView.loadUrl(url);//显示webView(在android4.4之后所有的webView方法必须在同一个线程) }}
注意MapActicity中用来显示地图的控件是WebWiew:
<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent" />
运行截图:
1 0
- android 用户定位和地图查询
- Android 定位和地图
- Android用户定位Google Map显示地图
- Android定位和地图开发
- android定位和地图开发
- arcgis for android 地图查询并定位
- arcgis10+地图查询定位
- 地图查询定位
- android地图系列之《android定位和地图开发实例 》
- Android——定位和地图
- Android地图和定位学习总结
- Android地图和定位学习总结
- android定位和地图开发实例
- android定位和地图开发实例
- android定位和地图开发实例
- Android地图和定位学习总结
- android定位和地图开发实例
- android定位和地图开发实例
- 碍于近期换设备比较频繁,简单总结一下cocoapods环境的布置。
- redis sentinel(哨兵)配置解读
- VDHL VGA控制器设计实现显示器屏幕保护模块
- 哈工大(深圳)教务系统Python爬虫1.2
- 长按事件与点击事件的冲突
- android 用户定位和地图查询
- 检测apache配置文件是否正确的命令
- PBS数组作业
- redis sentinel(哨兵)配置解读
- JQuery在PC端实现手机触屏垂直滑动效果
- 量子通信
- 负载均衡器技术Nginx和F5的优缺点对比
- Unity 关于Spine不规则响应区域解决方法
- (1)会计总论&会计要素