在
Android Oreo(8.0)中,对如何允许从未知来源(从用户的角度)安装应用程序以及获得安装权限的过程(从开发人员的角度)进行了一些更改.
由于我发现特别难以找到开发人员所需的所有步骤,我认为在这里请求解决方案并自己回答问题是有用的,因为我找到了答案,以便将来参考那些,面临同样的障碍.
答案将包括以下问题:
解决方法
对于初学者,您的应用程序需要在build.gradle或AndroidManifest.xml中声明targetSdkVersion为26(Android Oreo的API级别)或更高版本才能使所有这些工作.
然后回答上面的问题:
- How to check whether I’m allowed to request a package install?
您可以在Activity的代码中的任何位置使用getPackageManager().canRequestPackageInstalls()
进行检查.请注意,如果您未声明适当的权限或定位错误的SDK版本,则此方法始终返回false.
- What exact permission do I have to request?
您必须在AndroidManifest.xml中声明Manifest.permission.REQUEST_INSTALL_PACKAGES
,如下所示:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- How can I prompt the user to grant this permission?
您可以使用Intent ACTION_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")));
- How do I prompt the user to install a specified .apk?
一旦确定您被授予适当的权限,您就可以提示用户在您的Activity代码中的任何位置安装.apk文件(这指的是您的Activity的上下文),使用:
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
.