Android开发:使用ContextCompat.checkSelfPermission()无法访问位置权限
解决Manifest.permission找不到ACCESS_FINE_LOCATION的问题
问题根源
你碰到的问题主要有两点:
- 未导入
android.Manifest类,导致无法访问Manifest.permission下的权限常量 - 代码中的
if语句存在语法错误,括号未闭合
修复步骤
1. 添加Manifest类的导入
在MainActivity的import区域补充一行:
import android.Manifest;
2. 修正语法错误并补全权限检查逻辑
把出错的if语句替换为完整的权限判断代码,示例如下:
// 检查精确定位权限是否已授予 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // 权限已获取,执行定位操作 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } else { // 未获取权限,发起权限申请 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1001); }
注意:使用ActivityCompat.requestPermissions时,还需要导入androidx.core.app.ActivityCompat和android.content.pm.PackageManager两个类。
修正后的完整MainActivity代码
import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.core.location.LocationListenerCompat; import android.Manifest; import android.content.Context; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final int LOCATION_PERMISSION_REQUEST_CODE = 1001; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(@NonNull Location location) { Log.i("Location", location.toString()); } }; // 检查精确定位权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { // 权限已授予,请求位置更新 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } else { // 同时申请精确定位和粗略定位权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); } } // 处理权限申请结果 @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) { // 用户同意权限,重新发起定位请求 LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(@NonNull Location location) { Log.i("Location", location.toString()); } }; if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); } } else { // 用户拒绝权限,可添加提示或后续处理逻辑 Log.i("Permission", "定位权限被拒绝"); } } } }
额外提醒
- 若APP目标版本为Android 12(API 31)及以上,且需要后台定位功能,需在Manifest中添加
ACCESS_BACKGROUND_LOCATION权限,并在代码中一并申请 - 每次发起位置更新请求前,务必先检查权限状态,避免程序崩溃
内容的提问来源于stack exchange,提问作者Allen J Mathew
相关产品推荐
相关产品推荐

