使Android“uses-permission”可选

时间:2013-03-15 10:42:46

标签: android gps user-permissions

我有这些:

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

2 个答案:

答案 0 :(得分:5)

<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及更早版本的用户安装应用程序,即使这些功能被标记为可选。这是b'co​​z,因为this answer中解释了Android版本无法识别android:required功能。


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

要解决此问题,请引用docs

  

如果您不希望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" />

答案 1 :(得分:2)

android:required="false"/>应该可以解决问题。我有一个Nexus7,它只有一个前置摄像头,不被Android视为摄像头。根据相机的要求,它没有显示在Play商店中我的应用程序支持的设备列表中。

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

让它显示出来。