如何在 Android Oreo 中管理来自未知来源的安装?

Posted

技术标签:

【中文标题】如何在 Android Oreo 中管理来自未知来源的安装?【英文标题】:How to manage installation from Unknown Sources in Android Oreo? 【发布时间】:2018-09-24 12:10:07 【问题描述】:

android Oreo (8.0) 中,对如何允许安装来自未知来源的应用程序(从用户的角度)和获取安装权限的过程(从开发人员的角度)进行了一些更改)。

由于我发现在开发人员方面很难找到所有必要的步骤,所以我认为在我找到答案后,在这里询问解决方案并自己回答问题很有用,以供将来参考,他们面临着同样的障碍。

答案将包括以下问题:

    如何检查是否允许我请求安装包? 我需要申请什么确切的许可? 如何提示用户授予此权限? 如何提示用户安装指定的.apk?

(如果我在这里仍然遗漏任何内容,我将不胜感激任何其他答案或 cmet 指出这一点。)

【问题讨论】:

您好,感谢您的回答,有一个问题。我的 targetSdkVersion is 22compileSdkVersion is 26 ,我如何检查 getPackageManager().canRequestPackageInstalls() 这种情况。该方法总是返回 false。 @Chirag Savsani:你不能。正如我在下面的回答中所述,您必须声明 targetSdkVersion 为 26 或更高。否则,此方法总是返回 false - 这是预期的行为。因此,恐怕您无法为应用程序的更高 targetSdkVersion 进行必要的更改。 【参考方案1】:

在 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.

【讨论】:

无法从 Android 应用执行 appops set REQUEST_INSTALL_PACKAGES 允许?【参考方案2】:

对于初学者,您的应用程序需要在 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" />
    如何提示用户授予此权限?

您可以使用 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?

确保您获得适当的权限后,您可以提示用户在 Activity 代码中的任何位置安装您的 .apk 文件(其中this 指的是您的 Activity 的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

【讨论】:

您好,我能否让第三方应用程序或 SDK 在手机设备(奥利奥)中安装 Android 应用程序时自动安装一次? 例如,尝试安装 Ola APK 并且它正在安装在 Oreo 设备中。 GPS 第三方 SDK 正在通过 OLA Android 应用程序调用。因此,GPS SDK 应该自动安装,而不需要用户允许或拒绝未知应用程序的安装。 @Achiever:听起来有些混乱,但我的理解是您想在没有用户交互的情况下在 Android 设备上安装一些第三方软件?如果是这样的话,这个答案不适合你。我猜您需要对用户设备的 root 访问权限(假设它是 root 用户),并且您仍然需要首先获得该权限(这需要用户交互)。 我已经构建了一个 Android 应用程序。对于一个实例,我的 Android 应用程序名称是 MobileShopping 应用程序。我试图在奥利奥移动设备中安装这个 MobileShopping 应用程序。在 MobileShopping 应用程序中,我有支持银行交易的支付 SDK。在 Oreo 设备中,即使安装了 MobileBanking 应用程序,它也会请求安装第三方应用程序的权限,即。已在 MobileShopping 应用程序中构建的支付 SDK(根据开发) 只有当我第一次尝试在 oreo 设备中安装 MobileShopping 应用程序时,我才需要向用户显示权限授予对话框。我不想显示权限对话框或向用户询问任何权限,即使是 MobileShopping 应用程序中存在的第三方应用程序访问权限

以上是关于如何在 Android Oreo 中管理来自未知来源的安装?的主要内容,如果未能解决你的问题,请参考以下文章

Android Oreo onTaskRemoved 事件不起作用(Android 版本 Oreo)

我的 MainActivity 在使用 android 旧版本(例如 oreo)时滞后,但在最新版本中运行良好,如何解决?

如何清除 Webview 内容以更改 Android Oreo 中的视频

Android Oreo如何知道FCM消息已经到来?

如何更改 Android O / Oreo / api 26 应用程序语言

在android oreo中设备重启后PeriodicWorkRequest不起作用