Android 6.0中的Android运行时权限(API级别23)最佳做法
我已使用
成功为我的应用添加了运行时权限这些参考
http://developer.android.com/training/permissions/requesting.html
和
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html
这是我用过的代码
private static final int PERMISSION_REQUEST_CODE = 1;
switch (id){
case R.id.check_permission:
if (checkPermission()) {
Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show();
} else {
Snackbar.make(view,"Please request permission.",Snackbar.LENGTH_LONG).show();
}
break;
case R.id.request_permission:
if (!checkPermission()) {
requestPermission();
} else {
Snackbar.make(view,"Permission already granted.",Snackbar.LENGTH_LONG).show();
}
break;
}
private boolean checkPermission(){
int result = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
if (result == PackageManager.PERMISSION_GRANTED){
return true;
} else {
return false;
}
}
private void requestPermission(){
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,Manifest.permission.ACCESS_FINE_LOCATION)){
Toast.makeText(context,"GPS permission allows us to access location data. Please allow in App Settings for additional functionality.",Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Snackbar.make(view,"Permission Granted, Now you can access location data.",Snackbar.LENGTH_LONG).show();
} else {
Snackbar.make(view,"Permission Denied, You cannot access location data.",Snackbar.LENGTH_LONG).show();
}
break;
}
}
android
提供的最佳做法http://developer.android.com/training/permissions/best-practices.html
说明以下
1)考虑使用意图
2)只询问你需要的权限
3)不要压倒用户
4)解释你为什么需要权限
现在,按照上述内容,我们仅在需要时才会询问权限,并且仅针对该活动所需的特定权限
然而这些最佳做法并未说明许可的频率,即说明需要显示这些权限的次数,还是只能显示一次
现在我面临的问题是
1)每次在应用程序中调用活动时,弹出权限,这些都发生在应用程序使用的特定会话中(如果在同一会话期间调用相同的活动,则在授予权限后不会调用该权限)< / p>
2)我们是否可以存储已授予的权限(即以共享首选项执行第一次检查的静态变量,以便不再一次调用权限)
3)我们是否需要在每次使用应用时调用权限访问
4)如果不允许共享首选项,我们如何更优雅地管理这些权限
答案 0 :(得分:5)
1)您引用的文档说:
如果您的应用需要危险许可,则必须检查是否存在 每次执行需要的操作时都拥有该权限 那个许可。用户总是可以自由撤销权限,因此 即使应用程序昨天使用了相机,它也不能认为它仍然存在 今天有这个许可。
这就是你每次都要求它的原因。
2)您无法存储权限。 Android决定记住授予权限的时间。
3)是的,这就是上面引用的内容。
4)你让Android管理权限。除了在需要时检查或请求,否则您自己不做任何事情。