2012-09-24 160 views
0

我在安裝保存在Android內部緩存中的APK時遇到問題。 使用context.getExternalCacheDir()將文件保存在外部存儲或外部緩存中沒有問題。從Android緩存安裝.APK

但是,如果我嘗試使用context.getCacheDir(),日誌返回

/data/data/com.my.package/cache/update.apk:打開失敗:EACCES(權限否認)

   File file = context.getCacheDir(); 

       File outputFile = new File(file, "update.apk"); 
       if(outputFile.exists()){ 
        outputFile.delete(); 
       } 

       FileOutputStream fos = new FileOutputStream(outputFile); 


       InputStream is = c.getInputStream(); 

       byte[] buffer = new byte[1024]; 
       int len1 = 0; 
       while ((len1 = is.read(buffer)) != -1) { 
        fos.write(buffer, 0, len1); 
       } 
       fos.close(); 
       is.close(); 

       Intent intent = new Intent(Intent.ACTION_VIEW); 

       //SAVE IN CACHE 
       intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive"); 

       intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error! 
       context.startActivity(intent); 

它看起來像內部緩存不允許APK被正確讀取。

事實是,如果文件保存在外部存儲或外部緩存中,APK將提供給用戶,我不希望這樣。

有什麼可以不把文件保存在內部緩存?

感謝

回答

3

它看起來像內部緩存中沒有按不允許APK正確讀取。

這是因爲安裝程序應用程序無權讀取您的文件。

事實是,如果文件保存在外部存儲或外部緩存中,APK將提供給用戶,我不希望這樣。

然後不要將其安裝在用戶的設備上。任何用戶都可以在安裝後的任何時間將任何APK從設備上覆制下來,因此阻止用戶訪問APK的唯一方法是首先不要在設備上安裝它。

什麼可以不保存文件在內部緩存?

可能沒什麼。如果切換到openFileOutput(),則可以看到MODE_WORLD_READABLE足以讓安裝程序繼續。同樣,這不會阻止用戶訪問APK文件。

+0

但我發現Google Play使用內部緩存來保存.apks,所以我認爲這可能會以某種方式進行。 「 」事實上,如果文件保存在外部存儲或外部緩存中,則APK將提供給用戶,我不希望這樣。「說到這一點,我的意思是我不想讓.APK在外掛的外掛設備上清晰可見,但很顯然apk必須存儲在某個地方纔能安裝它。 – Mariux

+0

@Mariux:請記住,Google Play是操作系統的一部分,而您的應用不是。 – CommonsWare

+0

如果我想使用內部存儲方法,我該如何從中讀取文件? – Mariux

0

嘗試一下chmod命令來獲取讀取內部文件夾\寫權限。至於Linux的樣子......

chmod 777 /data/data/*** or chmod 644 /data/data/*** 
+0

充其量,這隻能在根植設備上完成,並不是一個特別明智的想法,出於安全原因。 – CommonsWare