Android: изменение настроек NFC (вкл / выкл) программно - PullRequest
23 голосов
/ 10 мая 2011

Я пытаюсь программно изменить настройки NFC (вкл / выкл) на Android 2.3.3.

На телефоне, в разделе «Беспроводные и сетевые настройки»,
Вы можете выбрать, хотите ли вы использовать NFC для чтения и обмена тегами или нет.

Итак, я хотел бы переключить эту настройку в моем приложении.
Но я не могу найти API для этого.

Я ищу код, который, вероятно, будет выглядеть так:

WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled( on/off );

Ответы [ 5 ]

42 голосов
/ 21 марта 2014

Это невозможно программно без рутирующего устройства. Но вы можете начать NFC Settings Activity намеренным действием Settings.ACTION_NFC_SETTINGS для API уровня 16 и выше. Для API <16 используйте <code>Settings.ACTION_WIRELESS_SETTINGS

Предыдущий выбранный ответ предлагает использовать WIFI_SETTINGS, но мы можем сразу перейти к NFC_SETTINGS

Вот пример:

android.nfc.NfcAdapter mNfcAdapter= android.nfc.NfcAdapter.getDefaultAdapter(v.getContext());

            if (!mNfcAdapter.isEnabled()) {

                AlertDialog.Builder alertbox = new AlertDialog.Builder(v.getContext());
                alertbox.setTitle("Info");
                alertbox.setMessage(getString(R.string.msg_nfcon));
                alertbox.setPositiveButton("Turn On", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            Intent intent = new Intent(Settings.ACTION_NFC_SETTINGS);
                            startActivity(intent);
                        } else {
                            Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
                            startActivity(intent);
                        }
                    }
                });
                alertbox.setNegativeButton("Close", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                alertbox.show();

            }
31 голосов
/ 11 мая 2011

Вы не можете включить on/off вручную, но вы можете отправить пользователя в настройках, если это off:

    if (!nfcForegroundUtil.getNfc().isEnabled())
    {
        Toast.makeText(getApplicationContext(), "Please activate NFC and press Back to return to the application!", Toast.LENGTH_LONG).show();
        startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
    }

Метод getNfc() просто возвращает nfcadapter:

nfc = NfcAdapter.getDefaultAdapter (activity.getApplicationContext ());

8 голосов
/ 25 июня 2012

, если вы хотите сделать это программно, в ответ этот Q содержит ответ:

Как включить NFC reader через API?

Редактировать

он не содержал ответа, но содержал ключ к ответу, на котором я основывал свой код, с которым я ответил в Q.

Я также вставлю это здесь, если кому-то будет интересно.

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

Этот код работает на 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 изменяется соответственно при использовании кода, поэтому нет никаких проблем при выполнении этого вручную в меню настроек.


Для пояснения : Этот код не работает на обычных устройствах. Есть способы обойти, но по крайней мере для этого требуется root .

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

Пожалуйста, проверьте этот URL ниже, все дано как шаг за шагом.

http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html

0 голосов
/ 10 мая 2011

Вы можете контролировать передачу NFC и прочее.Но пока его включение и выключение невозможно: (

...