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
相关产品推荐
相关产品推荐

