兼容 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.NmeaListenerOnNmeaMessageListener监听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 权限仅会影响应用在后台运行时对位置信息的访问权限。

更多相关文章

  1. Android(安卓)版本兼容 — Android(安卓)6.0 和 7.0后获取Mac地
  2. android Dialog大小修改
  3. Android(安卓)给 app默认权限(不弹窗申请权限)
  4. android用户界面-组件Widget-地图视图MapView
  5. Android中GPS定位的简单应用
  6. android 定位服务
  7. linearLayout 和 relativeLayout的属性区别
  8. 安卓(android)使用GPS,获取经纬度
  9. Android(安卓)MapView 申请apiKey

随机推荐

  1. pip常用命令、配置pip源
  2. Scala vs Python的Spark性能
  3. 基于协程的爬虫
  4. 从字典中创建NumPy数组的最佳方法是什么?
  5. 如何使用未受标头影响的python导入csv文
  6. c++与python关于二维数组的数据传递问题,
  7. 模拟登录QQ空间
  8. excel表中没有数据
  9. 如何因Django不活动而终止会话?
  10. CentOS6的python2.6升级到python2.7以上