標籤:文章 color div cte api rom 安裝 程式 pack
最近鼓搗android,碰到個問題,因為沒有root許可權,需要調用Intent安裝apk,但需要擷取使用者是否安裝了(如,使用者點擊了返回或取消),查了很多文章,最後可以解決,但有瑕疵,解決方案如下:
public static void installPackage(Context context, File file, int requestCode) { // 安裝之前先記錄預先安裝APK檔案的名字,以用於返回結果時根據requestCode擷取安裝的apk packageName MainActivity.m_mapInstallApkData.put(requestCode, file.getName()); //gxj: 如果主介面沒有顯示,需要調出主介面到前台 Intent it1 = new Intent(context, MainActivity.class); it1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); context.startActivity(it1); //gxj: <span style="color:#ff0000;">不使用FLAG_ACTIVITY_NEW_TASK是因為無法擷取result</span>,同時又要保持多個apk(task)的安裝(FLAG_ACTIVITY_SINGLE_TOP / FLAG_ACTIVITY_PREVIOUS_IS_TOP) //<span style="color:#ff0000;">對於使用FLAG_ACTIVITY_SINGLE_TOP / FLAG_ACTIVITY_PREVIOUS_IS_TOP的情況,startActivityForResult只有在所有的安裝介面消失的時候才會有返回,且返回的resultCode都是0,疑惑,所以在返回後需要檢查否安裝成功的判斷</span> //不能使用Intent.FLAG_ACTIVITY_NEW_TASK是因為Intent.FLAG_ACTIVITY_NEW_TASK無法獲得返回的結果;不能使用Intent.FLAG_ACTIVITY_CLEAR_TOP是因為可能會有多個apk同時安裝 Intent it2 = new Intent(); it2.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP ); //或FLAG_ACTIVITY_PREVIOUS_IS_TOP it2.setAction(android.content.Intent.ACTION_VIEW); Uri path = Uri.fromFile(file); it2.setDataAndType(path, "application/vnd.android.package-archive"); context.startActivityForResult(it2, requestCode);}
在MainActivity中添加protected void onActivityResult(int requestCode, int resultCode, Intent data)處理
protected void onActivityResult(int requestCode, int resultCode, Intent data) { String strPackageName = null; if (m_mapInstallApkData != null) strPackageName = m_mapInstallApkData.remove(requestCode); //不知道為什麼,不管是否點擊安裝、取消,返回的resultCode都是0,即RESULT_CANCELED,待查 if (resultCode == RESULT_CANCELED) { if (!TextUtils.isEmpty(strPackageName)) { //需要重新檢查該packageName是否安裝了 //..做自己的處理 } }}
註:該程式有瑕疵,就是假如彈出安裝apk的框A和apk框B,點擊B的取消沒有反應,只有在A、B的安裝框都消失(點擊安裝或取消或返回)後才會有返回(分別返回了A和B的結果),解決方案還沒有找到,待
Android 擷取android安裝apk框的安裝狀態(如點擊取消、返回)