HCE服务和BIND_NFC_SERVICE权限

时间:2018-05-18 13:06:34

标签: android permissions nfc android-permissions hce

首先,我是编程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 ,这意味着不允许该操作。

在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')
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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服务还声明了一个intent过滤器,它隐式地将导出的属性设置为true。
  • 如果您的应用被标记为付款应用(在apduservice.xml中),则需要确保它是所选的付款应用(“设置”应用中的“点按并付款”)。
  • 某些设备似乎并不支持HCE和安全元素并且可以在“设置”应用中的某个位置选择安全元素和HCE(可能也在“点按和付费”设置中)。