2011-03-31 22 views
7

खोलने में विफल रहा मैं वेब से एपीके फ़ाइल डाउनलोड कर रहा हूं और उसे Context.getCacheDir() में संग्रहीत कर रहा हूं। मैं HttpURLConnection द्वारा फ़ाइल डाउनलोड कर रहा हूं - मैं वास्तव में कोड पर नहीं पूछ रहा हूं (यह पूरी तरह से काम कर रहा है), इसलिए मैं इसे यहां पोस्ट नहीं कर रहा हूं। मैंने सफलतापूर्वक डाउनलोड शुरू किया। फ़ाइल कैश में डाउनलोड की जाती है और फिर इंस्टॉलेशन को संकेत दिया जाता है - लेकिन सिस्टम मेरा एपीके नहीं खोल सकता है और विश्लेषण की त्रुटि लिखता है। इस प्रकारएंड्रॉइड - ज़िप संग्रह

इसलिए समस्या है:

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 

समस्या है - मैं programaticaly/कैश का उपयोग करने की अनुमति नहीं है। क्या इसे हल करने का कोई तरीका है? मैं बाहरी डाउनलोड को एक डाउनलोड निर्देशिका के रूप में उपयोग नहीं करना चाहता (इंस्टॉलेशन प्रक्रिया काम करता है जब मैं बाहरी स्टोरेज में फ़ाइल डाउनलोड करता हूं), कैश बहुत अच्छा है क्योंकि फाइल सामान्य उपयोगकर्ता के लिए फ़ाइल मैनेजर से पहुंच योग्य नहीं होगी और यही वह है जो मैं चाहता हूं। आपके विचारों के लिए धन्यवाद।

यह समस्या एक महीने अब से अधिक के लिए न सुलझा हुआ मेरे लिए किया गया है ...

संपादित करें: फिर भी कोई समाधान नहीं है, मैं यह है कि मैं 1 बात पाया सोचने के लिए कोशिश कर रहा हूँ, कि एंड्रॉयड

साथ संभव नहीं है

संपादित 2: मुझे बुरा लग रहा होगा - मेरा डाउनलोड एपीके कैश में मौजूद है ... अभी भी उस डीआईआर से इंस्टॉल करने की अनुमति देने की अनुमति नहीं है?

+0

क्या आपने उपयोग करने का प्रयास किया है 'openFileOutput()' .... यदि नहीं, तो इसे 'MODE_WORLD_READABLE' – Panthro

+0

के साथ आज़माएं हाय क्या आपको उपरोक्त समस्या का समाधान मिला है। मैं अभी भी इसी तरह के ठीक हूँ। – CodeGuru

+0

मैंने इस टिप्पणी में काफी अधिक जवाब में 'WORLD_WRITABLE' को देखा है। डीओ ** नहीं ** यह परीक्षण के अलावा अन्य है कि अनुमति समस्या है। – domen

उत्तर

1

मैं देख रहा हूँ क्या हो रहा है ..

कैश निर्देशिका एक कैश एंड्रॉयड द्वारा प्रबंधित, जिसका अर्थ है के रूप में आंतरिक स्मृति कम प्रदर्शन शुरू होने के यह रूप में जल्द ही साफ किया जा सकता है।

और यदि आपका एप्लिकेशन कैश पर बहुत अधिक जगह ले रहा है (आपका एपीके क्या कर रहा है) जब आपका एप्लिकेशन रोका/बंद हो जाता है तो एंड्रॉइड आपकी कैश निर्देशिका को साफ़ कर सकता है।

इसका परीक्षण करने के लिए यह सब कुछ है, जैसा आपने किया था और जब स्थापना प्रक्रिया शुरू होती है तो डीडीएमएस खोलें और देखें कि आपकी फ़ाइल अभी भी कैश में है या नहीं।

यदि नहीं, तो एंड्रॉइड ने एप्लिकेशन के कैश को साफ़ कर दिया है क्योंकि यह अब नहीं चल रहा है।

उपयोगकर्ता के लिए इससे पहले कि आप इसे अपने कोड में स्थापित context.getCacheDir() के बजाय, एक अलग दृष्टिकोण की कोशिश करो

और अधिक विस्तार से डाउनलोड apk फ़ाइल पर कोशिश context.getFilesDir()

+0

हाय, मैं वास्तव में Context.getCacheDir() का उपयोग कर रहा हूं और मैं एडीबी में कैश में डाउनलोड किए गए ऐप को नहीं देख सकता ... ऐसा लगता है कि सिस्टम अपडेट के बाद इसे हटा रहा है ... – Waypoint

+0

संदर्भ के लिए ठीक है .getFilesDir() getCacheDir() के लिए - कोई सफलता – Waypoint

+0

यह समस्या है ... क्या आप एपीके के आकार को जानते हैं? ऐसा लगता है कि एक आंतरिक भंडारण में संग्रहीत करना बहुत बड़ा है ...आपको इसे एसडीकार्ड में स्टोर करने की आवश्यकता होगी .... इंस्टॉल करें ... फिर हटाएं। – Panthro

6

chmod 666:

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

के साथ स्टोर करता हूं धन्यवाद .. उस आदेश को चलाने के बाद पैकेज इंस्टॉलर खोल सकता है डाउनलोड की गई फ़ाइल। – Blehi

+0

मैं 'chmod 644' का उपयोग करता हूं क्योंकि यह'/system' ऐप्स के लिए अनुमति सेट है। निश्चित नहीं है कि आप 'chmod 666' क्यों चाहते हैं कि अन्य प्रोग्राम अनुमति लिखें। आप इसे इंस्टॉल कर सकते हैं और इसे 'adb' के माध्यम से कर सकते हैं और फिर पुनरारंभ करें। –

2

यह वह जगह है आपकी मदद कर सकता है:

FileOutputStream fOutputStream = context.openFileOutput(
    fileName, Context.MODE_WORLD_READABLE); 
संबंधित मुद्दे