如何在 android M 中处理运行时权限验证
how to handle runtime permission auth in android M
我想知道询问用户权限检查的最佳做法,以及如果用户拒绝特定权限访问时 运行 的代码。
此示例设置了 CONTACTS
权限的状态
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 1;
private static String[] PERMISSIONS_CONTACT = {Manifest.permission.READ_CONTACTS}
if (checkSelfPermission(PERMISSIONS_CONTACT)) {
Log.i(TAG,
"Contact permissions have already been granted. Displaying contact details.");
} else {
Log.i(TAG, "Contact permissions has NOT been granted. Requesting permission.");
requestPermissions(PERMISSIONS_CONTACT, PERMISSIONS_REQUEST_READ_CONTACTS);
}
…
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case PERMISSIONS_REQUEST_READ_CONTACTS: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! do the
// calendar task you need to do.
Log.d(TAG, "permission granted");
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Log.d(TAG, "permission denied");
}
return;
}
}
}
您可以关注link
http://www.applicoinc.com/blog/android-m-permissions-review/
一些提示:
- 在 Google Play 服务上调用操作之前始终检查权限,因为它们需要权限,但管理由您负责;
- 不要求授予权限:当您调用具有多个权限的请求权限时,系统不关心是否已经授予了一个或两个权限,该对话框会为所有权限显示!因此,只跟踪真正需要的权限。用户授予已经授予的权限可能很奇怪;
- 始终检查是否需要使用方法向用户显示原因
shouldShowRequestPermissionRationale()
您请求许可的原因可能不是很明显;
- 如果您正在后台检查权限,例如在服务中,请向用户发送通知,并允许它直接在应用详细信息系统中轻按 activity 授予权限。
看看here - 有一个流程图很好地解释了整个过程。
底线是,根据 Android 的文档,如果您没有许可,您应该始终检查并请求许可(Android 将自动 return DENIED如果用户说不再询问则回调),如果用户过去已经拒绝过一次但没有标记不再询问选项,则应显示一条短消息。
Dexter 是一个 Android 库,它简化了运行时请求权限的过程。
例如相机 运行 时间许可:
您必须将此代码放入相机按钮点击
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
givePerMissons();
} else {
openCamera();
}
public void givePerMissons() {
if ((Utils.checkPermission(MainActivity.this, Manifest.permission.CAMERA)) {
openCamera();
} else {
Utils.givePermisson(MainActivity.this, Manifest.permission.CAMERA, Utils.PERMISSOIN);
if (!Utils.permissionsList.isEmpty()) {
requestPermissions(Utils.permissionsList.toArray(new String[Utils.permissionsList.size()]), Utils.PERMISSOIN_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case Utils.PERMISSOIN_CODE: {
if ((Utils.checkPermission(MainActivity.this, Manifest.permission.CAMERA)) {
openCamera();
} else {
Toast.makeText(getApplicationContext(),"Write Your message",Toast.LENGTH_LONG).show();
}
}
}
}
您必须将此代码放入您的实用程序 Class:
public static final List<String> permissionsList = new ArrayList<String>();
public static void givePermisson(Context context, String permisson, String permissonType) {
int per = context.checkSelfPermission(permisson);
if (per != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permisson);
} else if (per != PackageManager.PERMISSION_DENIED) {
}
}
public static boolean checkPermission(Context context, String permission) {
try {
PackageManager pm = context.getPackageManager();
if (pm.checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
return true;
} } catch (Exception e) {
e.printStackTrace();
}
return false;
}
if ( ActivityCompat.shouldShowRequestPermissionRationale (这个, Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale (这个,
Manifest.permission.RECORD_AUDIO) ) {
Toast.makeText (this,
R.string.permissions_needed,
Toast.LENGTH_LONG).show ();
} else {
ActivityCompat.requestPermissions (
this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},
CAMERA_MIC_PERMISSION_REQUEST_CODE);
}
我想知道询问用户权限检查的最佳做法,以及如果用户拒绝特定权限访问时 运行 的代码。
此示例设置了 CONTACTS
权限的状态
private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 1;
private static String[] PERMISSIONS_CONTACT = {Manifest.permission.READ_CONTACTS}
if (checkSelfPermission(PERMISSIONS_CONTACT)) {
Log.i(TAG,
"Contact permissions have already been granted. Displaying contact details.");
} else {
Log.i(TAG, "Contact permissions has NOT been granted. Requesting permission.");
requestPermissions(PERMISSIONS_CONTACT, PERMISSIONS_REQUEST_READ_CONTACTS);
}
…
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case PERMISSIONS_REQUEST_READ_CONTACTS: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! do the
// calendar task you need to do.
Log.d(TAG, "permission granted");
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Log.d(TAG, "permission denied");
}
return;
}
}
}
您可以关注link http://www.applicoinc.com/blog/android-m-permissions-review/
一些提示:
- 在 Google Play 服务上调用操作之前始终检查权限,因为它们需要权限,但管理由您负责;
- 不要求授予权限:当您调用具有多个权限的请求权限时,系统不关心是否已经授予了一个或两个权限,该对话框会为所有权限显示!因此,只跟踪真正需要的权限。用户授予已经授予的权限可能很奇怪;
- 始终检查是否需要使用方法向用户显示原因
shouldShowRequestPermissionRationale()
您请求许可的原因可能不是很明显; - 如果您正在后台检查权限,例如在服务中,请向用户发送通知,并允许它直接在应用详细信息系统中轻按 activity 授予权限。
看看here - 有一个流程图很好地解释了整个过程。
底线是,根据 Android 的文档,如果您没有许可,您应该始终检查并请求许可(Android 将自动 return DENIED如果用户说不再询问则回调),如果用户过去已经拒绝过一次但没有标记不再询问选项,则应显示一条短消息。
Dexter 是一个 Android 库,它简化了运行时请求权限的过程。
例如相机 运行 时间许可: 您必须将此代码放入相机按钮点击
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
givePerMissons();
} else {
openCamera();
}
public void givePerMissons() {
if ((Utils.checkPermission(MainActivity.this, Manifest.permission.CAMERA)) {
openCamera();
} else {
Utils.givePermisson(MainActivity.this, Manifest.permission.CAMERA, Utils.PERMISSOIN);
if (!Utils.permissionsList.isEmpty()) {
requestPermissions(Utils.permissionsList.toArray(new String[Utils.permissionsList.size()]), Utils.PERMISSOIN_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case Utils.PERMISSOIN_CODE: {
if ((Utils.checkPermission(MainActivity.this, Manifest.permission.CAMERA)) {
openCamera();
} else {
Toast.makeText(getApplicationContext(),"Write Your message",Toast.LENGTH_LONG).show();
}
}
}
}
您必须将此代码放入您的实用程序 Class:
public static final List<String> permissionsList = new ArrayList<String>();
public static void givePermisson(Context context, String permisson, String permissonType) {
int per = context.checkSelfPermission(permisson);
if (per != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(permisson);
} else if (per != PackageManager.PERMISSION_DENIED) {
}
}
public static boolean checkPermission(Context context, String permission) {
try {
PackageManager pm = context.getPackageManager();
if (pm.checkPermission(permission, context.getPackageName()) == PackageManager.PERMISSION_GRANTED) {
return true;
} } catch (Exception e) {
e.printStackTrace();
}
return false;
}
if ( ActivityCompat.shouldShowRequestPermissionRationale (这个, Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale (这个, Manifest.permission.RECORD_AUDIO) ) {
Toast.makeText (this,
R.string.permissions_needed,
Toast.LENGTH_LONG).show ();
} else {
ActivityCompat.requestPermissions (
this,
new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},
CAMERA_MIC_PERMISSION_REQUEST_CODE);
}