有什么方法可以使用 API 启用 Android NFC 阅读器?
4 回答
所以显然没有办法从 API 启用 NFC,即使谷歌在他们的源代码中这样做了(见下文)。
如果您查看NfcAdapter.isEnabled()的 API 中的一行:
如果此 NFC 适配器启用了任何功能,则返回 true。
应用程序可以使用它作为帮助建议用户应该在设置中打开 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 Application Source Code,里面有一个Interface文件INfcAdapter.aidl。在文件中,有两个 API,即“boolean enable()”和“boolean disable()”。您可以直接使用此 API 通过 android 应用程序启用和禁用 NfcService。但是这里的窍门是你不能使用 Android 提供的 SDK 编译代码。您必须使用 makefile 编译应用程序。我已经成功构建了一个应用程序。
我希望这个论坛也能帮助您解决这个问题,并清楚地了解 NFC 电源开/关 API 障碍。
http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html