Android: programowa Zmiana ustawień NFC (on/off)

Próbuję programowo zmienić ustawienia NFC (on/off) na Androidzie 2.3.3.

Na telefonie, w zakładce "Ustawienia sieci bezprzewodowej",
możesz ustawić, czy chcesz używać NFC do odczytu i wymiany znaczników, czy nie.

Więc chciałbym włączyć to ustawienie w mojej aplikacji.
Ale nie mogę znaleźć api do tego.

Szukam jakiegoś kodu, który prawdopodobnie wyglądałby tak:

WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled( on/off );
Author: OMG Ponies, 2011-05-10

5 answers

Nie możesz go włączyć on/off ręcznie, ale możesz wysłać użytkownika do preferencji, jeśli jest to 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));
    }

Metoda getNfc() po prostu zwraca nfcadapter:

Nfc = NfcAdapter.getDefaultAdapter (biał.getApplicationContext ());

 29
Author: Sven Haiges,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 12:55:39

Nie jest to możliwe programowo bez urządzenia zakorzenienia. Ale możesz uruchomić {[1] } poprzez intent action Settings.ACTION_NFC_SETTINGS dla api poziomu 16 i wyższego. Dla api Settings.ACTION_WIRELESS_SETTINGS

Poprzednia wybrana odpowiedź sugeruje użycie WIFI_SETTINGS ale możemy bezpośrednio przejść do NFC_SETTINGS

Oto przykład:

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

            }
 37
Author: Kishan Raval,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 13:25:43

Jeśli chcesz to zrobić programowo, to Q posiada odpowiedź:

Jak włączyć czytnik NFC przez API?

Edit

Nie zawierała odpowiedzi, ale trzymała klucz do odpowiedzi, na którym oparłem swój kod, którym odpowiedziałem w Q.

Wkleję go tutaj również w przypadku, gdyby ktoś był zainteresowany.

I got it working through reflection

Ten kod działa na API 15, nie sprawdzałem go w innych wersjach yet

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

To wymaga jednak 2 uprawnień, umieść je w manifeście:

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

Stan przycisku NFC zmienia się odpowiednio, gdy kod jest używany, więc nie ma problemów z ręcznym wykonywaniem go w menu seetings.


Aby wyjaśnić: ten kod nie działa na normalnych urządzeniach. Istnieją sposoby, ale przynajmniej wymaga roota .

 8
Author: slinden77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:56

Możesz kontrolować transfery NFC i takie tam. Ale na razie włączanie i wyłączanie nie jest możliwe: (

 0
Author: Rejinderi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-10 04:27:03

Proszę sprawdzić ten poniżej URL wszystko jest podane jako krok po kroku.

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

 0
Author: Ranjith Subramaniam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-04 08:15:28