安卓获取imei权限闪退_Android10 下获取序列号和IMEI号的权限
介绍
Android10 因为提高了其安全性能,因此获取序列号和IMEI号的权限与以前的版本有了变化这里就举例Zebra 移动设备Android 10 系统下的如何获取相应权限。运行Android 10的移动计算机上访问序列号和IMEI号的过程。需要明确授予您的应用程序访问这些设备标识符的权限,这可以通过以下三种方式之一进行:
通过StageNow 的AccessManager授权
通过您的应用程序,使用EMDK配置文件管理器。
方法1,使用StageNow 授权应用程序权限
方法1使用的样例可以从下面网盘下载
链接:https://pan.baidu.com/s/1-bk8jUfucTe8ZOGy4PVz2w
提取码:zebr
步骤1,首先需要在程序的AndroidManifest.xml添加一条权限申明
步骤2,通过Zebra的App 签名工具SigTools来提取APK安装包的签名证书,下载链接如下(后面打包样例中也有该工具)
https://techdocs.zebra.com/emdk-for-android/latest/samples/sigtools/
SigTools的命令行格式如下,这里以从app.apk文件中提取证书文件,并将其命名为app.crt为例
java -jar SigTools.jar getcert -inform apk -outform der -in app.apk -outfile app.crt
在StageNow中新建一个配置文件,由于Android10的MX版本较高,建议选择MX9.3 以上(已测试通过)
Wizard选择最下面的XpertMode
在SETTINGS中选择AccessMgr
由于获取SN和IMEI的Service标识不同,如果需要同时授权获取这两个信息,可以再次点击选择AccessMgr,再在CONFIG里添加一个AccessMgr,这里我们先只添加一个
1. Service Access Action选择为 Allow Caller to Call Service
2.这里填写要授权的服务标识
如果要授权获取SN,填写以下标识内容
content://oem_info/oem.zebra.secure/build_serial
如果要授权获取IMEI,填写以下标识内容
content://oem_info/wan/imei
如果要允许您的应用同时访问这两者,则需要声明在AccessManager的设定两个不同实例。
3.这里填写应用程序的包名(小建议:如果不确定包名,可以在安装了该程序后,通过Datawedge的配置文件添加关联程序的功能来查看应用的包名
4. 点击这里,打开文件浏览窗口,选择之前提取生成签名证书文件
我们来对比一下效果
方法2:授予使用EMDK配置文件管理器通过您的应用程序访问设备标识符的权限。
方法二中引用的示例应用程序可在以下位置找到:
https://github.com/ZebraDevs/OEMIdentifiers-Java-Sample
下面是参考过程:
构建MX XML(使用程序包名称和以编程方式生成的程序包签名)
从EMDK初始化ProfileManager
使用ProfileManager处理XML
在示例应用程序中,我们使用一些关键类来实现此功能:
XML类
使用包名称和签名创建MX XML
PackageManagerHelper.class
用于生成我们的应用程序签名的Base64编码
PermissionsActivity.class
使用ProfileManager API处理XML。
建立MX XML
我们首先要做的是生成要传递给ProfileManager API的XML,该XML将为您的应用程序授予必要的权限。
核心XML如下所示,其中包名称和签名的占位符分别为:
上面是授予串行权限所需的XML,在“ ServiceIdentifier”标签下表示。以下是授予IMEI权限所需的XML:
在应用此XML之前,我们需要填补“包名称和签名”的空白。
直接生成包名称,只需从有效的Context调用getPackageName()即可。
获取包签名的过程稍微有些复杂:首先,我们使用getApkContentsSigners()获取APK签名,然后,将其转换为Base64 –利用Apache Commons Hex和Base64库通过将签名转换为char来实现这一点。数组,将其解码为字节数组,最后编码为Base64:
public static String getSigningCertBase64(Context cx) throws PackageManager.NameNotFoundException, DecoderException { //convert String to char array (1st step) char[] charArray = getSigningCertificateHex(cx)[0].toChars();
// decode the char array to byte[] (2nd step) byte[] decodedHex = Hex.decodeHex(charArray);
// The String decoded to Base64 (3rd step) return Base64.encodeBase64String(decodedHex);}
@SuppressWarnings("deprecation")@SuppressLint("PackageManagerGetSignatures")public static Signature[] getSigningCertificateHex(Context cx) throws PackageManager.NameNotFoundException { Signature[] sigs; SigningInfo signingInfo; signingInfo = cx.getPackageManager().getPackageInfo(cx.getPackageName(), PackageManager.GET_SIGNING_CERTIFICATES).signingInfo; sigs = signingInfo.getApkContentsSigners(); return sigs;}
我们将所有这些功能放到XML类中–在构造函数中,我们对上述API进行了两次调用,以获取包签名和名称。然后,我们将这些值存储为类中的成员变量:
// Holdersprivate String mPackageSignatureHex;private String mPackageName;
public XML(Context context) throws PackageManager.NameNotFoundException, DecoderException { mPackageSignatureHex = PackageManagerHelper.getSigningCertBase64(context); mPackageName = context.getPackageName();}
当我们的应用程序需要XML授予权限(Serial和IMEI)时,我们可以简单地调用getSerialPermissionXml()和getImeiPermissionXml()方法,并且将为我们填充值,如下所示:
public String getSerialPermissionXml() { return "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "";}
public String getImeiPermissionXml() { return "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "";}
至此,我们已经准备好将两组XML字符串传递给ProfileManager API,以将这些权限授予我们的应用程序。
初始化Profile Manager实例
在应用任何XML之前,我们首先需要从EMDK初始化ProfileManager的实例。在示例应用程序中,这是在PermissionsActivity类中完成的。我们使用startActivityForResult()从MainActivity启动此活动,因此可以将授予权限的成功/失败通知给我们。
在继续之前,请确保已将EMDK添加到build.gradle文件中:
// EMDKimplementation 'com.symbol:emdk:7.6.10'
现在,我们可以在活动中初始化EMDK:
// Init EMDKEMDKResults emdkManagerResults = EMDKManager.getEMDKManager(this, this);
这两个参数分别是上下文和EMDKListener回调,它们已在PermissionsActivity.class中实现。当EMDK实例准备就绪时,将在onOpened()回调中通知我们,然后我们可以在其中获取ProfileManager对象的实例:
@Overridepublic void onOpened(EMDKManager emdkManager) { // Assign EMDK Reference mEmdkManager = emdkManager;
// Get Profile & Version Manager Instances mProfileManager = (ProfileManager) mEmdkManager.getInstance(EMDKManager.FEATURE_TYPE.PROFILE);
// Apply Profile if (mProfileManager != null) { try { // Init XML XML permissionXml = new XML(this);
// Process new ProcessProfile(XML.GRANT_SERIAL_PERMISSION_NAME, mProfileManager, onProfileApplied) .execute(permissionXml.getSerialPermissionXml());
// Process new ProcessProfile(XML.GRANT_IMEI_PERMISSION_NAME, mProfileManager, onProfileApplied) .execute(permissionXml.getImeiPermissionXml());
} catch (PackageManager.NameNotFoundException | DecoderException e) { e.printStackTrace(); } } else { Log.e(TAG, "Error Obtaining ProfileManager!"); Toast.makeText(this, "Error Obtaining ProfileManager!", Toast.LENGTH_LONG) .show(); }}
如您在上面的代码示例中所看到的,我们通过调用getInstance API并通过FEATURE_TYPE.PROFILE作为唯一参数从emdkManager中获取ProfileManager的实例。
一旦获得了ProfileManager的实例,就可以利用一个名为ProcessProfile的实用程序类,它将为我们异步处理(使用AsyncTask)此配置文件,并在onProfileApplied回调中通知完成。请注意,我们必须执行两次此操作-一次是授予IMEI编号许可,一次是授予序列号许可,因此我们需要在回调中执行检查以确保两个配置文件均得到处理:
private OnProfileApplied onProfileApplied = new OnProfileApplied() {
// Holder - this is needed because we can't apply two access manager permissions in a single profile int numberOfResults = 0; int numberOfPermissionsToGrant = 2;
// Return Intent for StartActivityForResult Intent resultIntent = new Intent();
@Override public void profileApplied(String statusCode, String extendedStatusCode) { // Update Results Holder if (++numberOfResults == numberOfPermissionsToGrant) { resultIntent.putExtra(PERMISSIONS_GRANTED_EXTRA, true); resultIntent.putExtra(PERMISSIONS_STATUS_CODE, statusCode); resultIntent.putExtra(PERMISSIONS_EXTENDED_STATUS_CODE, extendedStatusCode); setResult(RESULT_OK, resultIntent); finish(); } }
@Override public void profileError(String statusCode, String extendedStatusCode) { resultIntent.putExtra(PERMISSIONS_GRANTED_EXTRA, false); resultIntent.putExtra(PERMISSIONS_STATUS_CODE, statusCode); resultIntent.putExtra(PERMISSIONS_EXTENDED_STATUS_CODE, extendedStatusCode); setResult(RESULT_OK, resultIntent); finish(); }};
在回调中通知我们两个权限均已授予后,我们将通知调用活动并完成权限活动。
现在,我们可以返回MainActivity并访问“序列号和IMEI号”权限
如果您想了解有关如何使用我们的内容提供程序访问这些权限的更多详细信息,
请参阅RetrieveOEMInfo.class或 达里·坎贝尔(Darryn Campbell)的分享: https://developer.zebra.com/blog/access-serial-number-and-imei-mobile-computers-running-android-10
**同时感谢 Wang,Jian 提供的方法1和演示程序
谢谢你的关注和转发
欢迎收藏
安卓获取imei权限闪退_Android10 下获取序列号和IMEI号的权限相关推荐
- Android9获取权限闪退,Android 9.0 关于ACTION_CALL无权限导致闪退的问题
Android 9.0 关于ACTION_CALL无权限导致闪退的问题 18年年底毕业,开始从事android研发,对application层有兴趣,于是自学使用Android studio对app的 ...
- 笔记本win7系统安装vm虚拟机安卓5.1系统软件闪退求助大神
本人笔记本win7系统安装vm虚拟机安卓5.1系统出现软件闪退问题,软件在雷电模拟器上运行正常,用安卓虚拟机上就不行了,能打开网页,加速器能安装但是闪退,QOOapp能打开部分页面但下载不了游戏.哪位 ...
- 苹果手机白屏_安卓卡顿苹果闪退,手机换代的动力原来是这些
一般手机使用大约两年之后,就会明显感觉流畅度大不如从前.这种现象以前在安卓手机上比较常见,但其实是以流畅著称的苹果iPhone用久了也会体验变差,甚至出现了闪退.白屏等现象.想要搞懂其中的原因,我们不 ...
- autocad2014点击保存闪退_win10下autocad2014闪退怎么解决?-解决win10下autocad2014闪退的方法 - 河东软件园...
autocad是一大家用来设计图纸的专业工具,由于它既能设计二维图纸,也能设计三维图纸,所以被广泛的应用在建筑.装潢等领域.小编的朋友最近也开始学习使用这款软件,虽然安装的时候没有出现任何的问题,可是 ...
- autocad2014点击保存闪退_windows10下AutoCAD 2014打开出现闪退怎么办
因为工作需求,一位用户在windows10正式版系统电脑中安装了AutoCAD 2014软件.本来使用的好好的,可是经过一次系统更新后,发现AutoCAD 2014打开会出现闪退的情况.这该怎么办呢? ...
- 孤岛惊魂3闪退win10win11下运行办法
工作之余娱乐,电脑配置 i5的11代+RTX3050T, 下载一个单机游戏<孤岛惊魂3>,结果wind10下面闪退,后更新为win11,显卡驱动都更新了,然后玩几分钟还是闪退,玩一会闪退, ...
- 微信登录界面安卓代码_【雷电说明书】安卓模拟器微信登录闪退,转圈,停止运行解决方法...
雷电模拟器微信登录不上,微信闪退,模拟器微信停止运行等等问题一直在论坛出现,雷电模拟器最新版本已经解决了大部分的微信登录问题了.还是会有小部分伙伴出现了难以解决的问题,微信停止运行一般是建议安装最新雷 ...
- 微信登录界面安卓代码_安卓模拟器微信登录闪退,转圈,停止运行解决方法
雷电模拟器微信登录不上,微信闪退,模拟器微信停止运行等等问题一直在论坛出现,雷电模拟器最新版本已经解决了大部分的微信登录问题了.还是会有小部分伙伴出现了难以解决的问题,微信停止运行一般是建议安装最新雷 ...
- 安卓访问网络超时闪退? 安卓如何访问网络?求解
使用HttpURLConnection发送请求获取返回数据,网络连接请求超时会发生闪退. 可能的原因有两种 返回的网络连接为空,后续通过该连接调用获取返回码或者获取返回数据等方法时会发生空指针错误造成 ...
最新文章
- [Android Pro] AndroidX重构和映射
- 树莓派练习程序(火焰检测)
- WinCE 和Win Mobile的关系
- nginx 502错误 upstream sent too big header while reading response header from upstream
- grub安装的 三种安装方式
- 关于知识图谱,各路大神最近都在读哪些论文?
- win10磁盘检查命令
- abp的权限与导航菜单的关系
- 怎样在数组末尾添加数据_如何利用C++实现可变长的数组?
- java 压缩gz_如何在Java中将.zip压缩为.gz?
- UC浏览器电脑版怎么开启免费WiFi
- 相机下载_相机拍摄控制工具
- Css学习总结(3)——CSS布局解决方案 - 水平、垂直居中、多列布局、全屏布局
- 为何大数据分析那么重要
- 零基础如何入门学习原画?速收藏
- EBT 道客巴巴的加密与破解 - 实用组合工具箱
- 记:解决We‘re sorry but ... doesn‘t work properly without JavaScript enabled. Please enable it to contin
- python前缀_【python刷题】前缀和
- 使用CSDN-markdown编辑器入门
- 算法转 Java 后端,2021秋招斩获腾讯、京东、百度等大厂 offer 面经分享
热门文章
- Scala里List(1,2,3)和(1,2,3)的区别
- SAP FSM 学习笔记(二) : SAP FSM的微信接入
- 如何通过js文件的名称,反查出这个js文件所在project的artifact id和group id
- 如何处理CRM_ORGMAN 300 error message
- SE37 test sequence - 在同一个main session内依次执行function module
- Spring component detection logic
- 使用openSSL构造一个支持https的nodejs服务器
- SAP CRM Reference类型下拉菜单里的值是从哪里取出的
- 运行npm update等命令出错后如何分析问题根源
- php redis微信发红包,高阶篇二 使用Redis队列发送微信模版消息