2017-12-13 94 views
5

मैं एंड्रॉयड oreo (8.0) एपीआई में एक छवि फ़ाइल नहीं बचा सकता 26.
कोड एपीआई स्तर में पूरी तरह से काम कर रहा है 25 (7.0) और मैं प्रलेखन "Android 8.0 Behavior Changes"एंड्रॉइड ओरेओ अपडेट में छवि फ़ाइल को सहेजने में असमर्थ। यह कैसे करना है?

में कोई परिवर्तन नहीं मिले हैं

यहाँ मेरी कोड

String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); 
File myrootDir = new File(root); 
if (!myrootDir.exists()) { 
    myrootDir.mkdir(); 
} 

File myDir = new File(root + "/Myimages"); 
if (!myDir.exists()) { 
    myDir.mkdir(); 
} 
final String fname = System.currentTimeMillis()+"myimage.png"; 
File file = new File(myDir, fname); 
if (file.exists()) 
    file.delete(); 
try { 
    FileOutputStream out = new FileOutputStream(file); 
    b.compress(Bitmap.CompressFormat.PNG, 100, out); 
    out.flush(); 
    out.close(); 
}catch (Exception e){ 
    Log.e("MYAPP", "exception", e); 
} 

अपवाद FileNotFoundException, इस तरह के कोई फ़ाइल या निर्देशिका है। (लेकिन क्यों एंड्रॉयड n में नहीं?)

java.io.FileNotFoundException: /storage/emulated/0/Pictures/Myimages/1513151272243myimage.png (No such file or directory) 
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:  at java.io.FileOutputStream.open0(Native Method) 
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:  at java.io.FileOutputStream.open(FileOutputStream.java:287) 
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:223) 
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:171) 
12-13 13:17:52.243 5839-5839/com.package.package W/System.err:  at com.package.package.DetailPage$12.run(DetailPage.java:737) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at android.os.Handler.handleCallback(Handler.java:789) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:98) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at android.os.Looper.loop(Looper.java:164) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6541) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
12-13 13:17:52.244 5839-5839/com.package.package W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
+2

क्या आपके पास कोई अपवाद है? कृपया इसे यहां पोस्ट करें – Rinav

+3

ओह, मुझे लगता है कि आपके पास खाली पकड़ ब्लॉक है, कृपया कैच ब्लॉक में कुछ लॉगिंग जोड़ें। बेस्ट प्रैक्टिस के रूप में, ** कभी भी कैच ब्लॉक को खाली न छोड़ें। हमेशा इसे संभाल लें ** – Rinav

+1

मैं एंड्रॉइड एन में इस कोड का उपयोग कर छवि को सहेज सकता हूं। लेकिन एंड्रॉइड ओ, एनओपी :( –

उत्तर

5

वहाँ, वास्तव में, एक मामूली, सूक्ष्म अनुमतियां में पर चल रहा है और लक्षित कर क्षुधा एपीआई के लिए 26.

पहले परिवर्तन, एप्लिकेशन स्वचालित रूप से सभी अनुमतियाँ प्रदान किया गया है किसी दिए गए समूह में यदि उस समूह में कम से कम एक अनुमति उपयोगकर्ता द्वारा दी गई थी। इसका मतलब यह है कि WRITE_EXTERNAL_STORAGE को स्पष्ट रूप से अनुरोध किया गया था या नहीं, इस पर ध्यान दिए बिना READ_EXTERNAL_STORAGE को WRITE_EXTERNAL_STORAGE को तुरंत दिया गया था।

ओरेओ के रूप में, एपीआई 26+ को लक्षित करने वाले ऐप्स के लिए, इसे सही किया गया है, और केवल उन अनुमतियों को स्पष्ट रूप से अनुरोध किया जाएगा। यदि उपयोगकर्ता ने पहले से ही एक ही समूह में अनुमति दी है, तो नई अनुमति के लिए कोई संकेत नहीं होगा, लेकिन फिर भी अनुरोध किया जाना चाहिए।

इस मामले में समस्या थी। जब READ_EXTERNAL_STORAGE आपके ऐप को नौगेट या नीचे पर अनुमति दी गई थी, तो आप इसे विशेष रूप से अनुरोध किए बिना WRITE_EXTERNAL_STORAGE भी प्राप्त कर रहे थे। जब आप ओरेओ में एक ही फ़ाइल सहेजने की प्रक्रिया को आजमाते हैं, तो आपको WRITE_EXTERNAL_STORAGE स्वचालित रूप से नहीं मिल रहा है, इसलिए अंततः लेखन विफल हो जाता है।

बस WRITE_EXTERNAL_STORAGE के लिए एक विशिष्ट अनुरोध जोड़ें। यदि उपयोगकर्ता ने पहले ही READ_EXTERNAL_STORAGE दिया है, तो उन्हें किसी अन्य प्रॉम्प्ट से परेशान नहीं किया जाएगा। वैकल्पिक रूप से, आप शुरुआत से पूरी तरह से WRITE_EXTERNAL_STORAGE का अनुरोध कर सकते हैं, जिसमें स्पष्ट रूप से READ_EXTERNAL_STORAGE शामिल है, और आपको दो अलग-अलग अनुरोधों की आवश्यकता बचाएगा।

+1

बहुत बहुत धन्यवाद :) –

1

मुझे भी एक ही समस्या का सामना करना पड़ रहा है और मैं इस मुद्दे से 2 महीने से फंस गया हूं। मैंने पहले ही मैनिफेस्ट में WRITE_EXTERNAL_STORAGE के लिए अनुमति दी है और फिर भी जांच कर रहा है कि इसमें लेखन अनुमति है। मुझे लगता है कि यह एक अनुमति मुद्दा नहीं है। क्योंकि जब मैं ओरेओ के साथ परीक्षण करता हूं तो फ़ोल्डर बना रहा है और मैं जो फ़ोल्डर बना रहा हूं उसमें एक दूषित छवि फ़ाइल है। इसकी वजह से यह गैलरी में नहीं आ रहा है और फिर सहेजने पर यह मुझे वापस लौटाता है छवि पर कब्जा नहीं किया गया। मुझे यह समस्या केवल एंड्रॉइड 7.1.1 और अयस्क में मिल रही है। एंड्रॉइड 7.0 तक यह ठीक काम कर रहा है। मुझे लगता है मैं जीपीएस के साथ और नीचे समारोह

public void onImageAvailable(ImageReader reader) { 
        Image image = null; 
        try { 
         image = reader.acquireLatestImage(); 
         ByteBuffer buffer = image.getPlanes()[0].getBuffer(); 
         byte[] bytes = new byte[buffer.capacity()]; 
         buffer.get(bytes); 
         save(bytes); 

छवि बाइट के लिए के साथ एक कस्टम कैमरा का उपयोग कर रहा बचाने के लिए और बचाने के समारोह

OutputStream output = null; 
        try { 
         output = new FileOutputStream(finalFile); 
         output.write(bytes); 
        } finally { 
         if (null != output) { 
          output.close(); 
         } 
        } 
नीचे कोड शामिल उपकरणों Samsung Galaxy Note 8 और गूगल पिक्सेल xl 2. साथ जाँच कर ली है
संबंधित मुद्दे