You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Activity启动时如何申请位置权限 未授权则关闭页面

Android 位置权限申请逻辑修改方案

核心实现逻辑

Android 系统中,我们可以通过ActivityCompat.shouldShowRequestPermissionRationale()方法判断权限的被拒绝状态,以此实现你的需求:

  1. Activity启动时先判断是否已经获得位置权限,已获得就直接走后续获取位置流程
  2. 未获得权限时,判断是否可以继续申请:
    • 可以申请(用户没有永久拒绝):弹出权限申请弹窗
    • 不可以申请(用户已经勾选「不再询问」永久拒绝):直接关闭Activity
  3. 权限申请结果回调中,如果用户拒绝授权,直接关闭当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:24:03