Android: изменение настроек NFC (вкл/выкл) программно
Я пытаюсь изменить настройки NFC (вкл/выкл) программно на Android 2.3.3.
В телефоне в разделе "Беспроводные и сетевые настройки",
вы можете выбрать, хотите ли вы использовать NFC для чтения и обмена тегами или нет.
Поэтому я хотел бы переключить этот параметр в моем приложении.
Но я не могу найти api для этого.
Я ищу код, который, вероятно, будет выглядеть следующим образом:
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled( on/off );
Ответы
Ответ 1
Вы не можете повернуть его 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());
Ответ 2
Невозможно программировать без укорачивания устройства.
Но вы можете начать NFC Settings Activity
с помощью действия action Settings.ACTION_NFC_SETTINGS
для api уровня 16 и выше. Для api < 16 используйте 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();
}
Ответ 3
если вы хотите сделать это программно, а именно Q отвечает:
Как включить NFC-считыватель через 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 переключается соответственно, когда используется код, поэтому при его выполнении вручную в меню seetings нет проблем.
Чтобы уточнить: этот код не работает на обычных устройствах. Есть способы, но по крайней мере для этого требуется root.
Ответ 4
Вы можете контролировать передачу NFC и прочее. Но теперь его включение и выключение невозможно: (
Ответ 5
Пожалуйста, проверьте этот ниже URL-адрес, который все указывается как шаг за шагом.
http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html