2013-12-17 9 views
30

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

यह पहले एंड्रॉइड (3.3) के पुराने संस्करणों के इरादे से काम करता है और आईओएस पर ठीक काम करता है लेकिन अब 4.4 (किटकैट) पर छवि पथ को हल करने में विफल रहता है।

content://com.android.providers.media.documents/document/image%3A352 

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

लौटे छवि यूआरएल के लिए लौट आए पथ की तरह कुछ लग रहा है। कैमरे के साथ तस्वीर लेने पर कोई समस्या नहीं है, यह गैलरी से मौजूदा तस्वीर चुनते समय ऐसा ही प्रतीत होता है।

मैंने बेस 64 पर एन्कोडिंग करने का प्रयास किया है और दस्तावेज़ों में उल्लिखित विधि की कोशिश की है resolveLocalFileSystemURI(); लेकिन मुझे इनके साथ कोई भाग्य नहीं है। मैंने कैमरा प्लगइन को हटाने और ऐप का पुनर्निर्माण करने का भी प्रयास किया है लेकिन कोई खुशी नहीं है।

मेरा अनुमान है कि किटकैट गैलरी को संभालने के तरीके के साथ कुछ बदल गया है और फोनगैप/कैमरा प्लगइन को अभी तक इसके लिए समायोजित नहीं किया गया है।

+0

और content_type के बारे में क्या? यह कैसे है? – brauliobo

उत्तर

16

छवियों के यूआरआई एन्कोडिंग के साथ एंड्रॉइड 4.4 में कुछ तोड़ दिया।

एक बग Cordova यहां के खिलाफ दायर की गई है: https://issues.apache.org/jira/browse/CB-5398

getPicture के लिये दस्तावेज में, एंड्रॉयड तेज धारा के तहत, यह इस समस्या को और एक समाधान के साथ एक StackOverflow सवाल का अंक (कैमरा प्लगइन जावा कोड को संपादित की चर्चा स्टोरेज एक्सेस फ्रेमवर्क ऐप के बजाय गैलरी ऐप खोलने के लिए इसे मजबूर करने के लिए।)

ऐसा लगता है कि आप गंतव्य प्रकार को DATA_URL पर सेट कर सकते हैं।

+1

आपकी प्रतिक्रिया के लिए धन्यवाद। जैसा कि आपने सुझाव दिया था, मैं गंतव्य प्रकार को DATA_URL पर सेट करके इसे काम करने में कामयाब रहा। मुझे लगता है कि यह इस विधि का उपयोग करके थोड़ा और स्मृति गहन है लेकिन ऐसा लगता है कि यह अच्छी तरह से काम करता है। – ArgosBen

+1

@XigenBen, हाँ DATA_URL का उपयोग करने से अधिक मेमोरी का उपयोग होगा। असल में, मैंने उन ऐप्स को देखा है जो आप Google ड्राइव से DATA_URL के साथ एक छवि का चयन करने का प्रयास करते हैं, क्योंकि DATA_URL के रूप में एन्कोड की गई छवि कॉर्डोवा पुल से गुज़रने के लिए बड़ी है। कॉर्डोवा 3.4 दो हफ्ते पहले आया था और उपरोक्त मुद्दे को ठीक कर दिया है, इसलिए आपको DATA_URL का उपयोग करके अपग्रेड और रोकना चाहिए। – MBillau

+0

लेकिन सामग्री प्रकार की भी आवश्यकता है, और बेस 64 के साथ मैं यह नहीं कर सकता :( – brauliobo

19

इस बग को ठीक करते समय वास्तव में एक बहुत ही गंदे कामकाज मेरे लिए काम करता है। चरम आवश्यकता के मामले में प्रयोग करें :)

if (imageURI.substring(0,21)=="content://com.android") { 
    photo_split=imageURI.split("%3A"); 
    imageURI="content://media/external/images/media/"+photo_split[1]; 
} 
+2

मुझे यह पसंद है .. "सामग्री: //com.android" हर मामले में काम नहीं करता है, क्योंकि जब मैं ईएस फाइल एक्सप्लोरर का उपयोग करता हूं एक "सामग्री: //com.esstrong ..." ... इसलिए इसमें अधिक तर्क बनने की आवश्यकता है, लेकिन पुराने स्टाइल यूआरएल को पुनर्निर्मित करने के साथ समग्र कामकाज यह है कि यह एंड्रॉइड 4.0 से 4.4 तक हमारे ऐप के लिए अच्छा है। – christianmenkens

+3

@ क्रिस्टियनमेनकेन्स क्या आप कुछ और मजबूत के साथ आए थे? अगर आप इसे पोस्ट करते हैं तो मैं इसका उपयोग करना चाहूंगा। अन्यथा मुझे लगता है कि हर कोई कॉर्डोवा 3.5.0 –

+0

में फिक्स को वितरित करने की प्रतीक्षा कर रहा है और यह किस सामग्री के प्रकार है? – brauliobo

2

कोई भी एक्सटेंशन के साथ "सामग्री:" जैसी विशेष स्थितियों के लिए कुछ और अधिक मजबूत नहीं है।

// Android 4.4 cordova workarounds ... returns new kind or URL for content from chooser 
       //if (imageUrl.substring(0,21)=="content://com.android") { 
       if(imageUrl.indexOf('content://') != -1 && imageUrl.indexOf("%3A") != -1){ 
        //"PlainFileUrl = content://com.android.providers.media.documents/document/image%3A14", 
        photo_split=imageUrl.split("%3A"); 
        imageUrl="content://media/external/images/media/"+photo_split[1]; 
       } 
       // workaround end 

       var fileName = imageUrl.substr(imageUrl.lastIndexOf('/') + 1); 
       var extension; 

       // check for content: protocol to make sure is not 
       // a file with no extension 
       if (imageUrl.indexOf('content://') != -1) { 
        if(imageUrl.lastIndexOf('.') > imageUrl.lastIndexOf('/')){ 
         extension = imageUrl.substr(imageUrl.lastIndexOf('.') + 1); 
        }else{ 
         extension = "jpg"; 
         fileName = fileName + ".jpg"; 
         LogService.log("Created File Extension jpg"); 
        } 
       } else { 
        if (imageUrl.lastIndexOf('.') == -1 || (imageUrl.lastIndexOf('.') < imageUrl.lastIndexOf('/'))) { 
         extension = "invalid"; 
        } else { 
         extension = imageUrl.substr(imageUrl.lastIndexOf('.') + 1); 
        } 
       } 
4

एडोब मुझे भरोसा दिलाते हैं कि कि इस समस्या 3.5.0 में तय हो जाएगा: इसके अलावा, के बाद से मैं इसे अपलोड, मैं विस्तार का पता लगाने कर रहा हूँ, या एक .jpg एक्सटेंशन बनाने के लिए की जरूरत है फ़ाइल एक नहीं है । यह 3.4 में तय नहीं है। 3.5 मई के मध्य में रिलीज होने वाला है, मैं तब तक इंतजार कर रहा हूं।

एडोब का दावा है कि यह एक बदलाव नहीं था जो प्लगइन स्तर पर किया जा सकता था। यह कॉर्डोवा कोड में एक बुनियादी परिवर्तन था। यह बहुत बुरा है कि उन्हें इस फिक्स के साथ आने में इतनी देर लग गई।

अद्यतन: कॉर्डोवा 3.5.0 9 मई को जारी किया गया था। आप इसे बाया नोड डाउनलोड कर सकते हैं और देख सकते हैं कि समस्याएं वास्तव में हल की गई हैं या नहीं।

0

जब भी कुछ uri<img src="uri" /> में पारित हो जाता है कि यह परोक्ष

content://com.android.providers.media.documents/document/image:9888 (2)

हालांकि में

content://com.android.providers.media.documents/document/image%3A9888 (1)

से डीकोड है Intent.ACTION_OPEN_DOCUMENT या Intent.ACTION_GET_CONTENT एंड्रॉयड के लिए पढ़ने की अनुमति प्रदान करता है से लौटने के बाद (1), (2) नहीं। इस मामले में WebView उम्मीद के एक त्रुटि प्रवेश करेंगे:

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image:9888 from pid=13163, uid=10165 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

या

Unable to open content URL

कोड स्निपेट

आप सभी को हल करने मुद्दा

String uriToUseInWebView = transformForWebView(uri.toString()); 

    private String transformForWebView(String uri) { 
     for (int i = 0; i < timesDecodingWebView(); i++) 
      uri = uri.replace("%", Uri.encode("%")); 
     return uri; 
    } 

    private int timesDecodingWebView() { 
     if (Build.VERSION.RELEASE.equals("4.4.2")) { 
      return 2; 
     } else { 
      return 1; 
     } 
    } 
में

है की जरूरत है अपनेपास करने से पहले जावा कोडएचटीएमएल/जेएस में यह सुनिश्चित करने के लिए कि (1) वास्तव में लोड किया जाएगा।

मैंने इसका परीक्षण 4.4.2, 4.4.4 और 5.0 पर किया है। मजाकिया हिस्सा यह है कि एंड्रॉइड 4.4.2 uri आंतरिक रूप से दो बार डीकोड करता है। इस से

content://com.android.providers.media.documents/document/image%3A352 

:

इस बदलें:

4

यहाँ इस समस्या का आसानी से ठीक है

content://com.android.providers.media.documents/document/image%253A352 

अगर आप इस कोड का उपयोग कर सकते हैं जावास्क्रिप्ट का उपयोग कर रहे:

var path = content://com.android.providers.media.documents/document/image%3A352; 
path = path.replace("%", "%25"); 

इस तकनीक ने यूरी को "% 3 ए" पास करने के लिए मजबूर किया है, जैसा कि इसे ":" में बदलने के बिना, उम्मीद है कि यह आपके लिए काम करेगा!

संबंधित मुद्दे