Как включить считывание NFC через API?
Есть ли способ включить Android NFC Reader с помощью API?
4 ответа
Таким образом, по-видимому, нет способа включить NFC из API, хотя Google делает это в своем исходном коде (см. Ниже).
Если вы посмотрите на строку из API для NfcAdapter.isEnabled ():
Верните true, если этот NFC-адаптер имеет какие-либо включенные функции.
Приложение может использовать это в качестве помощника, чтобы предложить пользователю включить NFC в настройках.
Если этот метод возвращает false, аппаратное обеспечение NFC гарантированно не генерирует и не отвечает на какие-либо транзакции NFC.
Похоже, что нет способа сделать это в API. Облом. Ваша лучшая ставка - это диалоговое окно, информирующее пользователя о том, что ему нужно включить его в настройках, и, возможно, запустить намерение настройки.
РЕДАКТИРОВАТЬ: Следующее из источника, но похоже, что они не позволили пользователю реализовать методы в API (я запутался в этом).
Я нашел это из исходного кода Android, чтобы помочь включить и отключить адаптер.
Соответствующий источник:
public boolean onPreferenceChange(Preference preference,
Object value) {
// Turn NFC on/off
final boolean desiredState = (Boolean) value;
mCheckbox.setEnabled(false);
// Start async update of the NFC adapter state, as the API is
// unfortunately blocking...
new Thread("toggleNFC") {
public void run() {
Log.d(TAG, "Setting NFC enabled state to: "
+ desiredState);
boolean success = false;
if (desiredState) {
success = mNfcAdapter.enable();
} else {
success = mNfcAdapter.disable();
}
if (success) {
Log.d(TAG,
"Successfully changed NFC enabled state to "
+ desiredState);
mHandler.post(new Runnable() {
public void run() {
handleNfcStateChanged(desiredState);
}
});
} else {
Log.w(TAG, "Error setting NFC enabled state to "
+ desiredState);
mHandler.post(new Runnable() {
public void run() {
mCheckbox.setEnabled(true);
mCheckbox
.setSummary(R.string.nfc_toggle_error);
}
});
}
}
}.start();
return false;
}
Я получил это работает через отражение
Этот код работает на 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 меняется соответственно при использовании кода, поэтому нет никаких проблем при выполнении этого вручную в меню настроек.
Если вы видите исходный код приложения NfcService, существует файл интерфейса INfcAdapter.aidl. В файле есть два API, а именно "boolean enable()" и "boolean disable()". Вы можете напрямую использовать этот API для включения и отключения NfcService через приложение для Android. Но хитрость здесь в том, что вы не можете скомпилировать код, используя SDK, предоставляемый Android. Вы должны скомпилировать приложение, используя make-файл. Я успешно создал приложение.
Я надеюсь, что этот форум поможет вам решить и эту проблему, чтобы получить четкое представление о запретах API включения / выключения NFC.
http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html