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

Android 如何通过API启用NFC阅读器?,android,nfc,Android,Nfc,我有什么办法可以使用API启用Android NFC reader?因此显然没有办法从API启用NFC,即使Google在其源代码中这样做(见下文) 如果您查看API中的一行: 如果此NFC适配器已安装,则返回true 已启用任何功能 应用程序可以将其用作助手 建议用户 在NFC设置中 如果此方法返回false,则NFC 硬件保证不会产生 或回应任何NFC交易 在API中似乎没有办法做到这一点。真倒霉您最好的选择是通过一个对话框通知用户需要在设置中启用它,并可能启动一个设置 编辑:以下内容来自源

我有什么办法可以使用API启用Android NFC reader?

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

如果您查看API中的一行:

如果此NFC适配器已安装,则返回true 已启用任何功能

应用程序可以将其用作助手 建议用户 在NFC设置中

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

在API中似乎没有办法做到这一点。真倒霉您最好的选择是通过一个对话框通知用户需要在设置中启用它,并可能启动一个设置

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

我从中找到了这一点,以帮助启用和禁用适配器

有关资料来源:

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

我通过思考使它工作

这段代码在API15上运行,还没有对照其他版本进行检查

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
public boolean changeNfcEnabled(上下文上下文,boolean启用){
//打开/关闭NFC
最终布尔desiredState=已启用;
mNfcAdapter=NfcAdapter.getDefaultAdapter(上下文);
if(mNfcAdapter==null){
//不支持NFC
返回false;
}
新线程(“toggleNFC”){
公开募捐{
Log.d(标签,“将NFC启用状态设置为:“+desiredState”);
布尔成功=假;
NfcManagerClass类;
方法设置为启用,设置为禁用;
布尔Nfc;
如果(期望状态){
试一试{
NfcManagerClass=Class.forName(mNfcAdapter.getClass().getName());
setNfcEnabled=NfcManagerClass.getDeclaredMethod(“启用”);
setNfcEnabled.setAccessible(true);
Nfc=(布尔)setNfcEnabled.invoke(mNfcAdapter);
成功=Nfc;
}catch(classnotfounde异常){
}捕获(无此方法例外){
}捕获(IllegalArgumentException e){
}捕获(非法访问例外e){
}捕获(调用TargetException e){
}
}否则{
试一试{
NfcManagerClass=Class.forName(mNfcAdapter.getClass().getName());
setNfcDisabled=NfcManagerClass.getDeclaredMethod(“禁用”);
setNfcDisabled.setAccessible(true);
Nfc=(布尔)setNfcDisabled.invoke(mNfcAdapter);
成功=Nfc;
}catch(classnotfounde异常){
}捕获(无此方法例外){
}捕获(IllegalArgumentException e){
}捕获(非法访问例外e){
}捕获(调用TargetException e){
}
}
如果(成功){
Log.d(标记“成功地将NFC启用状态更改为”+desiredState);
}否则{
Log.w(标记,“将NFC启用状态设置为“+desiredState”时出错);
}
}
}.start();
返回false;
}//结束方法
但这需要2个权限,请将它们放入清单中:

 <!-- change NFC status toggle -->
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />


使用代码时,NFC按钮的状态会相应地切换,因此在seetings菜单中手动执行时不会出现问题。

如果可以看到NFC服务应用程序源代码,则会有一个接口文件INfcAdapter.aidl。文件中有两个API,即“布尔启用()”和“布尔禁用()”。您可以直接使用此API通过android应用程序启用和禁用NfcService。但这里的诀窍是,您不能使用Android提供的SDK编译代码。您必须使用makefile编译应用程序。我已经成功构建了一个应用程序

我希望本论坛能帮助您解决这个问题,并对NFC电源开/关API障碍有清晰的了解


真奇怪。我在javadoc或SDK中看不到enable()和disable()方法。此代码段与哪个SDK版本相关?如果用户禁用了它,请将其保留为禁用状态。欢迎您提示用户启用它,甚至引导用户进入设置屏幕,其中有NFC enabled复选框。公平地说,当您不知道这里正在开发的应用程序时,这个答案有点短视。据你所知,GetUsername正在开发一些东西,允许用户根据应用程序中的规则打开/关闭NFC。我相信在这种情况下,用户会或多或少地意识到他的行为。谷歌可以考虑并实施它的许可,而不是把所有东西都锁起来。如果我有一部API 15手机,我会测试它,但现在我相信你的话,这是有效的,并且已经测试过了。@johnlehey是的,非常有效。无论如何,我必须对照其他API进行检查,我将尝试发回它的运行情况。谢谢你的回答,这就是我找到解决方案的原因。嗯,我忘了考虑这样一个事实:这当然只适用于根设备!除非应用程序作为系统应用程序安装,否则无法写入安全设置或设置。API级别16以后,这将不起作用,因为权限“android.permission.write_secure_settings”仅允许系统应用程序。