安卓获取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号的权限的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux游戏崛起了?微软《我的世界》已
- 下一篇: android odex版本调试_And