Android Activity启动时如何申请位置权限 未授权则关闭页面
Android 位置权限申请逻辑修改方案
核心实现逻辑
Android 系统中,我们可以通过ActivityCompat.shouldShowRequestPermissionRationale()方法判断权限的被拒绝状态,以此实现你的需求:
- Activity启动时先判断是否已经获得位置权限,已获得就直接走后续获取位置流程
- 未获得权限时,判断是否可以继续申请:
- 可以申请(用户没有永久拒绝):弹出权限申请弹窗
- 不可以申请(用户已经勾选「不再询问」永久拒绝):直接关闭Activity
- 权限申请结果回调中,如果用户拒绝授权,直接关闭当前Activity
代码修改部分
1. 修改getCurrentLocation()方法的权限判断分支
private void getCurrentLocation() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // 已有权限,原有逻辑不变 if (isGPSEnabled()) { LocationServices.getFusedLocationProviderClient(MainActivity.this) .requestLocationUpdates(locationRequest, new LocationCallback() { @Override public void onLocationResult(@NonNull LocationResult locationResult) { super.onLocationResult(locationResult); LocationServices.getFusedLocationProviderClient(MainActivity.this) .removeLocationUpdates(this); if (locationResult != null && locationResult.getLocations().size() > 0) { int index = locationResult.getLocations().size() - 1; double latitude = locationResult.getLocations().get(index).getLatitude(); double longitude = locationResult.getLocations().get(index).getLongitude(); myLocation = "Latitude: " + latitude + " Longitude: " + longitude; Toast.makeText(getApplicationContext(), myLocation, Toast.LENGTH_LONG).show(); // 此处添加你后续的业务逻辑 } } }, Looper.getMainLooper()); } else { turnOnGPS(); } } else { // 无权限,判断是否可以申请 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION) || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // 可以申请,发起权限请求 requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); } else { // 用户已经永久拒绝权限,关闭Activity Toast.makeText(this, "位置权限是应用必备权限,无法授予将退出当前页面", Toast.LENGTH_SHORT).show(); finish(); } } } else { // Android 6.0以下无需动态申请权限,直接走原有逻辑 if (isGPSEnabled()) { // 原有获取位置逻辑 } else { turnOnGPS(); } } }
2. 修改onRequestPermissionsResult()方法的拒绝分支
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (isGPSEnabled()) { getCurrentLocation(); } else { turnOnGPS(); } } else { // 用户拒绝权限,关闭Activity Toast.makeText(this, "未授予位置权限,将退出当前页面", Toast.LENGTH_SHORT).show(); finish(); } } }
额外优化点
如果用户是永久拒绝权限的情况,你也可以选择在关闭Activity前弹窗引导用户到应用设置页手动开启权限,适配部分误操作的用户场景。
内容的提问来源于stack exchange,提问作者Arslan
相关产品推荐
相关产品推荐

