gpt4 book ai didi

android - HCE 服务和 BIND_NFC_SERVICE 权限

转载 作者:行者123 更新时间:2023-11-29 02:29:28 30 4
gpt4 key购买 nike

首先,我对编写 Android 应用程序还很陌生。我的编程语言是Java。我在网上搜索了解决方案,问了其他程序员没有解决方案。

情况:我开发了一个使用 HCE 服务的应用程序。此应用程序由另一台设备触发,并使用 ISO 7816-4 APDU 命令传输数据。一切都按预期工作,并且使用 AID 选择了应用程序。

问题:该应用程序是在运行 Android 5.1.1NEXUS 4 上开发的。当我在 table 上拿到更新的支持 NFC 的手机来测试应用程序时。它们都是 Android 6 或更高版本。他们中没有人在使用我的应用程序。似乎未授予 BIND_NFC_SERVICE 权限。由于 Android 5 到 6 更新后权限处理方式发生了变化,我实现了 Android developer request app permissions 提到的新方法(我还检查了这里的相关帖子)。权限被拒绝,没有更多信息。在 NFC 界面上,APDU 试图通过其 AID 选择应用程序时返回 6999,表示不允许该操作。

在 root 手机上,我可以看到权限被拒绝,我尝试手动授予它。但每次启动应用程序后,它都会再次被拒绝,应用程序永远无法使用它。

似乎 HCE 服务本身必须请求许可,但如何?

您可以在下面找到我的 AndroidManifest.xml 和 build.gradle。我还尝试更改为更高的 API 级别。

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.XXXXXXXX.hce_tests">

<uses-feature
android:name="android.hardware.nfc"
android:required="true" />
<uses-feature
android:name="android.hardware.nfc.hce"
android:required="true" />
<uses-permission android:name="android.permission.BIND_NFC_SERVICE"/>
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>

<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>

<service
android:name=".MyHostApduService" android:permission="android.permission.BIND_NFC_SERVICE">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE" />
</intent-filter>

<meta-data
android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/apduservice" />
</service>

<activity android:name=".AutoTuneInterface"></activity>
</application>

</manifest>

build.gradle

android {
compileSdkVersion 23
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.example.XXXXXXXX.hce_tests"
minSdkVersion 19
targetSdkVersion 22
versionCode 1
versionName "1.0"
testInstrumentationRunner
"android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-
core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
implementation project(':GraphView')
}

感谢您的帮助!

最佳答案

BIND_NFC_SERVICE 权限

您不应该从您的应用请求权限 BIND_NFC_SERVICE。此权限为 NFC 系统服务保留,并且此服务应该是唯一拥有该权限的应用程序。

相反,当应用程序尝试绑定(bind)您的 HCE 服务组件时,您的应用程序需要强制执行此权限。你已经这样做了

<service android:name=".MyHostApduService"
android:permission="android.permission.BIND_NFC_SERVICE"

这样,Android 可以防止其他(恶意)应用将 APDU 注入(inject)您的 HCE 服务,因为没有(恶意)应用可以绑定(bind)到您的 HCE 服务。

错误 6999

为什么 Android 没有检测到您的 HCE 服务并返回 6999 以指示未找到 AID,这是一个更棘手的问题。我可以想到几个原因:

  • 您的服务未明确标记为已导出(将属性 android:exported="true" 添加到服务组件)。然而,这应该无关紧要,因为 HCE 服务还声明了一个意向过滤器,它隐式地将导出的属性设置为真。
  • 如果您的应用被标记为支付应用(在 apduservice.xml 中),您需要确保它是所选的支付应用(“设置”应用中的“触碰支付”)。
  • 有些设备似乎并不同时支持 HCE 和安全元素,并且在“设置”应用中的某处(可能也在触碰付款设置中)有一个开关可以在安全元素和 HCE 之间进行选择。

关于android - HCE 服务和 BIND_NFC_SERVICE 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50412026/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com