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

时间:2011-06-28 15:52:12

标签: android nfc

我可以通过API启用Android NFC阅读器吗?

4 个答案:

答案 0 :(得分:6)

显然没有办法从API启用NFC,即使Google在其源代码中这样做(见下文)。

如果您查看NfcAdapter.isEnabled()的API中的一行:

  

如果此NFC适配器具有,则返回true   已启用任何功能。

     

应用程序可以将其用作帮助程序   建议用户应该转   在设置中的NFC上。

     

如果此方法返回false,则为NFC   保证硬件不会生成   或回应任何NFC交易。

看起来在API中无法做到这一点。游民。您最好的选择是通知用户他们需要在设置中启用它,并可能启动设置意图。

编辑:以下内容来自源代码,但看起来他们不允许用户在API中实现这些方法(我对此感到困惑)。

我从android source code找到了这个来帮助启用和禁用适配器。

相关来源:

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;
}

答案 1 :(得分:3)

我通过反思来实现它

此代码适用于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按钮的状态会相应切换,因此在seetings菜单中手动执行时没有问题。

答案 2 :(得分:1)

如果您可以看到NfcService应用程序源代码,则有一个接口文件INfcAdapter.aidl。在文件中有两个API,即&#34; boolean enable()&#34;和&#34;布尔禁用()&#34;。您可以直接使用此API来通过Android应用程序启用和禁用NfcService。但这里的诀窍是你无法使用Android提供的SDK编译代码。您必须使用makefile编译应用程序。我已经成功构建了一个应用程序

答案 3 :(得分:0)

我希望此论坛可以帮助您解决此问题,以便清楚地了解NFC电源开/关API条件。

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