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 设置(开/关)的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Android Q 中打开设置面板?

以编程方式更改 android 设置“计划开机和关机”

Android:根据用户设置以编程方式更改 SourceSet

手机nfc功能怎么打开

Android:如何通过通知下拉菜单检测设置何时更改?

以编程方式更改系统显示大小 Android N