Как проверить определенные функции через код?

Вот <uses-feature> и <uses-permission>, указанные в файле манифеста для моего приложения для Android.

<uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.location"
        android:required="false" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Я знаю, что они используются для указания необходимых аппаратных/программных функций для приложения. Также этот тег фильтрует наше приложение в Google Play. Мое приложение не отображалось на некоторых устройствах, включая планшеты. У меня есть некоторые сомнения.

  1. Произойдет ли что-нибудь, если мы укажем <uses-permission> без использования <uses-feature>? Например: использовать разрешения CALL_PHONE,MODIFY_PHONE_STATE и т. д. без указания аппаратной функции android.hardware.telephony

  2. Мое приложение запускало следующие приемники при нажатии двух кнопок. Как я могу проверить эти функции из кода?

    android:name="android.intent.action.NEW_OUTGOING_CALL" действие android:name="android.intent.action.PHONE_STATE"

Заранее спасибо


person Asha Soman    schedule 28.08.2013    source источник
comment
проверьте этот stackoverflow.com/a/12644377/983741   -  person Sunil Mishra    schedule 28.08.2013


Ответы (1)


(1) Вам необходимо определить <uses-permission /> и <uses-feature />, а затем установить android:required="false" для этой функции. Например

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-feature android:name="android.hardware.wifi" android:required="false" />

В этом случае вы получаете разрешения, но функция не требуется, и вы можете проверить, доступна ли она в вашем коде. Для этого

(2) вы должны использовать PackageManager.hasSystemFeature() метод. Например

    PackageManager mgr = context.getPackageManager();
    boolean hasTelephony = mgr.hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
person sergej shafarenka    schedule 28.08.2013
comment
Что происходит, когда я устанавливаю required=false для этих функций и не проверяю это из кода? Этот код дает сбой, если функция не найдена? - person Asha Soman; 28.08.2013
comment
По-разному. Он выйдет из строя, если на устройстве будет отсутствовать соответствующий менеджер или реализация. Если у вас есть только BroadcastReceiver, то он не будет уведомлен, но и не выйдет из строя. - person sergej shafarenka; 28.08.2013