【问题标题】:Make Android "uses-permission" optional使 Android 的“使用权限”成为可选
【发布时间】:2013-03-04 00:59:55
【问题描述】:

我有这些:

  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-feature android:name="android.hardware.location.gps" android:required="false" />      

我可以自己检查 GPS:

locationManager = (LocationManager) 
    context.getSystemService(Context.LOCATION_SERVICE);

fSupportsGPS = (locationManager.getAllProviders().
    contains(LocationManager.GPS_PROVIDER));

但我还是有些疑惑。我希望我的应用程序在没有 wifi/gps/网络可用的设备上运行。我使用 GPS 的唯一原因是在 Google 地图上显示用户位置。 (与应用程序的其他部分相比,这是一个微小的功能,所以我不想对它有任何要求。)

【问题讨论】:

  • 你有什么疑惑?

标签: android gps user-permissions


【解决方案1】:

&lt;uses-feature ...&gt; 告诉 Android 应用程序必须需要该功能并且没有它就无法运行,因此 Android 不允许用户安装该应用程序(事实上,它不会'甚至不会出现在 Play 商店/市场中。

要让不具备这些功能的用户安装您的应用,您只需添加android:required="false" 选项即可获得相应的功能。您已经使用此 XML 在清单中完成了:

<uses-feature android:name="android.hardware.camera" android:required="false"/>

要检测用户是否拥有该功能(因为现在不是强制性的),您可以使用 Android API。你已经用这个 Java 代码完成了:

locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);   
  fSupportsGPS = (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER));

现在,您不能做的一件事是让使用 Android 1.6 及更早版本的用户安装应用,即使这些功能被标记为可选。这是因为 Android 版本无法识别 android:required 功能,如 this answer 中所述。


另外要记住的是,一些&lt;uses-permission ...&gt; 标签会触发一些隐含的权限要求。

为了解决这个问题,引用docs

如果您不希望 Google Play 根据特定的暗示进行过滤 功能,您可以禁用该行为。为此,请声明该功能 在一个元素中显式地​​包含一个 android:required="false" 属性。例如,禁用过滤 派生自 CAMERA 权限,您可以将该功能声明为 如下所示。

<uses-feature android:name="android.hardware.camera" android:required="false" />

根据this page&lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt; 表示网络的要求。要禁用它,请将其添加到您的清单中:

<uses-feature android:name="android.hardware.location.network" android:required="false" />

【讨论】:

  • 1) 我担心使用权限可能也可以起到“必需”的作用。 (如果没有这些,该应用程序将运行良好,但如果授予权限就好了。) 2)我担心使用例如ACCESS_COARSE_LOCATION 权限可能会触发 GPS 之外的一些进一步的隐含硬件要求。 (例如,需要电话/运营商/wifi信号)
  • 谢谢!我现在使用:“" 因为根据developer.android.com/guide/topics/manifest/… 触发“网络”要求。
  • 如果我将所需的 false 添加到某些权限并且在运行时找不到硬件会怎样?它会崩溃吗?
【解决方案2】:

android:required="false"/&gt; 应该可以解决问题。我有一个 Nexus7,它只有一个前置摄像头,Android 不认为它是摄像头。由于对相机的要求,它没有显示在 Play 商店中我的应用支持的设备列表中。

中添加 required=false
<uses-feature android:name="android.hardware.camera" android:required="false"/>

让它出现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2013-08-24
    相关资源
    最近更新 更多