Android 6.0位置权限

Android 6.0位置权限,android,android-permissions,android-6.0-marshmallow,Android,Android Permissions,Android 6.0 Marshmallow,我正在尝试实现位置的运行时权限。实施情况如下: public class MyLocationManager implements android.location.LocationListener, ActivityCompat.OnRequestPermissionsResultCallback { private static LocationManager m_locationManager; private static final int REQUEST_COARS

我正在尝试实现位置的运行时权限。实施情况如下:

public class MyLocationManager implements android.location.LocationListener, ActivityCompat.OnRequestPermissionsResultCallback {

    private static LocationManager m_locationManager;
    private static final int REQUEST_COARSE_LOCATION = 999;
    private static final int REQUEST_FINE_LOCATION = 998;

    private String provider; 
    private Context mContext;

    public void startListenLocation(Context context) {

        this.mContext = context;
        m_locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);

        ...

        if (Build.VERSION.SDK_INT >= 23 && ((ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION)) != PackageManager.PERMISSION_GRANTED)) {
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION) ;
        } else {
            Location location = m_locationManager.getLastKnownLocation(provider);
        }

        ...
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_COARSE_LOCATION: {

                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //compiler error on the following line
                    Location myLocation = m_locationManager.getLastKnownLocation(provider);
                } else {
                    //Permission denied
                }
                return;
           }
        }
    }
}

在调用
onRequestPermissionResult()
中的
getLastKnownLocation()
时出现语法错误。它告诉我再次检查权限,即使我已经这样做了。因此,有人能告诉我这里的实现有什么问题吗

方法
getLastKnownLocation
被注释为:

@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
因此,您会收到警告:

调用需要用户可能拒绝的权限:代码应显式检查权限是否可用(使用checkPermission)或显式处理潜在的SecurityException

有两个选项可以避免警告:

  • 在调用之前添加注释
    getLastKnownLocation

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_COARSE_LOCATION: 
            {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //noinspection ResourceType
                    Location myLocation = m_locationManager.getLastKnownLocation(provider);
                } else {
                    //Permission denied
                }
                return;
            }
        }
    }
    
  • 重构代码,添加方法
    GetLastKnownLocationFallowed

    public void startListenLocation(Context context) {
    
        this.mContext = context;
        m_locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
    
        if (!getLastKnownLocationIfAllowed())
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);
    }
    
    private boolean getLastKnownLocationIfAllowed() {
        if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            Location location = m_locationManager.getLastKnownLocation(provider);
            return true;
        }
    
        return false;
    }
    
    在您的活动中:

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_COARSE_LOCATION: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    myLocationManager.getLastKnownLocationIfAllowed();
                } else {
                    //Permission denied
                }
                return;
            }
        }
    }
    

  • 将此方法添加到您的活动中并使用

        public  boolean isStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION)
                    == PackageManager.PERMISSION_GRANTED) {return true;
            } else {
    
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
                return false;
            }
        }
        else { //permission is automatically granted on sdk<23 upon installation
            flag=true;
            return true;
        }
    }
    
    public boolean isstoragepermissiongrated(){
    如果(Build.VERSION.SDK_INT>=23){
    if(checkSelfPermission(Manifest.permission.ACCESS\u FINE\u位置)
    ==PackageManager.PERMISSION_grated){返回true;
    }否则{
    ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},1);
    返回false;
    }
    }
    else{//在sdk上自动授予权限