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.