【问题标题】:HCE service and BIND_NFC_SERVICE permissionHCE 服务和 BIND_NFC_SERVICE 权限
【发布时间】:2018-05-18 13:06:34
【问题描述】:

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

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

问题: 该应用是在运行 Android 5.1.1 的 NEXUS 4 上开发的。当我在我的办公桌上安装了更新的支持 NFC 的手机来测试应用程序时。 它们都是 Android 6 或更新版本。他们都不是在使用我的应用程序。似乎没有授予 BIND_NFC_SERVICE 权限。由于自 Android 5 到 6 更新以来处理权限的方式发生了变化,我实现了Android developer request app permissions 提到的新方法(我还在这里查看了相关帖子)。该许可只是被拒绝,没有进一步的信息。在 NFC 接口上,试图通过 AID 选择应用程序的 APDU 返回 6999 表示不允许该操作。

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

似乎 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')
}

感谢您的帮助!

【问题讨论】:

    标签: android permissions nfc android-permissions hce


    【解决方案1】:

    BIND_NFC_SERVICE 权限

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

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

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

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

    错误 6999

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

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

    【讨论】:

    • 很高兴知道,不需要请求该许可。我在清单文件中添加了 'android:exported="true"' 语句,但没有任何效果。我的应用程序未标记为支付应用程序,并且未在设备的设置中列出。我搜索了有关安全元素的选项但没有成功。由于我注意到link 在 4 月 24 日发生了变化,我放弃并创建了一个完整的新测试应用程序(代码似乎也没有什么不同)。这也没有改变或成功。
    • @engineer0815 您可能仍想在此处发布 apduservice.xml 文件的内容。
    • 当然对不起:&lt;host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/servicedesc" android:requireDeviceUnlock="false"&gt; &lt;aid-group android:description="@string/aiddescription" android:category="other"&gt; &lt;aid-filter android:name="F0010203040506"/&gt; &lt;/aid-group&gt; &lt;/host-apdu-service&gt;
    • 您确实在设备解锁且前台没有应用程序时尝试与您的 HCE 服务通信,对吗?
    • 是的,正如我所写,它已经可以在 Android 5 设备上运行。这就是我首先想到权限问题的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2012-07-03
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    相关资源
    最近更新 更多