首先,在您的build.gradle或AndroidManifest.xml中声明一个26或更高版本(Android Oreo的API级别)的targetSdkVersion
,所有这些工作都需要。
接下来回答上面的问题:
- 如何检查是否允许请求包安装?
您可以在Activity的任何代码中使用getPackageManager().canRequestPackageInstalls()
进行检查。请注意,如果您没有声明适当的权限或目标错误的SDK版本,则此方法始终返回false
。
- 我必须请求什么确切的权限?
您必须在AndroidManifest.xml中声明Manifest.permission.REQUEST_INSTALL_PACKAGES
,如下所示:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 我该如何提示用户授权此权限?
您可以使用IntentACTION_MANAGE_UNKNOWN_APP_SOURCES
将用户发送到适当的目的地:
startActivity(new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES))
您还可以使用以下代码将用户更直接地发送到您应用程序的特定设置页面:
startActivity(new Intent(android.provider.Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:your.application.package")));
- 如何提示用户安装指定的 .apk 文件?
一旦您确认已被授予适当的权限,您可以在 Activity 的任何代码中(其中 this
指向您的 Activity 的 Context
),使用以下代码提示用户安装您的 .apk 文件:
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setDataAndType(FileProvider.getUriForFile(this, "your.application.package.fileprovider", new File("/path/to/your/apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
如果您想知道安装是否成功、被取消或失败,您还可以添加 intent.putExtra(Intent.EXTRA_RETURN_RESULT, true)
并使用 startActivityForResult(Intent, int)
开始。
有关如何正确获取.apk文件的Uri的信息,请参见FileProvider
。
targetSdkVersion
是 22,而compileSdkVersion
是 26。我该如何检查这种情况下的getPackageManager().canRequestPackageInstalls()
。该方法总是返回 false。 - Chirag Savsani