5

我有这些:

  <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 地图上显示用户位置。(与应用程序的其他部分相比,这是一个微小的功能,所以我不想对它有任何要求。)

4

2 回答 2

7

<uses-feature ...>告诉 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中解释的功能。


要记住的另一件事是,某些<uses-permission ...>标签会触发一些隐含的权限要求。

为了解决这个问题,引用文档

如果您不希望 Google Play 基于特定的隐含功能进行过滤,您可以禁用该行为。为此,请在元素中显式声明该功能并包含 android:required="false" 属性。例如,要禁用从 CAMERA 权限派生的过滤,您将声明该功能,如下所示。

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

根据this page,这<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />意味着网络的要求。要禁用它,请将其添加到您的清单中:

<uses-feature android:name="android.hardware.location.network" android:required="false" />
于 2013-03-15T11:17:11.313 回答
2

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

添加 required=false 如

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

让它出现。

于 2013-03-15T10:49:25.100 回答