Android(安卓)GPS使用
16lz
2021-01-24
Android中的LocationManager提供了一系列方法来处理地理位置相关的问题
通过getLastKnownLocation(String provider)以及requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)方法可以获取到当前位置
此类提供两种定位方式:GPS定位和网络定位(基站+WIFI)
GPS定位的provider是LocationManager.GPS_PROVIDER, 网络定位则是LocationManager.NETWORK_PROVIDER
这里使用的是GPS定位
流程:一.对LocationManager以及Criteria进行初始化二.获取系统定位服务,并通过Criteria得到相应的provider三.获取UI相应控件,并设置按键监听事件四.做locationListener监听事件五.得到定位信息location,通过location得到位置信息 经度,纬度六.请求位置信息的更新(在监听事件最后,在init方法里面,在Activity的onResume方法里面都要做(原因下面/**/有说))七.页面退出时,要做资源释放onDestroy()
代码:
public class MainActivity extends Activity implements View.OnClickListener { private Button btnGetLocation; //这里因为在Oncreate调用了init(),直接获取了,所以这里按键没用 private TextView tvLocation; //使用默认的布局页面里面的TextView private LocationManager locationManager; //location管理 private LocationListener locationListener; //location监听 private String provider; //提供者 private Location location = null; //这个是用来得到 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找到相应控件,并设置按键触发事件 btnGetLocation = (Button) findViewById(R.id.btn_getLocation); btnGetLocation.setOnClickListener(this); tvLocation = (TextView) findViewById(R.id.tv_location); init(); //初始化的方法 } //初始化方法 private void init() { Criteria criteria = new Criteria(); //Criteria用来设置定位配置 criteria.setAccuracy(Criteria.ACCURACY_FINE); //设置为最大精度 criteria.setAltitudeRequired(false); //不要求海拔信息 criteria.setBearingRequired(false); //不要求方位信息 criteria.setCostAllowed(true); //是否允许付费 criteria.setPowerRequirement(Criteria.POWER_LOW); //对电量的要求 String serviceName = Context.LOCATION_SERVICE; //定位服务 //获取系统的定位服务 locationManager = (LocationManager) getSystemService(serviceName); provider = locationManager.getBestProvider(criteria,true); //得到相应的提供者 /** 为什么要做多次locationManager.requestLocationUpdates(provider,1000,5,locationListener); * 这里一定要对LocationManager进行重新设置监听(在Activity的onResume方法里面) * locationManager获取provider的过程不是一次就能成功的 * locationManager.getLastKnownLocation很可能返回null * 如果只在initProvider()中注册一次监听则基本很难成功 */ if (provider!=null){ /* while(location==null) { locationManager.requestLocationUpdates(provider, 1000, 5, locationListener); }*/ //得到定位信息location locationManager.requestLocationUpdates() 会返回一个当前的location(其实返回的时候已经是之前的了,在调用此方法的时候才是最新的) updateNewLocation(locationManager.requestLocationUpdates(provider, 1000, 5, locationListener)); listener(); //更新位置 locationManager.requestLocationUpdates(provider,1000,5,locationListener); } } private void updateNewLocation(Location location) { if(location!=null){ //处理得到的信息 double la = location.getLatitude(); double ln = location.getLongitude(); String show = "当前的位置信息是: 纬度:"+la+",经度:"+ln; tvLocation.setText(show); } } //做locationListener监听事件 private void listener(){ locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { //在当前位置发送改变后被调用 updateNewLocation(location); } /** * * @param s 与变化相关的location provider名称 * @param i 状态,如果服务已经停止,并且短时间内不会改变,状态码为:OUT_OF_SERVICE * 如果服务暂时停止,并且在短时间内会恢复,状态码为:TEMPPROARILY_UNAVAILABLE * 如果服务正常有效,状态码为:AVALILABLE * @param bundle 一组可选的参数 */ @Override public void onStatusChanged(String s, int i, Bundle bundle) { //provider的状态在可用,暂时不可用和无服务三个状态下直接切换时被调用 } //在Provider被用户开启后调用(这里的开启说的是gps) @Override public void onProviderEnabled(String s) { } //在Provider被用户关闭后调用(这里的关闭说的是gps) //如果一个已经被关闭了的Provider调用requestLocationUpdates方法,那么这个方法就会被调用 @Override public void onProviderDisabled(String s) { } }; locationManager.requestLocationUpdates(provider,6000,1,locationListener); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn_getLocation: listener(); break; default: break; } } @Override protected void onDestroy() { locationManager.removeUpdates(locationListener); locationManager.setTestProviderEnabled(provider,false); super.onDestroy(); } //页面启动后一直做locationManager获取provider 位置更新 @Override protected void onResume() { super.onResume(); locationManager.requestLocationUpdates(provider,6000,1,locationListener); } @Override protected void onPause() { super.onPause(); locationManager.removeUpdates(locationListener); }}
AndroidManifest文件里添加权限:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"></uses-permission><uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> //这一个权限定义后会报错,系统默认处理是去到debug文件里面(默认处理就行了)
总结:GPS遇到的问题点,主要就是locationManager.requestLocationUpdates返回location为null,经过debug后知道,是需要经过多次刷新才会得到
(这里的GPS只是做基本,实际开发中的话,还是使用第三方提供的API地图,比如百度地图,德高地图,都有详细的开发文档!!!而且功能强大.)
更多相关文章
- Android(安卓)java.lang.SecurityException: Failed to find pro
- Android(安卓)- 使用AIDL设计远程接口
- Android(安卓)NDK 错误解决方法(持续更新ing)
- Android(安卓)获取包名,版本信息及VersionName名称
- 安卓复选框(Checkbox)
- Android(安卓)Intent参数传递
- Android(安卓)javah -jni 找不到类的解决方法
- android p状态栏,插入sim卡,关闭数据流量,状态栏卡图标右下角有X图标
- Ubuntu下安装Android(安卓)NDK