检查新的权限模型
Checking the new permission model
我正在根据 Android 6.0
上的新权限模型检查我的应用的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
将应用程序定位到 API23 上,使用 Appcompatv7-r23,通过 adb 在模拟器设备 Android 6.0 和 运行 上安装已签名的应用程序:
在运行时没有任何新变化,该应用程序与之前一样运行良好 API 23,而且似乎所有这些权限都是在安装时自动授予的。
我插入 ContextCompat.checkSelfPermission()
以获得 RECORD_AUDIO 许可,很快就会 returns "PERMISSION_GRANTED"。
这三个权限是否可能被新权限模型保留为不危险?
我的测试有效吗?
它仍属于危险类别,未在安装时授予这些应用程序,针对 Android M
您需要 运行 在 M 设备上才能看到该行为。较旧的 SDK 手机将授予安装权限。这些权限需要实施新模型,否则您的应用会在新设备上安装后崩溃。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
您需要根据需要检查每个权限,然后在授予权限后使用回调方法来实现功能。
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (shouldShowRequestPermissionRationale(
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Explain to the user why we need to read the write to storage
}
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
// MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE is an
// app-defined int constant
return;
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! do the
// calendar task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'switch' lines to check for other
// permissions this app might request
}
}
我的测试无效,因为模拟器不是 API23 平台上的 运行,尽管我在设备定义上选择了 API23。
我正在根据 Android 6.0
上的新权限模型检查我的应用的权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
将应用程序定位到 API23 上,使用 Appcompatv7-r23,通过 adb 在模拟器设备 Android 6.0 和 运行 上安装已签名的应用程序: 在运行时没有任何新变化,该应用程序与之前一样运行良好 API 23,而且似乎所有这些权限都是在安装时自动授予的。
我插入 ContextCompat.checkSelfPermission()
以获得 RECORD_AUDIO 许可,很快就会 returns "PERMISSION_GRANTED"。
这三个权限是否可能被新权限模型保留为不危险? 我的测试有效吗?
它仍属于危险类别,未在安装时授予这些应用程序,针对 Android M
您需要 运行 在 M 设备上才能看到该行为。较旧的 SDK 手机将授予安装权限。这些权限需要实施新模型,否则您的应用会在新设备上安装后崩溃。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
您需要根据需要检查每个权限,然后在授予权限后使用回调方法来实现功能。
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
if (shouldShowRequestPermissionRationale(
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
// Explain to the user why we need to read the write to storage
}
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE);
// MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE is an
// app-defined int constant
return;
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! do the
// calendar task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'switch' lines to check for other
// permissions this app might request
}
}
我的测试无效,因为模拟器不是 API23 平台上的 运行,尽管我在设备定义上选择了 API23。