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; }
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.
the fact that this ofcourse will only work on rooted devices! One can't write secure settings or settings unless the app is installed as a system app.