请求权限无限循环



我从 https://github.com/googlemaps/android-samples/tree/master/tutorials/CurrentPlaceDetailsOnMap 下载了示例源代码。

它在第一次运行时崩溃,这是由两个函数之间的无限循环引起的:

private void updateLocationUI() {
        if (mMap == null) {
            return;
        }
        /*
         * Request location permission, so that we can get the location of the
         * device. The result of the permission request is handled by a callback,
         * onRequestPermissionsResult.
         */
        if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                android.Manifest.permission.ACCESS_FINE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mLocationPermissionGranted = true;
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        }
        if (mLocationPermissionGranted) {
            mMap.setMyLocationEnabled(true);
            mMap.getUiSettings().setMyLocationButtonEnabled(true);
        } else {
            mMap.setMyLocationEnabled(false);
            mMap.getUiSettings().setMyLocationButtonEnabled(false);
            mLastKnownLocation = null;
        }
    }

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

并在模拟器上运行它:api lvl25,Androd 7.1.1

日志:

03-22 23:34:18.249 24660-24660/com.example.mypc.mapdemo W/Activity: Can reqeust only one set of permissions at a time
03-22 23:34:19.759 24660-24660/com.example.mypc.mapdemo W/Activity: Can reqeust only one set of permissions at a time
03-22 23:34:20.501 24660-24660/com.example.mypc.mapdemo W/Activity: Can reqeust only one set of permissions at a time
03-22 23:34:20.894 24660-24660/com.example.mypc.mapdemo W/Activity: Can reqeust only one set of permissions at a time

崩溃日志:

E/AndroidRuntime:     at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
                                                       at com.example.mypc.mapdemo.MainActivity.updateLocationUI(MainActivity.java:330)
                                                       at com.example.mypc.mapdemo.MainActivity.onRequestPermissionsResult(MainActivity.java:207)
                                                       at android.app.Activity.requestPermissions(Activity.java:4116)
                                                       at android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:49)
                                                       at android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:37
```2)

问题:我该如何解决?

if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        mLocationPermissionGranted = true;
    } else {
        ActivityCompat.requestPermissions(this,
                new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION},
                PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
    }
@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String permissions[],
                                       @NonNull int[] grantResults) {
    mLocationPermissionGranted = false;
    switch (requestCode) {
        case PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                mLocationPermissionGranted = true;
                updateLocationUI();
            }else{
        mLocationPermissionGranted = true;
        mMap.setMyLocationEnabled(false);
        mMap.getUiSettings().setMyLocationButtonEnabled(false);
        mLastKnownLocation = null;
           }
        }
        break;
    }
}

使用以下代码:

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

我遇到了同样的问题,在多次重写 onRequestPermissionsResult 的编码方式后,我发现该问题已修复,并添加:

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

除此之外:

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

在AndroidManifest.xml

祝你好运!

最新更新