Android:以编程方式更改 NFC 设置(开/关)
Posted
技术标签:
【中文标题】Android:以编程方式更改 NFC 设置(开/关)【英文标题】:Android: Changing NFC settings (on/off) programmatically 【发布时间】:2011-08-22 03:40:18 【问题描述】:我尝试在 android 2.3.3 上以编程方式更改 NFC 设置(开/关)。
在手机上,在“无线和网络设置”下, 您可以选择设置是否使用 NFC 读取和交换标签。
所以我想在我的应用程序中切换此设置。 但我似乎无法为此找到一个 api。
我正在寻找一些可能看起来像这样的代码:
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled( on/off );
【问题讨论】:
【参考方案1】:如果没有 root 设备,则无法以编程方式进行。
但是您可以通过意图操作Settings.ACTION_NFC_SETTINGS
启动NFC Settings Activity
以获取 api 级别 16 及更高版本。对于 api 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();
【讨论】:
NB -Settings
类是 android.provider.Settings
。
“设置”的哪个包? AS给了我8个选择。始终包含导入。【参考方案2】:
你不能手动打开它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());
【讨论】:
if 语句应该是mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter.isEnabled())
此答案已弃用,请同时查看以下答案:***.com/questions/5945100/…
我认为最好为新的操作系统版本启动操作 android.provider.Settings.ACTION_NFC_SETTINGS。【参考方案3】:
如果您想以编程方式执行此操作,显然这个 Q 拥有答案:
How can I enable NFC reader via 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 按钮的状态会相应切换,因此在设置菜单中手动执行此操作没有问题。
澄清:此代码不适用于普通设备。有很多方法,但至少它需要root。
【讨论】:
澄清:此代码不适用于普通设备。有很多方法,但至少它需要root。 我尝试使用此代码,并将应用程序创建为系统应用程序,但它不适用于我,在 android kitkat 中。 是否有任何其他方式可以与驱动程序级别交互,以编程方式从 android 启用/禁用 nfc。【参考方案4】:您可以控制 NFC 传输等。但是现在打开和关闭它是不可能的:(
【讨论】:
感谢您的回复。我希望我们可以打开和关闭它。 > 它曾经在 Android 2.3 中是可能的(我相信在 2.3.6 之前)。【参考方案5】:请检查下面的网址,一切都是一步一步给出的。
http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html
【讨论】:
您能分享该链接中给出的步骤吗?你仍然可以引用它,但如果链接失效,这个答案将没有多大用处。 非常感谢您的评论。这是我的 blogspot 链接,我可以确保它不会再出现,因为这是在 Google 博客中创建的。 值得指出的是,该方案需要设备root。以上是关于Android:以编程方式更改 NFC 设置(开/关)的主要内容,如果未能解决你的问题,请参考以下文章