<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
private static final int REQUEST_CODE_INSTALL_PERMISSION = 1;
ActivityResultLauncher<String> activityResultLauncher = registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
isGranted -> {
if (!isGranted) {
Toast.makeText(this, "权限申请失败", Toast.LENGTH_SHORT).show();
finish();
return;
}
next();
}
);
activityResultLauncher.launch(Manifest.permission.REQUEST_INSTALL_PACKAGES);
- 在 Android 开发中,执行上述权限申请的代码,权限申请失败
问题描述
Manifest.permission.REQUEST_INSTALL_PACKAGES
是一个特殊权限,不能通过常规的运行时权限请求方式(ActivityResultContracts.RequestPermission
)来申请Manifest.permission.REQUEST_INSTALL_PACKAGES
必须通过跳转到系统设置页面让用户手动授权正确的申请方式:检查是否已有权限,如果没有权限,引导用户前往系统设置
Manifest.permission.REQUEST_INSTALL_PACKAGES
在 Android 8.0 引入,低版本无需处理
处理策略
- 在
AndroidManifest.xml
中声明权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 跳转请求权限(过时写法)
private static final int REQUEST_CODE_INSTALL_PERMISSION = 1;
boolean canInstall = checkInstallPermission();
Log.i(TAG, "canInstall = " + canInstall);
if (!canInstall) {
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_CODE_INSTALL_PERMISSION);
return;
}
next();
private boolean checkInstallPermission() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? getPackageManager().canRequestPackageInstalls() : true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_INSTALL_PERMISSION) {
boolean canInstall = checkInstallPermission();
Log.i(TAG, "now, canInstall = " + canInstall);
if (!canInstall) {
Toast.makeText(this, "权限申请失败", Toast.LENGTH_SHORT).show();
return;
}
next();
}
}
- 使用 ActivityResultLauncher 来替代(现代写法)
private boolean checkInstallPermission() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? getPackageManager().canRequestPackageInstalls() : true;
}
boolean canInstall = checkInstallPermission();
Log.i(TAG, "canInstall = " + canInstall);
if (!canInstall) {
ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
boolean canInstall_ = checkInstallPermission();
Log.i(TAG, "now, canInstall = " + canInstall_);
if (!canInstall_) {
Toast.makeText(this, "权限申请失败", Toast.LENGTH_SHORT).show();
return;
}
next();
}
);
Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
.setData(Uri.parse("package:" + getPackageName()));
activityResultLauncher.launch(intent);
return;
}
next();