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

Android Studio集成我的位置按钮遇权限问题:Google Maps API调用需权限

解决Android中调用setMyLocationEnabled(true)的权限问题

这个问题我之前开发地图功能时也碰到过,核心原因是从Android 6.0(API 23)开始,位置权限属于「危险权限」,这类权限不能只在Manifest文件里声明就直接使用,必须在运行时向用户主动申请,获得授权后才能调用相关API,否则就会触发你看到的SecurityException提示。

下面是完整的解决步骤:

1. 先在Manifest中声明必要的权限

打开AndroidManifest.xml,添加以下权限声明(根据你的需求选择精确/粗略位置,Android 10+如果需要后台位置还要加第三个):

<!-- 获取精确位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 获取粗略位置权限(可选,若不需要精确位置可只保留这个) -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Android 10及以上,需要后台位置权限的话添加 -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

2. 在Activity中处理权限申请逻辑

假设你的Activity实现了OnMapReadyCallback接口,在地图初始化完成后,先检查权限再启用我的位置功能:

首先定义一个权限请求的标识码:

private static final int LOCATION_PERMISSION_REQUEST_CODE = 100;

然后在onMapReady方法中添加权限检查:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    // 检查是否已经获得位置权限
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        // 权限已授权,直接启用我的位置按钮
        mMap.setMyLocationEnabled(true);
    } else {
        // 权限未授权,向用户发起权限申请
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                LOCATION_PERMISSION_REQUEST_CODE);
    }
}

3. 处理权限申请的回调结果

重写Activity的onRequestPermissionsResult方法,根据用户的授权结果做对应处理:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    
    // 判断是否是我们发起的位置权限请求
    if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户同意授权,再次检查权限后启用我的位置
            if (mMap != null && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {
                mMap.setMyLocationEnabled(true);
            }
        } else {
            // 用户拒绝授权,这里可以给用户提示,甚至引导去设置开启权限
            handlePermissionDenied();
        }
    }
}

4. 优化拒绝授权后的处理(可选但推荐)

如果用户拒绝权限,尤其是勾选了「不再询问」,可以添加友好的引导逻辑:

private void handlePermissionDenied() {
    // 判断是否需要向用户解释为什么需要这个权限
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
        // 弹出对话框解释权限用途,然后再次发起申请
        new AlertDialog.Builder(this)
                .setTitle("需要位置权限")
                .setMessage("启用我的位置功能需要获取您的位置权限,请点击确定授权")
                .setPositiveButton("确定", (dialog, which) -> {
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                            LOCATION_PERMISSION_REQUEST_CODE);
                })
                .setNegativeButton("取消", null)
                .show();
    } else {
        // 用户勾选了「不再询问」,引导用户到应用设置页面开启权限
        Toast.makeText(this, "权限已被拒绝,请在应用设置中开启位置权限", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        Uri uri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(uri);
        startActivity(intent);
    }
}

最后别忘了导入必要的包

确保你的Activity中导入了这些类:

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.widget.Toast;

这样处理后,就能合规地启用我的位置按钮,同时避免权限相关的异常啦~

内容的提问来源于stack exchange,提问作者Auhuur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:02:08