Как включить считыватель NFC через API? - PullRequest
8 голосов
/ 28 июня 2011

Есть ли способ включить Android NFC reader с помощью API?

Ответы [ 4 ]

6 голосов
/ 28 июня 2011

Так что, очевидно, нет способа включить NFC из API, даже если Google делает это в своем исходном коде (см. Ниже).

Если вы посмотрите на строку из API для NfcAdapter.isEnabled () :

Вернуть true, если в этом адаптере NFC включены какие-либо функции.

Приложение может использовать это какпомощник, чтобы предложить пользователю включить NFC в настройках.

Если этот метод возвращает false, аппаратное обеспечение NFC гарантированно не генерирует и не отвечает на какие-либо транзакции NFC.

Похоже, что нет способа сделать это в API.Облом.Ваша лучшая ставка - это диалоговое окно, информирующее пользователя о том, что ему нужно включить его в настройках, и, возможно, запустить намерение настройки.

РЕДАКТИРОВАТЬ: Следующее из источника, но выглядиткак будто они не позволяли пользователю реализовывать методы в API (я запутался в этом).

Я нашел это из исходного кода Android , чтобы помочь включить и отключитьадаптер.

Соответствующий источник:

public boolean onPreferenceChange(Preference preference,
        Object value) {
    // Turn NFC on/off

    final boolean desiredState = (Boolean) value;
    mCheckbox.setEnabled(false);

    // Start async update of the NFC adapter state, as the API is
    // unfortunately blocking...
    new Thread("toggleNFC") {
        public void run() {
            Log.d(TAG, "Setting NFC enabled state to: "
                    + desiredState);
            boolean success = false;
            if (desiredState) {
                success = mNfcAdapter.enable();
            } else {
                success = mNfcAdapter.disable();
            }
            if (success) {
                Log.d(TAG,
                        "Successfully changed NFC enabled state to "
                                + desiredState);
                mHandler.post(new Runnable() {
                    public void run() {
                        handleNfcStateChanged(desiredState);
                    }
                });
            } else {
                Log.w(TAG, "Error setting NFC enabled state to "
                        + desiredState);
                mHandler.post(new Runnable() {
                    public void run() {
                        mCheckbox.setEnabled(true);
                        mCheckbox
                                .setSummary(R.string.nfc_toggle_error);
                    }
                });
            }
        }
    }.start();
    return false;
}
3 голосов
/ 02 июля 2012

Я получил его через отражение

Этот код работает на API 15, еще не проверял его на других версиях

public boolean changeNfcEnabled(Context context, boolean enabled) {
    // Turn NFC on/off
    final boolean desiredState = enabled;
    mNfcAdapter = NfcAdapter.getDefaultAdapter(context);

    if (mNfcAdapter == null) {
        // NFC is not supported
        return false;
    }

    new Thread("toggleNFC") {
        public void run() {
            Log.d(TAG, "Setting NFC enabled state to: " + desiredState);
            boolean success = false;
            Class<?> NfcManagerClass;
            Method setNfcEnabled, setNfcDisabled;
            boolean Nfc;
            if (desiredState) {
                try {
                    NfcManagerClass = Class.forName(mNfcAdapter.getClass().getName());
                    setNfcEnabled   = NfcManagerClass.getDeclaredMethod("enable");
                    setNfcEnabled.setAccessible(true);
                    Nfc             = (Boolean) setNfcEnabled.invoke(mNfcAdapter);
                    success         = Nfc;
                } catch (ClassNotFoundException e) {
                } catch (NoSuchMethodException e) {
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                }
            } else {
                try {
                    NfcManagerClass = Class.forName(mNfcAdapter.getClass().getName());
                    setNfcDisabled  = NfcManagerClass.getDeclaredMethod("disable");
                    setNfcDisabled.setAccessible(true);
                    Nfc             = (Boolean) setNfcDisabled.invoke(mNfcAdapter);
                    success         = Nfc;
                } catch (ClassNotFoundException e) {
                } catch (NoSuchMethodException e) {
                } catch (IllegalArgumentException e) {
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                }
            }
            if (success) {
                Log.d(TAG, "Successfully changed NFC enabled state to "+ desiredState);
            } else {
                Log.w(TAG, "Error setting NFC enabled state to "+ desiredState);
            }
        }
    }.start();
    return false;
}//end method

Для этого требуется 2 разрешения, но поместите их вманифест:

 <!-- change NFC status toggle -->
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

Состояние кнопки NFC соответственно изменяется при использовании кода, поэтому нет никаких проблем при выполнении этого вручную в меню настроек.

1 голос
/ 05 июня 2014

Если вы видите исходный код приложения NfcService, существует файл интерфейса INfcAdapter.aidl.В файле есть два API, а именно «boolean enable ()» и «boolean disable ()».Вы можете напрямую использовать этот API для включения и отключения NfcService через приложение для Android.Но хитрость здесь в том, что вы не можете скомпилировать код, используя SDK, предоставляемый Android.Вы должны скомпилировать приложение, используя make-файл.Я успешно создал приложение.

0 голосов
/ 04 ноября 2015

Я надеюсь, что этот форум поможет вам решить и эту проблему, чтобы получить четкое представление о запретах API включения / выключения NFC.

...