我的清单中有以下内容:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
我还在手机的设置中设置了位置权限。
是的,手机已启用GPS。
在这里,我检查了许可:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
int hasLocationPermission = mContext.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
Log.d(TAG, "location permission: " + hasLocationPermission); // 0
if (hasLocationPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
hasLocationPermission = mContext.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
Log.d(TAG, "location permission: " + hasLocationPermission); // still 0
}
如果我在我的清单和手机的应用设置中获得了许可,为什么它仍然阻止我访问该位置?由于这个原因,纬度和经度都返回0.0。
答案 0 :(得分:1)
声明您使用Oncreate或其他人的位置
if (Build.VERSION.SDK_INT >= 23){
if (checkPermission(Manifest.permission.ACCESS_FINE_LOCATION,getApplicationContext(),this)) {
//You fetch the Location here
//code to use the
}
else
{
requestPermission(Manifest.permission.ACCESS_FINE_LOCATION,PERMISSION_REQUEST_CODE_LOCATION,getApplicationContext(),this);
}
}
同样在课堂上声明
public static void requestPermission(String strPermission,int perCode,Context _c,Activity _a){
if (ActivityCompat.shouldShowRequestPermissionRationale(_a,strPermission)){
Toast.makeText(getApplicationContext(),"GPS permission allows us to access location data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(_a,new String[]{strPermission},perCode);
}
}
public static boolean checkPermission(String strPermission,Context _c,Activity _a){
int result = ContextCompat.checkSelfPermission(_c, strPermission);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE_LOCATION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
fetchLocationData();
} else {
Toast.makeText(getApplicationContext(),"Permission Denied, You cannot access location data.",Toast.LENGTH_LONG).show();
}
break;
}
}
对于其他较低级设备,您应在声明
时提供权限答案 1 :(得分:0)
添加此权限并检查一次
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
答案 2 :(得分:0)
对于Android 6.0,我们必须获得用户的运行时权限,仅在清单中声明权限是不够的。
答案 3 :(得分:0)
您正在混合检查权限的方法。
有一次,你打电话:
int hasLocationPermission = mContext.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
下一次:
ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
确保第一行是:
int hasLocationPermission = ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION);
您的活动来自AppCompatActivity。
答案 4 :(得分:0)
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
答案 5 :(得分:-1)
使用Activity
中的非静态requestPermissions,不要使用ActivityCompat
中的静态版本。 ActivityCompat.requestPermissions
在我之前的项目中也不起作用,我也不知道为什么。
我找到了检查和请求权限的好方法。请参阅this post中的答案。