Android中以编程方式设置HCE的NFC_PAYMENT_FOREGROUND设置
关于前台Activity设置支付卡优先级的问题解答
我之前也碰到过一模一样的坑!折腾了好一阵才摸清楚这里面的门道,给你捋捋解决方案:
首先得明确:categoryAllowsForegroundPreference()返回true的前提,是系统设置里的「NFC_PAYMENT_FOREGROUND」(也就是你截图里的「前台优先级」开关)处于开启状态。这个开关是系统级控制项,直接决定了前台应用能不能修改支付卡的优先级。
关于编程修改这个系统设置的可能性
这个设置属于安全设置范畴,普通第三方应用是没有权限直接修改的——它需要android.permission.WRITE_SECURE_SETTINGS权限,而这个权限默认只授予系统应用或者经过设备厂商签名认证的应用,普通APP就算在Manifest里声明了这个权限,也没法获取到。
分两种情况给你具体方案:
1. 如果你是系统应用/拥有厂商签名权限
可以直接通过代码修改这个设置,步骤如下:
- 在Manifest中添加权限声明:
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" /> - 用
Settings.Secure类修改设置值(1代表开启,0代表关闭):try { // 开启前台优先级开关 Settings.Secure.putInt(getContentResolver(), "nfc_payment_foreground", 1); } catch (SecurityException e) { // 捕获权限异常并做相应处理 e.printStackTrace(); }
2. 如果你是普通第三方应用
没办法直接编程修改这个设置,只能引导用户手动开启。可以通过Intent跳转到NFC支付设置页面,再提示用户操作:
- 跳转设置页面的代码:
Intent nfcPaymentSettingsIntent = new Intent(Settings.ACTION_NFC_PAYMENT_SETTINGS); startActivity(nfcPaymentSettingsIntent); - 同时给用户弹出提示,比如:「请在设置页面中开启「前台优先级」开关,之后即可设置支付卡优先级」
额外提醒
在调用setPreferedPaymentService()之前,最好先检查categoryAllowsForegroundPreference()的返回值,避免无效调用:
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter != null && nfcAdapter.categoryAllowsForegroundPreference(NfcAdapter.CATEGORY_PAYMENT)) { // 可以正常调用setPreferedPaymentService() ComponentName componentName = new ComponentName(this, YourPaymentService.class); nfcAdapter.setPreferredPaymentService(this, componentName); } else { // 引导用户开启开关 // ... }
内容的提问来源于stack exchange,提问作者jraic
相关产品推荐
相关产品推荐

