29

我试图在 Android 2.3.3 上以编程方式更改 NFC 设置(开/关)。

在手机上,在“无线和网络设置”下,
您可以选择设置是否要使用 NFC 读取和交换标签。

所以我想在我的应用程序中切换这个设置。
但我似乎无法为此找到一个 api。

我正在寻找一些可能看起来像这样的代码:

WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifi.setWifiEnabled( on/off );
4

5 回答 5

51

如果没有生根设备,则无法以编程方式进行。但是您可以从API 级别 16 及更高级别NFC Settings Activity的意图操作开始。Settings.ACTION_NFC_SETTINGS对于 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();

            }
于 2014-03-21T12:46:44.543 回答
34

您不能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());

于 2011-05-11T08:27:40.303 回答
9

如果您想以编程方式执行此操作,显然这个 Q 拥有答案:

如何通过 API 启用 NFC 阅读器?

编辑

它没有答案,但它掌握了答案的关键,我基于我在 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

于 2012-06-25T18:50:27.643 回答
-1

您可以控制 NFC 传输等。但是现在打开和关闭它是不可能的:(

于 2011-05-10T04:27:03.607 回答
-1

请检查下面的 URL,一切都是一步一步给出的。

http://ranjithdroid.blogspot.com/2015/11/turn-onoff-android-nfc-by.html

于 2015-11-04T08:15:28.077 回答