android - 使用 LocationManager 时请求权限

标签 android permissions locationmanager

我刚刚开始进行 Android 编程,到目前为止,我只是对按钮、 TextView 和一些 Activity 做了一些改动,但我想从服务和 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 Marshmallow,即使您已在 Manifest 文件中指定了这些权限,您也必须显式请求用户的权限。 因此,您必须通过以下方式请求位置权限: 首先,您创建一个位置请求代码

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

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

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);
        }

上面的代码应该在请求任何位置之前编写,最好是在 Activity 的 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 或同时请求两者。这取决于您的要求。

关于android - 使用 LocationManager 时请求权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35856432/

相关文章:

java - 当我更改 Activity 时不要停止计时器

android - "com.android.vending.BILLING"和 "android.permission.BILLING"之间的区别

java - 如何使用java检查24H是否已经过去?

mysql - 授予 MySQL 中各个字段的权限

android - GET_TASKS 权限已弃用

C - 阻止其他人写入文件

android - onLocationChanged 不适用于真实设备

android - 无效的 Firebase 路径 : . com。 Firebase 路径不得包含 '.' 、 '#' 、 '$' 、 '[' 或 ']'

Android-相同的 GPS 位置重复而不更新

Android - 仅使用 GPS 提供商获取位置坐标时出现问题