Android 8及以上版本(API > 26)未检测到REQUEST_INSTALL_PACKAGES权限

移动开发 2026-07-10

我正在为我的Android应用实现一个APK安装器。Android 7上的工作流程可以说是完美无缺。然而,Android 8及更高版本在权限方面却遇到了问题。出于预见,应用已设置为检测这种情况并向用户请求权限(REQUEST_INSTALL_PACKAGES)。

问题出现在这里;即使我已经授予权限,应用似乎也不认为有权限。下面是用户从权限设置返回时,我的处理方式:

ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    new ActivityResultCallback<>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            runOnUiThread(() -> {
                if (appHasInstallPackagePermission()) {
                    showInstallationStep();
                } else {
                    manuallyRecheckedInstallPermission = true;
                    showPermissionRequiredPage();
                }
            });
        }
    }
);

无论是否开启权限,总是执行 else 分支,因此我又回到了应用的权限页面……以下是更多相关代码:

if (appHasInstallPackagePermission()) {
    showInstallationStep();
} else {
    showPermissionRequiredPage();
}
private void showPermissionRequiredPage() {
    String appName = launcherPackageInfo.getAppName();

    titleTextView.setText(getString(R.string.permission_required_title));
    if (manuallyRecheckedInstallPermission) {
        descriptionTextView.setText("...");
    } else {
        descriptionTextView.setText("...");
    }

    permissionButton.setOnClickListener(new View.OnClickListener() {
        @Override
        @RequiresApi(api = Build.VERSION_CODES.O)
        public void onClick(View v) {
            requestInstallPackagesPermission();
            permissionButton.setText("...");
        }
    });

    permissionButton.setText(getString(R.string.grant_permission_button_text));
    permissionButton.setVisibility(View.VISIBLE);
    permissionButton.requestFocus();
}

@RequiresApi(api = Build.VERSION_CODES.O)
private void requestInstallPackagesPermission() {
    Intent settingsIntent = new Intent(
            Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,
            Uri.parse("package:" + getPackageName())
    );
    activityResultLauncher.launch(settingsIntent);
}

解决方案

我找到了我遇到的问题。尽管我的应用支持最高到SDK 34,但 targetSdkbuild.gradle (app) 中的值是24。

解决方案是将 targetSdk 改为一个至少为26的任意值。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章