Android: Changing NFC settings (on/off) programmatically Android: Changing NFC settings (on/off) programmatically android android

Android: Changing NFC settings (on/off) programmatically


It's not possible programatically without rooting device. But you can start NFC Settings Activity by intent action Settings.ACTION_NFC_SETTINGS for api level 16 and above. For api < 16 use Settings.ACTION_WIRELESS_SETTINGS

Previous selected answer suggests to use WIFI_SETTINGS but we can directly move to NFC_SETTINGS

Here's the example :

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


You can not turn it on/off manually but you can send the user to the preferences if it is 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));    }

Method getNfc() just returns the nfcadapter:

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


if you want to do it programmatically, apperently this Q holds the answer:

How can I enable NFC reader via API?

Edit

it didn't hold the answer, but it held the key to the answer, on which I based my code I answered with in the Q.

I will paste it here as well in case anyone's interested.

I got it working through reflection

This code works on API 15, haven't checked it against other verions 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

This requires 2 permissions though, put them in the manifest:

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

The NFC button's state switches accordingly when the code is used, so there are no issues when doing it manually in the seetings menu.


To clarify: This code doesn't work on normal devices. There are ways around, but at least it requires root.