请求权限 API 22 Android
Ask for permissions with API 22 Android
在我工作的项目中,我们有一组权限,其中 3 个被标记为 dangerous
。在 Android < Android 6.0.0 的设备上没有问题,但是对于最新版本,应用程序无法正常工作。
因此,在 google 中搜索有关权限的信息,我到达了 Google 文档页面,其中讨论了如何请求权限:http://developer.android.com/intl/es/training/permissions/requesting.html
他们使用此代码。
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) { ... }
其中 ContextCompat.CheckSelfPermission(..)
仅在 API 23.
但是问题来了,对于项目中的某些规范(老板等...),我们无法升级到 API23,以使用包含此方法的库兼容。
所以我的问题是:
有什么方法可以处理权限请求,做一些变通办法吗?
权限:
<uses-permission android:name="xx.xx.otr.app.providers.imps.permission.READ_ONLY" />
<uses-permission android:name="xx.xx.otr.app.providers.imps.permission.WRITE_ONLY" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="es.in2.otr.app.im.permission.IM_SERVICE" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="xx.xx.otr.app.im.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="xx.xx.otr.app.im.permission.C2D_MESSAGE" />
<permission
android:name="xx.xx.otr.app.im.permission.IM_SERVICE"
android:description="@string/perm_desc"
android:label="@string/perm_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous" />
<permission
android:name="xx.xx.otr.app.providers.imps.permission.READ_ONLY"
android:description="@string/ro_perm_desc"
android:label="@string/ro_perm_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous" />
<permission
android:name="xx.xx.otr.app.providers.imps.permission.WRITE_ONLY"
android:description="@string/wo_perm_desc"
android:label="@string/wo_perm_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous" />
如下请求您需要的权限,
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Get the response of the permission as follows,
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
有关它的更多详细信息,您可以参考 google 开发人员文档,
http://developer.android.com/training/permissions/requesting.html
希望对您有所帮助。
看看这个link
"The easiest way to manage runtime permissions is by using third-party libraries"
PermissionsDispatcher 专为危险权限开发
https://guides.codepath.com/android/Managing-Runtime-Permissions-with-PermissionsDispatcher
在我工作的项目中,我们有一组权限,其中 3 个被标记为 dangerous
。在 Android < Android 6.0.0 的设备上没有问题,但是对于最新版本,应用程序无法正常工作。
因此,在 google 中搜索有关权限的信息,我到达了 Google 文档页面,其中讨论了如何请求权限:http://developer.android.com/intl/es/training/permissions/requesting.html
他们使用此代码。
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) { ... }
其中 ContextCompat.CheckSelfPermission(..)
仅在 API 23.
但是问题来了,对于项目中的某些规范(老板等...),我们无法升级到 API23,以使用包含此方法的库兼容。
所以我的问题是:
有什么方法可以处理权限请求,做一些变通办法吗?
权限:
<uses-permission android:name="xx.xx.otr.app.providers.imps.permission.READ_ONLY" />
<uses-permission android:name="xx.xx.otr.app.providers.imps.permission.WRITE_ONLY" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="es.in2.otr.app.im.permission.IM_SERVICE" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="com.google.android.googleapps.permission.GOOGLE_AUTH" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission
android:name="xx.xx.otr.app.im.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="xx.xx.otr.app.im.permission.C2D_MESSAGE" />
<permission
android:name="xx.xx.otr.app.im.permission.IM_SERVICE"
android:description="@string/perm_desc"
android:label="@string/perm_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous" />
<permission
android:name="xx.xx.otr.app.providers.imps.permission.READ_ONLY"
android:description="@string/ro_perm_desc"
android:label="@string/ro_perm_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous" />
<permission
android:name="xx.xx.otr.app.providers.imps.permission.WRITE_ONLY"
android:description="@string/wo_perm_desc"
android:label="@string/wo_perm_label"
android:permissionGroup="android.permission-group.MESSAGES"
android:protectionLevel="dangerous" />
如下请求您需要的权限,
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.READ_CONTACTS)) {
// Show an expanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
// app-defined int constant. The callback method gets the
// result of the request.
}
}
Get the response of the permission as follows,
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
有关它的更多详细信息,您可以参考 google 开发人员文档, http://developer.android.com/training/permissions/requesting.html
希望对您有所帮助。
看看这个link
"The easiest way to manage runtime permissions is by using third-party libraries" PermissionsDispatcher 专为危险权限开发
https://guides.codepath.com/android/Managing-Runtime-Permissions-with-PermissionsDispatcher