首页 > 解决方案 > Android - 我的应用程序可以在打开谷歌地图之前获取位置信息,尽管它具有相关权限

问题描述

我是 Android 开发的新手。所以我的问题可能太基本了。非常遗憾。现在我正在维护以前编写的代码。

此应用程序使用手机的定位服务。在清单文件中写着:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

但是虽然用户允许使用位置服务,但在大多数情况下,应用程序无法直接获取位置。

例如,虽然我的应用程序无法获取位置信息,但打开 Google 地图应用程序后,我的应用程序始终可以获取位置信息。然后我对位置没有问题。但首先我必须用谷歌地图触发。

什么可能导致这种情况?为什么我的应用打开谷歌地图后可以获取位置信息?我的清单文件中是否需要其他权限?

我的代码块如下所示,

private static final int LOCATION_SERVICES_RESOLUTION_REQUEST = 9001;

private void initMainActivity() {

        int fineAccessGranted = ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_FINE_LOCATION);
        int coarseAccessGranted = ContextCompat.checkSelfPermission(this,
                Manifest.permission.ACCESS_COARSE_LOCATION);
        int externalWrite = ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int externalRead = ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE);
        int camera = ContextCompat.checkSelfPermission(this,
                Manifest.permission.CAMERA);

        ArrayList<String> permissionsNeeded = new ArrayList<String>();

        if (fineAccessGranted == PackageManager.PERMISSION_DENIED)
            permissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
        if (coarseAccessGranted == PackageManager.PERMISSION_DENIED)
            permissionsNeeded.add(Manifest.permission.ACCESS_COARSE_LOCATION);
        if (externalWrite == PackageManager.PERMISSION_DENIED)
            permissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (externalRead == PackageManager.PERMISSION_DENIED)
            permissionsNeeded.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        if (camera == PackageManager.PERMISSION_DENIED)
            permissionsNeeded.add(Manifest.permission.CAMERA);

        if (permissionsNeeded.size() == 0) {
            this.initMainActivityAfterPermissions();
        } else {
            ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new String[0]), LOCATION_SERVICES_RESOLUTION_REQUEST);
        }
    }


public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        // super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case LOCATION_SERVICES_RESOLUTION_REQUEST: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    this.initMainActivityAfterPermissions();

                } else {

                }
                return;
            }

获取位置的代码片段;

result =  LocationServices.FusedLocationApi.getLastLocation(instance.mGoogleApiClient);

标签: androidandroid-manifest

解决方案


基本上这意味着您尝试通过检索位置mFusedLocationClient.getLastLocation()并且此时设备上没有位置。所以你需要请求位置更新,比如mFusedLocationClient.requestLocationUpdates. 此链接将很有用https://developer.android.com/training/location/receive-location-updates?hl=eshttps://github.com/googlesamples/android-play-location


推荐阅读