在做應用自動更新模組下載apk時遇到了內部儲存和sd卡儲存兩種情況,存在sk卡中儲存apk可以正常安裝,可是在內部儲存中安裝apk時出現了parse error的問題。
在網上搜了搜,大致分為兩種方案:
1、在儲存時給檔案設定許可權
2、在使用檔案之前變更檔許可權
起初思路並沒有理清,就開始嘗試,多次嘗試之後問題仍沒有解決,再請教了大牛之後才開始一點點分析。
首先使用普通的檔案讀寫
File apkFile = new File(mSavePath, appName); FileOutputStream fos = new FileOutputStream(apkFile);
然後使用方式情節2:
String chmodCmd = "chmod 666 " + apkfile.getAbsolutePath(); try { Runtime.getRuntime().exec(chmodCmd); } catch (Exception e) { } Intent i = new Intent(Intent.ACTION_VIEW); String filePath = "file://" + apkfile.toString(); i.setDataAndType(Uri.fromFile(apkfile),"application/vnd.android.package-archive"); mContext.startActivity(i);
問題解決了。
回過頭來看方案一問什麼不起作用,當我看檔案時很吃驚,命名檔案是下載下倆了,可是調用完了以後檔案大小為0了,發現FileOutputStream fos = mContext.openFileOutput(appName,Context.MODE_WORLD_READABLE| Context.MODE_WORLD_WRITEABLE);在存檔案和調用apk安裝代碼之前分別使用了一次,openFileOutput方法再次調用導致檔案內容被清空,只需要在寫檔案的時候把檔案許可權置為讀寫權限便可。
String fileName = "tmp.apk";
FileOutputStream fos = openFileOutput(fileName,
MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);
// write the .apk content here ... flush() and close()
// Now start the standard instalation window
File fileLocation = new File(context.getFilesDir(), fileName);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(fileLocation),
"application/vnd.android.package-archive");
context.startActivity(intent);