2011-03-31 18 views
7

Web sayfasından indirilen dosyayı yükleyip Context.getCacheDir() içine koyarım. Ben HttpURLConnection tarafından dosya indiriyorum - ben aslında kod üzerinde sormadım (bu tamamen çalışıyor), bu yüzden burada gönderme değilim. İndirmeyi başarılı bir şekilde başlatıyorum. Dosya önbelleğe yüklenir ve daha sonra yükleme kurulur - ancak sistem APK'mı açamaz ve analiz hatasını yazar. aşağıdaki gibiAndroid - zip arşivi açamadı

Dolayısıyla sorun şu:

03-31 16:48:43.740: INFO/ActivityManager(59): Start proc com.android.packageinstaller for activity com.android.packageinstaller/.PackageInstallerActivity: pid=620 uid=10026 gids={} 
03-31 16:48:44.749: WARN/zipro(620): Unable to open zip '/data/data/com.my.app/cache/myApp.apk': Permission denied 
03-31 16:48:44.749: DEBUG/asset(620): failed to open Zip archive '/data/data/com.my.app/cache/myApp.apk' 
03-31 16:48:44.930: WARN/PackageParser(620): Unable to read AndroidManifest.xml of /data/data/com.my.app/cache/myApp.apk 
03-31 16:48:44.930: WARN/PackageParser(620): java.io.FileNotFoundException: AndroidManifest.xml 

Sorun - Ben programaticaly/önbellek erişim iznine sahip değildir. Bunu çözmek için herhangi bir yolu var mı? Harici depolama alanını bir indirme dizini olarak kullanmak istemiyorum (dosyayı harici depolama birimine yüklediğimde yükleme işlemi çalışıyor), önbellek harika çünkü dosya, dosya yöneticisi için genel kullanıcı tarafından erişilebilir olmayacak ve istediğim şey bu. Düşüncelerin için teşekkürler.

Bu sorun artık bir ay boyunca benim için çözümsüz olmuştur

...

Düzenleme: Hala çözüm, ben 1 şey bulduğunu düşünmeye çalışıyorum, o Android

ile mümkün değildir

Edit2: Kötü görüntülenmiş olmalıyım - İndirilen APK'm önbellekte var ... Yüklemeye izin vermek için hala bir izin yok mu? Ben neler olduğunu görmek

+0

kullanmayı denediniz mi? 'openFileOutput() '.... değilse,' MODE_WORLD_READABLE ' – Panthro

+0

ile deneyin. Yukarıdaki sorunun çözümünü buldunuz mu? Şimdi benzer bir düzeltme yapıyorum. – CodeGuru

+0

Bu yorumdaki hemen hemen her yanıtta "WORLD_WRITABLE" önerdim. YAPTIRIN ** KAYIT OLMAKSIZIN, testin problem olduğu problemi dışında. – domen

cevap

1

..

önbellek dir dahili bellek yetersiz olmaya başlar en kısa sürede temizlenebilir anlamına Android tarafından yönetilen bir önbellek vardır. Uygulamanız duraklatıldığında/durdurulduğunda önbelleğe alma dizininizi temizleyebilirse, uygulamanız bir önbellekte çok fazla yer kaplıyorsa (bir APK'nın muhtemelen yapması muhtemeldir) VE UYGULAMA ALANLARI

Bunu yapmak için, yaptığınız gibi, yükleme işlemi başladığında DDMS'yi açıp dosyanızın önbellekte olup olmadığına bakın.

Değilse, android artık uygulamanın önbelleğini temizledi çünkü artık çalışmıyor.

path = your_apk_file_path_in_cache_dir; 
permission="666"; 

try { 
    String command = "chmod " + permission + " " + path; 
    Runtime runtime = Runtime.getRuntime(); 
    runtime.exec(command); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

Merhaba, ben aslında Context.getCacheDir() kullanıyorum ve indirilen uygulamayı ADB'de bir önbellekte göremiyorum ... sistem güncelleme yapıldıktan hemen sonra silmeye benziyor ... – Waypoint

+0

context.getFilesDir() için aynı getCacheDir() için - hiçbir sorun yok – Waypoint

+0

sorun ... bu apk büyüklüğünü biliyor musunuz? Dahili bir depoda saklanmak için çok büyük görünüyor ...sdcard içinde saklamanız gerekir .... install ... sonra sil. – Panthro

6

chmod 666 denemek yerine context.getCacheDir(), kullanıcıya en farklı bir yaklaşım deneyin yardımcı olabilir:

FileOutputStream fOutputStream = context.openFileOutput(
    fileName, Context.MODE_WORLD_READABLE); 
+0

ile saklarım. Teşekkürler .. Bu komutu çalıştırdıktan sonra, paket yükleyicisi açılabilir. indirilmiş dosya. – Blehi

+0

'chmod 644''ü kullanacağım, bunun yerine'/system' uygulamaları için ayarlanmış olan izin. Neden diğer programların izin vermesine izin veren bir “chmod 666” olmasını istediğinizden emin değilsiniz. Ayrıca bunu yükleyebilir ve bunu 'adb' aracılığıyla yapabilir ve sonra yeniden başlatabilirsiniz. –

2

budur: kodunuzda kurmadan önce

daha ayrıntılı indirilen apk dosya üzerinde context.getFilesDir()

İlgili konular