在Android Oreo(8.0)中,对如何允许从未知来源安装应用程序(从用户的角度)以及获得安装权限的过程进行了一些更改(从开发人员的角度来看) )。
由于我发现特别难以找到开发人员所需的所有步骤,我认为在这里请求解决方案并自己回答问题是有用的,因为我找到了答案,以便将来参考这些,谁面临同样的障碍。
答案将包括以下问题:
(如果我在这里仍然遗漏任何内容,我将非常感谢任何其他答案或评论指出这一点。)
答案 0 :(得分:21)
对于初学者,您的应用程序需要在build.gradle或AndroidManifest.xml中声明targetSdkVersion
26(Android级别的Android Oreo级别)或更高版本才能使所有这些工作。
然后回答上述问题:
- 如何检查我是否可以请求安装包?
醇>
您可以在活动代码中的任意位置使用getPackageManager().canRequestPackageInstalls()
进行检查。请注意,如果您未声明相应的权限或定位错误的SDK版本,则此方法始终返回false
。
- 我必须要求哪些确切的许可?
醇>
您必须在AndroidManifest.xml中声明Manifest.permission.REQUEST_INSTALL_PACKAGES
,如下所示:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
- 如何提示用户授予此权限?
醇>
您可以使用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")));
- 如何提示用户安装指定的.apk?
醇>
确定您获得了相应的权限后,您可以提示用户在您的活动代码中的任何位置安装.apk文件(this
引用您的活动的Context
),使用:
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
。
答案 1 :(得分:0)
在adb shell中,您可以使用appops
来管理应用程序特定的权限。
示例:
# To get a list of packagenames that is allowed to install from other sources
appops query-op REQUEST_INSTALL_PACKAGES allow
# To allow an app install packages from other sources
appops set <package name> REQUEST_INSTALL_PACKAGES deny
运行adb shell appops help
时打印的帮助文本:
AppOps service (appops) commands:
help
Print this help text.
set [--user <USER_ID>] <PACKAGE | UID> <OP> <MODE>
Set the mode for a particular application and operation.
get [--user <USER_ID>] <PACKAGE | UID> [<OP>]
Return the mode for a particular application and optional operation.
query-op [--user <USER_ID>] <OP> [<MODE>]
Print all packages that currently have the given op in the given mode.
reset [--user <USER_ID>] [<PACKAGE>]
Reset the given application or all applications to default modes.
write-settings
Immediately write pending changes to storage.
read-settings
Read the last written settings, replacing current state in RAM.
options:
<PACKAGE> an Android package name.
<OP> an AppOps operation.
<MODE> one of allow, ignore, deny, or default
<USER_ID> the user id under which the package is installed. If --user is not
specified, the current user is assumed.