【问题标题】:Adding location permissions on marshmallow在棉花糖上添加位置权限
【发布时间】:2016-10-24 17:12:49
【问题描述】:

我正在编写代码以从位置管理器获取 lastknownlocation,这提示我添加运行时权限。

这是我的代码:

public class MainActivity extends AppCompatActivity implements LocationListener {

    LocationManager locationManager;
    String provider;
    private final int MY_PERMISSIONS_REQUEST_CODE=1;
    Location location;
    Boolean isPermissionGranted=false;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        provider = locationManager.getBestProvider(new Criteria(), false);


       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
               requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION},MY_PERMISSIONS_REQUEST_CODE);
           }

          // return;
        }

    }

    public void getlastknownposition()
    {

    }

    @Override
    public void onLocationChanged(Location location) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);


        if(requestCode == MY_PERMISSIONS_REQUEST_CODE)
        {
            if(grantResults[0]==PackageManager.PERMISSION_GRANTED && grantResults[1]==PackageManager.PERMISSION_GRANTED){

            Toast.makeText(MainActivity.this," granted "+grantResults[0]+"granted2"+grantResults[1], Toast.LENGTH_SHORT).show();


            location = locationManager.getLastKnownLocation(provider);}

        }

    }

}

我仍然收到错误“调用需要权限,可能会被用户拒绝:代码应明确检查权限是否可用(使用checkPermission)或明确处理潜在的SecurityExceptiononRequestPermissionsResult在线location = locationManager.getLastKnownLocation(provider);

【问题讨论】:

  • 您是否尝试过用if (ActivityCompat.checkSelfPermission 包装该行...必须检查。您也可以将该行包含在 try/catch 中 - 再次,错误是明确的..您需要捕捉潜在的 SecurityException
  • 你应该把requestPermissions改成ActivityCompat.requestPermissions
  • 试试这个可能有用stackoverflow.com/a/41221852/5488468

标签: android android-6.0-marshmallow android-permissions locationmanager runtime-permissions


【解决方案1】:

如果在 onPermissionsResult =) 中,在第二个周围加上一些大括号

if(requestCode == MY_PERMISSIONS_REQUEST_CODE){
        if(grantResults[0]==PackageManager.PERMISSION_GRANTED && grantResults[1]==PackageManager.PERMISSION_GRANTED){
             Toast.makeText(MainActivity.this," granted "+grantResults[0]+"granted2"+grantResults[1], Toast.LENGTH_SHORT).show();

             location = locationManager.getLastKnownLocation(provider);
        } else {
              //TODO handle user saying NO! :)
        }
    }

提示:如果您请求 FINE_LOCATION,则不需要 COARSE,它已经包含它。

【讨论】:

  • 按照评论中的建议用 try/catch 包围它,然后我检查了我拥有的一些项目,我实际上正在调用一个方法,并且该方法可能会引发安全异常。我想不出任何其他解决方法。
【解决方案2】:

换行

location = locationManager.getLastKnownLocation(provider);

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
{
    location = locationManager.getLastKnownLocation(provider);
}

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多