Android11 启动HostApduService
时间: 2024-05-17 16:17:43 浏览: 11
在 Android 11 中,启动 HostApduService 的方式与之前的版本有所不同。以下是启动 HostApduService 的步骤:
1. 在 AndroidManifest.xml 文件中声明 HostApduService。
2. 创建一个继承自 CardEmulation 类的类,并重写 onConnect() 和 onDisconnect() 方法,以便在与读卡器建立连接和断开连接时执行相应的操作。
3. 在应用程序的主活动中,使用 startActivity() 方法启动一个新的 Activity 并传递 ACTION_REQUEST_ENABLE_NFC 的 intent。这将提示用户启用 NFC。
4. 当用户启用 NFC 后,使用 CardEmulation.getInstance(NfcAdapter.getDefaultAdapter(context)) 获取 CardEmulation 实例,并使用 setDefaultServiceForCategory() 方法设置默认的 HostApduService。
5. 现在,当读卡器与设备建立连接时,系统将自动启动您的 HostApduService,并调用其 onConnect() 方法。
请注意,在 Android 11 中,您还需要将您的应用程序添加到“允许访问NFC”列表中,以便您的应用程序可以访问 NFC。您可以在“设置”应用程序中找到此选项。
相关问题
Android 11 如何启动 HostApduService
要启动一个 HostApduService,可以按照以下步骤进行:
1. 创建一个继承自 HostApduService 的服务类。
2. 在服务类中实现 onDeactivated() 方法来处理服务被停用时的情况。
3. 在服务类中实现 onCommandApduReceived(byte[] commandApdu, Bundle extras) 方法来处理接收到的 APDU 命令。
4. 在 AndroidManifest.xml 文件中注册服务,例如:
```xml
<service android:name=".MyHostApduService"
android:exported="true"
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>
```
其中,@xml/apduservice 是一个 XML 文件,用于指定服务的 AID(应用程序标识符)和其他配置信息。例如:
```xml
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_description"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aid_description"
android:category="payment">
<aid-filter android:name="F0010203040506"/>
</aid-group>
</host-apdu-service>
```
在这个 XML 文件中,我们指定了服务的描述信息、是否需要设备解锁,以及一个包含 AID 的组。如果一个 APDU 命令的 CLA 和 INS 字段匹配该组中的任何一个 AID,那么 onCommandApduReceived() 方法就会被调用。
注意:为了启动 HostApduService,你需要在 Android 设备上拥有 NFC 功能,并且该设备需要支持主机 APDU 卡模拟。此外,你还需要在 AndroidManifest.xml 文件中声明相应的权限。
Android11 代码实现启动HostApduService
要在Android 11上实现启动HostApduService,需要遵循以下步骤:
1. 创建一个继承自HostApduService的类,并重写onDeactivated()和onApduReceived()方法,用于处理接收到的APDU指令和卡片失活事件。
2. 在AndroidManifest.xml文件中注册该服务:
```xml
<service android:name=".MyHostApduService"
android:exported="true"
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>
```
其中,android:name属性指定服务类的完整路径,android:exported属性设置为true表示该服务可以被其他应用程序调用,android:permission属性设置为BIND_NFC_SERVICE表示该服务需要绑定到NFC服务。intent-filter标记和meta-data标记用于指定服务的类型和权限。
3. 在res/xml目录下创建一个名为apduservice.xml的文件,用于配置服务的APDU指令过滤器和卡片AID。例如:
```xml
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/app_name"
android:requireDeviceUnlock="false">
<aid-group android:description="My AID Group">
<aid-filter android:name="F012345678"/>
</aid-group>
<apdu-service-banner>
<banner>
<text>My Host Apdu Service</text>
<text>Version 1.0</text>
</banner>
</apdu-service-banner>
</host-apdu-service>
```
其中,aid-filter标记用于指定服务支持的卡片AID,apdu-service-banner标记用于设置服务的显示名称和版本号。
4. 在应用程序中启动NFC服务,并将其绑定到HostApduService。例如:
```java
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (nfcAdapter != null) {
nfcAdapter.enableReaderMode(this, new MyHostApduServiceCallback(), NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, null);
}
private class MyHostApduServiceCallback implements NfcAdapter.ReaderCallback {
@Override
public void onTagDiscovered(Tag tag) {
Intent intent = new Intent(getApplicationContext(), MyHostApduService.class);
startService(intent);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
}
```
其中,enableReaderMode()方法用于启动NFC服务,传入MyHostApduServiceCallback对象作为回调函数,在回调函数中启动和绑定HostApduService。
以上就是Android 11实现启动HostApduService的基本步骤,希望能对你有所帮助!
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)