2015-07-11 19 views
11

का उपयोग कर एस 3 से एपीके फ़ाइल डाउनलोड करें क्या एंड्रॉइड के डाउनलोड मैनेजर का उपयोग कर एस 3 बाल्टी से फ़ाइल डाउनलोड करने का कोई तरीका है?डाउनलोड मैनेजर

मैं वर्तमान में ड्रॉपबॉक्स से एक apk फ़ाइल यह कर डाउनलोड कर सकते हैं:

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive"); 
request.setMimeType("application/vnd.android.package-archive"); 

final DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
final long id = manager.enqueue(request); 

अब मेरी अमेज़न यूआरएल के साथ "Url" की जगह मुझे क्या करना चाहते हैं। जब मैं ऐसा करता हूं, तो डाउनलोड सिर्फ 0% पर रहता है और बस वहां अटक जाता है।

क्या ऐसा करने का कोई तरीका है?

वैसे, अमेज़ॅन यूआरएल में पास AWSAccessKeyId, Expires, और Signature पैरामीटर शामिल हैं। यूआरएल इस तरह दिखता है:

https://bucket-name.s3-us-west-2.amazonaws.com/uploads/app/apk/22/app.apk?AWSAccessKeyId=""&Expires=""&Signature="" 
+0

क्या आपने HTTPS के बजाय सादे HTTP की कोशिश की है? क्या आपने उस डिवाइस या एमुलेटर पर किसी वेब ब्राउज़र ऐप में यूआरएल तक पहुंचने का प्रयास किया है जिस पर आप परीक्षण कर रहे हैं? क्या आपने एक ऐसे यूआरएल की कोशिश की है जो सार्वजनिक संसाधन के लिए है (यानी, जिसे किसी भी क्वेरी पैरामीटर की आवश्यकता नहीं है)? शायद कुछ समस्याएं शायद समस्या को कम करने के लिए कुछ विचार हैं। – CommonsWare

+0

@ कॉमन्सवेयर मैंने आपके द्वारा सुझाई गई कुछ चीजों की कोशिश की। डाउनलोड करता है अगर मैं अपने एस 3 बाल्टी में फ़ाइल पर "सार्वजनिक करें" विकल्प पर क्लिक करता हूं। यह पैरामीटर की आवश्यकता को हटा देता है। तो मुझे लगता है कि समस्या किसी भी तरह से मेरे एडब्ल्यूएस प्रमाण पत्र से संबंधित है? लिंक मेरे कंप्यूटर पर मेरे कंप्यूटर पर डाउनलोड करता है हालांकि लिंक में प्रमाण-पत्र के साथ। – theDazzler

+0

"तो मुझे लगता है कि समस्या किसी भी तरह से मेरे एडब्ल्यूएस प्रमाण-पत्र से संबंधित है?" - मैंने कभी भी 'डाउनलोड प्रबंधक' के साथ क्वेरी पैरामीटर वाले यूआरएल की कोशिश नहीं की है। मैं * सोचता हूं कि 'डाउनलोड प्रबंधक' इसका समर्थन करेगा। पार्स किए गए 'उरी' और 'getQuery()' या 'getQueryParameters() 'जैसी चीजें लें और सुनिश्चित करें कि आपके मूल्य कहीं भी रास्ते में नहीं घूम रहे हैं। – CommonsWare

उत्तर

4

कारण यह विफल रहता है क्योंकि आप Content-Type हैडर सेट है। HTTP डाउनलोड के लिए यह हेडर आवश्यक नहीं है। हालांकि, एक बार सेट होने पर, इसे एडब्ल्यूएस एस 3 द्वारा आवश्यक अनुसार निर्धारित यूआरएल में हस्ताक्षर का हिस्सा होना पड़ता है। अन्यथा आप 403 निषिद्ध देखेंगे - SignatureDoesNotMatch त्रुटि।

त्वरित समाधान Content-Type शीर्षलेख को निकालना है।

request.addRequestHeader("Content-Type", "application/vnd.android.package-archive"); 

एक और समाधान हैडर्स के साथ एक निर्धारित यूआरएल उत्पन्न करना है। मान लें कि आप वास्तव में सामग्री प्रकार सेट करना चाहते हैं, आप इसे GeneratePresignedUrlRequest में जोड़ सकते हैं और उसके बाद से एक यूआरएल बना सकते हैं।

GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucket, key); 
request.setContentType("application/vnd.android.package-archive"); 
URL url = s3Client.generatePresignedUrl(request); 

अधिक जानकारी के लिए AmazonS3.generatePresignedUrl(GeneratePresignedUrlRequest) देखें।

+0

वाह। धन्यवाद यह काम किया।आपने कहा कि यह "त्वरित" समाधान है। क्या इस समाधान से जुड़ी कोई समस्या है जिसके लिए मुझे देखना चाहिए? क्या कोई बेहतर "लंबा" समाधान है? मुझे आपके समाधान में कोई समस्या नहीं है, लेकिन सिर्फ यह सोचकर कि क्या कुछ भी है, मुझे अवगत होना चाहिए। – theDazzler

+0

अद्यतन उत्तर देखें। – Yangfan

1

हैलो आप अनुरोध में एपीके फ़ाइल प्राप्त करने के लिए निम्न शीर्षलेख का उपयोग कर सकते हैं।

Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8 
Cache-Control:no-cache 
Connection:keep-alive 
Content-Length:819457 
Content-Type:application/octet-stream 
संबंधित मुद्दे