【问题标题】:Asking for permissions while using LocationManager使用 LocationManager 时请求权限
【发布时间】:2016-03-07 23:49:42
【问题描述】:

我刚刚开始使用 Android 编程,到目前为止,我只是对按钮、文本视图和一些活动进行了一些处理,但我想从服务和 GPS 位置开始。为了稍微练习一下,我正在构建一个简单的应用程序,它只显示用户的坐标。 我用一些方法创建了自己的服务类,但是每当我尝试实现以下方法时,我的应用程序就会崩溃:

    @TargetApi(23)
public Location getLocation(){
    try{
        locationManager = (LocationManager)this.ctx.getSystemService(LOCATION_SERVICE);
        gpsActivado = locationManager.isProviderEnabled(locationManager.GPS_PROVIDER);
    }catch(Exception e){
        e.printStackTrace();
    }


    if(gpsActivado && (ctx.checkSelfPermission("ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED)){
        locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER
                ,1000*60
                ,2
                ,this);
        return locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);

    }else{
        return null;
    }

}

通过一些调试消息,我知道问题与权限检查有关。那有什么问题?您现在是否有任何其他方法来检查我是否具有所需的权限?出于某种原因,我不喜欢我正在使用的那个。

提前致谢:)

PS:我使用的是 API 16

【问题讨论】:

  • 您是否在清单中添加了android.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_COARSE_LOCATION 权限?

标签: android permissions locationmanager


【解决方案1】:

使用 Android Marshmallow,即使您已在 Manifest 文件中指定了权限,您也必须明确向用户请求权限。 因此,您必须以这种方式请求位置权限: 首先,您为位置创建一个请求代码

public static final int LOCATION_REQUEST_CODE = 1001; //Any number

然后检查是否已经授予权限,如果没有,则代码将请求权限,这将显示一个本机弹出窗口,要求拒绝/允许位置权限

if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQUEST_CODE);
        } else {
           locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER
            ,1000*60,2,this);
   Location location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);
        }

上述代码应在请求任何位置之前编写,最好在活动的onCreate() 中。然后根据用户在弹窗上的操作,你会得到一个回调,你可以根据你的要求执行。

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case LOCATION_REQUEST_CODE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED
                        && (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) {
                  locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER
            ,1000*60,2,this);
   Location location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);
                }
            }
        }
    }

此外,无论您在何处尝试获取位置,都应检查是否已将位置权限授予您的应用程序,然后再获取位置。

 if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                          locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER
            ,1000*60,2,this);
   Location location = locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);
                    }

您可以请求Manifest.permission.ACCESS_FINE_LOCATIONManifest.permission.ACCESS_COARSE_LOCATION 或两者。这取决于您的要求。

【讨论】:

  • 感谢您的回答Shadab,但我有一个问题。首先:您说我应该在 onCreate() 方法中检查权限(您的第一段代码),但我正在尝试创建一个干净的 GPS 服务类;因此,我想我应该在我的 GPSService 类中检查它。
  • 为了做到这一点,我做了以下事情: if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest .permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQUEST_CODE); permisosOK = 假; } 其他 { permisosOK = true; }
  • 那是放在我主要活动的 onCreate() 方法中的;可以想象,permisosOK 是一个公共变量,我稍后会使用它来检查它们在我的 GPS 类中是否正常: if(MainActivity.permisosOK) { locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER , 1000 * 60 , 2 , this);返回 locationManager.getLastKnownLocation(locationManager.GPS_PROVIDER);但是,它不起作用。感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2019-10-03
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多