【问题标题】:Programmatically find whether installing from unknown sources is allowed以编程方式查找是否允许从未知来源安装
【发布时间】:2011-09-14 02:02:58
【问题描述】:

我需要查看当前的 Android 设备是否允许安装来自市场以外的来源的应用程序。此选项显示在名为“未知来源”的应用程序下的设置 UI 中。

该设置基本上允许您下载和安装并非源自 Google 应用市场的 APK。

如何使用代码检查此标志是打开还是关闭?

【问题讨论】:

    标签: android settings


    【解决方案1】:

    这是使用上述设置的代码:

    boolean isNonPlayAppAllowed = Settings.Secure.getInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS) == 1;
    

    还向用户显示设置可能对我有用:

    if (!isNonPlayAppAllowed) {
        startActivity(new Intent(android.provider.Settings.ACTION_SECURITY_SETTINGS));
    }
    

    【讨论】:

    • 在应用程序中的何处添加此代码?在主要活动中还是在其他任何地方?
    • 问题是找到“未知来源”安装标志。变量 isNonPlayAppAllowed 就是那个标志。它使用所有静态方法定义,因此您可以在代码中的任何位置定义/使用它。你只需要getContentResover(),这意味着你只需要上下文。
    • 文档说:INSTALL_NON_MARKET_APPS 常量在 API 级别 17 中已弃用。从 Build.VERSION_CODES.O 开始,应用应使用 PackageManager.canRequestPackageInstalls()
    • @HusnainAslam 这也困扰着我,但我发现了 Commonsware (commonsware.com/blog/2014/10/17/…) 的这份报告,他说在 API 级别 21 上,不推荐使用 Settings.Secure.INSTALL_NON_MARKET_APPS,所以我正在使用再说一遍。 (注意类,它来自 Settings.Secure,而不是 Settings.Global)
    【解决方案2】:

    此设置称为“INSTALL_NON_MARKET_APP" (click for documentation)

    (当我发现隐藏在文档深处的答案时,我基本上已经输入了问题,但名称不同,所以我决定发布问题和自我回答,因为这不是微不足道的。)

    【讨论】:

      【解决方案3】:
          boolean allow = false;
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
               allow = this.getPackageManager().canRequestPackageInstalls();
              } else {
              try {
               allow = Settings.Secure.getInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS) == 1;
                  } catch (Settings.SettingNotFoundException e) {
                    e.printStackTrace();
                    }
             }
          
          if (!allow)
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             startActivity(new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES));
             } else {
             startActivity(new Intent(Settings.ACTION_SECURITY_SETTINGS));
             }
      

      【讨论】:

        【解决方案4】:

        你可以要求包管理器告诉你

         applicationContext.packageManager.canRequestPackageInstalls()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          • 2020-04-27
          • 2013-10-02
          • 2017-04-27
          • 2011-09-28
          • 1970-01-01
          相关资源
          最近更新 更多