Android(安卓)10 定位问题,获取NMEA(支持5.0~10.0)
16lz
2021-12-07
兼容 Android 5.0 ~ Android 10.0 的定位方法
- 编译版本设置为 24 ~ 28 之间
android { compileSdkVersion 28 defaultConfig { applicationId "com.xd.gps" minSdkVersion 21 // 目标sdk版本<29,文件读写在Android10上可正常使用; // 目标sdk版本=29,若覆盖安装(目标sdk版本从<29升到29),则Android10上可正常读写; // 若卸载后再安装,则Android10上不能读写,需要使用存储访问框架; targetSdkVersion 28 versionCode 1 versionName "1.0" }}
- AndroidManifest.xml 中添加定位权限
- 使用 easypermissions 请求定位权限
/** * Android 10及以上申请权限 */private String[] permissionsQ = new String[] { // 定位权限 Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, // 编译版本小于29,不能使用Manifest.permission.ACCESS_BACKGROUND_LOCATION "android.permission.ACCESS_BACKGROUND_LOCATION",};/** * Android10以下申请权限 */private String[] permissionsO = new String[] { // 定位权限 Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,};
onCreate 中添加:
String[] permissions = permissionsO;// 编译版本小于29,不能使用Build.VERSION_CODES.Qif (Build.VERSION.SDK_INT >= 29) { permissions = permissionsQ;}if (EasyPermissions.hasPermissions(this, permissions)) { onPermissionsGranted(REQUEST_CODE_PERMISSION, null);} else { EasyPermissions.requestPermissions(this, "请允许软件获取位置及读写权限,否则将无法正常运行!", REQUEST_CODE_PERMISSION, permissions);}
实现EasyPermissions.PermissionCallbacks
的接口:
@Overridepublic void onPermissionsGranted(int requestCode, @NonNull List perms) { requestLocation();}@Overridepublic void onPermissionsDenied(int requestCode, @NonNull List perms) { Toast.makeText(this, "没有获取到权限,软件将退出!", Toast.LENGTH_LONG).show(); finish();}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (EasyPermissions.hasPermissions(this, permissions)) { onPermissionsGranted(REQUEST_CODE_PERMISSION, null); } else { onPermissionsDenied(requestCode, null); }}
- 分别使用
GpsStatus.NmeaListener
和OnNmeaMessageListener
监听NMEA
private void requestLocation() { locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); // 注册位置服务,获取系统位置 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener); // 监听NMEA if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (nmeaListener == null) { nmeaListener = new OnNmeaMessageListener() { @Override public void onNmeaMessage(String nmea, long l) { receivedNmea(nmea); } }; } locationManager.addNmeaListener(nmeaListener); } else { if (nmeaListenerOld == null) { nmeaListenerOld = new GpsStatus.NmeaListener() { @Override public void onNmeaReceived(long l, String nmea) { receivedNmea(nmea); } }; } locationManager.addNmeaListener(nmeaListenerOld); }}
Android 10 在后台运行时访问设备位置信息需要权限
Android 10 中的隐私权变更
在后台运行时访问设备位置信息需要权限 为了让用户更好地控制应用对位置信息的访问权限,Android 10 引入了 ACCESS_BACKGROUND_LOCATION 权限。
与 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION
权限不同,ACCESS_BACKGROUND_LOCATION 权限仅会影响应用在后台运行时对位置信息的访问权限。
更多相关文章
- Android(安卓)版本兼容 — Android(安卓)6.0 和 7.0后获取Mac地
- android Dialog大小修改
- Android(安卓)给 app默认权限(不弹窗申请权限)
- android用户界面-组件Widget-地图视图MapView
- Android中GPS定位的简单应用
- android 定位服务
- linearLayout 和 relativeLayout的属性区别
- 安卓(android)使用GPS,获取经纬度
- Android(安卓)MapView 申请apiKey