无法获得Android应用的位置权限

时间:2016-07-01 09:41:28

标签: android permissions gps location

我的清单中有以下内容:

<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。

6 个答案:

答案 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,我们必须获得用户的运行时权限,仅在清单中声明权限是不够的。

Check my this post.

答案 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中的答案。