无法使用use_ICC_AUTH_WITH_DEVICE_IDENTIFIER权限签名的Android应用程序



对于我的用例,我需要从android设备中提取不可重置的硬件信息,如IMEI、MAC。

根据android文档获取IMEIhttps://developer.android.com/reference/android/telephony/TelephonyManager#getImei(int)

它说,如果满足以下要求之一,就可以调用该方法。我正在努力满足。如果调用应用程序已被授予USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER权限。

根据API许可文件https://developer.android.com/reference/android/Manifest.permission#USE_ICC_AUTH_WITH_DEVICE_IDENTIFIER该权限具有保护级别签名或apops

因此,我将继续进行签名保护级别。因此,我正在创建一个签名应用程序,并在我的Android设备谷歌像素5A上运行,该设备运行在Android 12上。

当我运行这个代码时;用户10240不满足访问设备标识符的要求"安全异常

2022-06-30 12:09:53.703 23348-23348/com.android.dataextraction E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.dataextraction, PID: 23348
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.dataextraction/com.android.dataextraction.LauncherActivity}: java.lang.SecurityException: getImeiForSlot: The user 10240 does not meet the requirements to access device identifiers.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.SecurityException: getImeiForSlot: The user 10240 does not meet the requirements to access device identifiers.
at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)
at android.os.Parcel.createException(Parcel.java:2409)
at android.os.Parcel.readException(Parcel.java:2392)
at android.os.Parcel.readException(Parcel.java:2334)
at com.android.internal.telephony.ITelephony$Stub$Proxy.getImeiForSlot(ITelephony.java:12142)
at android.telephony.TelephonyManager.getImei(TelephonyManager.java:2088)
at android.telephony.TelephonyManager.getImei(TelephonyManager.java:2043)
at com.android.dataextraction.LauncherActivity.onCreate(LauncherActivity.java:44)
at android.app.Activity.performCreate(Activity.java:8051)
at android.app.Activity.performCreate(Activity.java:8031)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792) 
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:201) 
at android.os.Looper.loop(Looper.java:288) 
at android.app.ActivityThread.main(ActivityThread.java:7839) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

我正在使用一个已签名的应用程序进行测试。这是我的身材。Gradle配置

signingConfigs {
config {
keyAlias 'AndroidKey'
keyPassword '**********'
storeFile file('../android.jks')
storePassword '********'
}
}
buildTypes {

debug {
signingConfig signingConfigs.config
debuggable true
}
}

对应用程序进行签名没有问题。

我不确定为什么签名保护级别不允许我访问设备标识符

再来看看签名保护的定义

只有当请求的应用程序使用与声明的应用程序相同的证书进行签名许可。如果证书匹配,系统会自动在不通知用户或要求用户的明确批准。

除非您的应用程序使用谷歌的密钥库(与为您的固件签名的提供商相同的密钥库)进行签名,否则它无法访问签名级别的权限。

最新更新