【问题标题】:Android: Changing NFC settings (on/off) programmaticallyAndroid:以编程方式更改 NFC 设置(开/关)
【发布时间】: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 );

【问题讨论】:

    标签: android settings nfc


    【解决方案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())
    • 此答案已弃用,请同时查看以下答案:stackoverflow.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
    猜你喜欢
    • 2015-04-09
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多