Сделайте разрешение на использование Android необязательным

У меня есть это:

  <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));

Но у меня все еще есть некоторые сомнения. Я хочу, чтобы мое приложение работало на устройствах без Wi-Fi/GPS/сети. Причина в том, что единственное, для чего я использую GPS, — это отображение местоположения пользователя на картах Google. (И это незначительная функция по сравнению с остальной частью приложения, поэтому я не хочу предъявлять к ней какие-либо требования.)


person Tom    schedule 15.03.2013    source источник
comment
Какие сомнения у вас есть?   -  person Heiko Rupp    schedule 15.03.2013


Ответы (2)


<uses-feature ...> сообщает Android, что приложение < em>должен требовать эту функцию и не будет работать без нее, поэтому Android не позволяет пользователям устанавливать приложение (фактически, оно даже не будет отображаться в Play Store/Market Place.

Чтобы позволить пользователям, у которых нет этих функций, установить ваше приложение, вам просто нужно добавить параметр 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" />

Согласно этой странице, <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> подразумевает требование сети. Чтобы отключить это, добавьте это в свой манифест:

<uses-feature android:name="android.hardware.location.network" android:required="false" />
person Yatharth Agarwal    schedule 15.03.2013
comment
1) Я волновался, что разрешение на использование, возможно, также может работать должным образом. (Приложение будет работать нормально без них, но просто хорошо, если даны разрешения.) 2) Я беспокоился, используя, например. Разрешение ACCESS_COARSE_LOCATION может вызвать некоторые дополнительные неявные требования к оборудованию, помимо GPS. (Например, требуется сигнал телефона/оператора/Wi-Fi) - person Tom; 15.03.2013
comment
Спасибо! Сейчас я использую: ‹uses-feature android:name=android.hardware.location.gps android:required=false /› ‹uses-feature android:name=android.hardware.location.network android:required=false /› потому что соответственно в developer.android.com/guide/topics/manifest/ ‹uses-permission android:name=android.permission.ACCESS_COARSE_LOCATION /› инициирует требование к сети. - person Tom; 15.03.2013
comment
Что произойдет, если я добавлю необходимое значение false к некоторым разрешениям, а во время выполнения аппаратное обеспечение не будет найдено? Это крах? - person Emaborsa; 22.11.2015

Этот android:required="false"/> должен помочь. У меня Nexus7, у которого есть только фронтальная камера, которая не считается камерой в Android. И с требованием камеры она не отображалась в списке поддерживаемых устройств для моего приложения в магазине игр.

Добавление required=false, как в

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

заставил его появиться.

person Heiko Rupp    schedule 15.03.2013