Android 多次 运行 位置时间权限

Android multiple run time permissions for location

在我的示例应用程序中,我正在从用户那里获取位置,并且我正在使用 Google Play Services 和 FusedLocationApi。我也在尝试为位置实现 运行 时间权限,我正在寻找最佳实践。我整天都在寻找它,我找到了这样的解决方案。我的 PermissionUtils class

中有这两种方法
public static void askPermissions(final Activity activity) {
    if (isRuntimePermissionRequired()) {
        if (ContextCompat.checkSelfPermission(activity, FINE_LOCATION) != GRANTED || ContextCompat.checkSelfPermission(activity, COARSE_LOCATION) != GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, FINE_LOCATION) || ActivityCompat.shouldShowRequestPermissionRationale(activity, COARSE_LOCATION)) {
                new AlertDialog.Builder(activity)
                        .setTitle("Permission required")
                        .setMessage("Location is required for this application to work ! ")
                        .setPositiveButton("Allow", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                ActivityCompat.requestPermissions(activity,
                                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                                        REQUEST_LOCATION);
                            }
                        })
                        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                                activity.finish();
                            }
                        })
                        .show();
            } else {
                if (getApplicationLaunchedFirstTime(activity)) {
                    setApplicationLaunchedFirstTime(activity);
                    ActivityCompat.requestPermissions(activity, PERMISSIONS_LOCATION, REQUEST_LOCATION);
                } else {
                    new AlertDialog.Builder(activity)
                            .setTitle("Permission Disabled")
                            .setMessage("Please enable the permission in \n  Settings>Uber>Permission \n and check 'location' permission")
                            .setPositiveButton("Go to settings", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    activity.startActivity(new Intent(Settings.ACTION_SETTINGS));
                                }

                            })
                            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                    activity.finish();
                                }
                            })
                            .show();
                }
            }
        }
    }
}

public static boolean isPermissionsGranted(Context context) {
    if (ActivityCompat.checkSelfPermission(context, FINE_LOCATION) == GRANTED && ActivityCompat.checkSelfPermission(context, COARSE_LOCATION) == GRANTED) {
        return true;
    }

    return false;
}

在我的Activity中,我在onConnected中使用这些方法如下

@Override
public void onConnected(Bundle bundle) {
    Log.i(TAG, "onConnected");
    if (PermissionUtils.isPermissionsGranted(this)) {
        try {
            Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            if (location == null) {
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            } else {
                handleNewLocation(location);
            }
        } catch (SecurityException ex) {
            Log.e(TAG, "SecurityException caught" + ex);
        }
    } else {
        PermissionUtils.askPermissions(this);
    }
}

但应用程序不断调用 onConnected,直到我授予允许权限。我做错了什么,在 Android 中实现权限的最佳做法是什么?任何帮助将不胜感激。

见,

什么时候调用onConnected()?当你打电话给 mGoogleApiClient.connect() 对吗?

所以只有在获得许可的情况下才调用它。因此,如果您的权限未被授予,onConnected() 将不会被调用。

通过这样做,您将仅在授予权限的情况下请求位置更新。