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()
将不会被调用。
通过这样做,您将仅在授予权限的情况下请求位置更新。
在我的示例应用程序中,我正在从用户那里获取位置,并且我正在使用 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()
将不会被调用。
通过这样做,您将仅在授予权限的情况下请求位置更新。