मुझे पता है कि यह एक चर्चा का विषय है, लेकिन यहां मैं हूं, अन्य सभी समाधानों के बाद मैंने पाया है कि मेरी समस्या का समाधान नहीं हुआ है। मैंने फायरबेस स्टोरेज में कई छवियों को सहेजा है और अब मैं उनमें से एक प्राप्त करना चाहता हूं और इसे AlertDialog (या अन्य गतिविधि) पर ImageView में रखना चाहता हूं।

मैंने Glide समाधान के बारे में पढ़ा है, लेकिन यह मेरे लिए कारगर नहीं है। गिल्ड:

Glide.with(ViewScenesSG.this) //ViewScenesSG is the Activity
                .load(reference) //the storage reference
                .into(imageView); //my imageView

ग्लाइड के लिए निर्भरता (मैंने कई संस्करणों के साथ प्रयास किया है और 4.8.0 एकमात्र ऐसा है जो मुझे बिल्ड त्रुटि नहीं देता है):

implementation 'com.github.bumptech.glide:glide:4.8.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'
annotationProcessor 'androidx.annotation:annotation:1.1.0'

मैंने .using(new FirebaseImageLoader()) विधि के बारे में भी पढ़ा है, मैंने FirebaseImageLoader(), लेकिन using() मेथड नहीं मिला => बिल्ड एरर। मुझे विश्वास है कि इसे हटा दिया गया है।

मैंने जो दूसरा संस्करण आजमाया है वह यह है (एक अन्य प्रश्न में पाया गया यहां):

final long ONE_MEGABYTE = 1024 * 1024;
       reference.getBytes(ONE_MEGABYTE)
           .addOnSuccessListener(new OnSuccessListener<byte[]>() {
               @Override
               public void onSuccess(byte[] bytes) {
                   Bitmap bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                   DisplayMetrics dm = new DisplayMetrics();
                   getWindowManager().getDefaultDisplay().getMetrics(dm);
                   
                   imageView.setMinimumHeight(dm.heightPixels);
                   imageView.setMinimumWidth(dm.widthPixels);
                   imageView.setImageBitmap(bm);
               }
           }).addOnFailureListener(new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception exception) {
               Toast.makeText(ViewScenesSG.this, "Couldn't retrieve image.", Toast.LENGTH_SHORT).show();
           }
       });

लेकिन हर बार यह फेलियर श्रोता पर चला जाता है। इसलिए, मेरा इमेज व्यू हमेशा खाली रहता है।

मेरे लॉगकैट में मैंने यह त्रुटि देखी:

E/StorageException: Could not open resulting stream.
    java.io.IOException: Could not open resulting stream.
        at com.google.firebase.storage.StreamDownloadTask.createDownloadStream(com.google.firebase:firebase-storage@@19.1.1:145)
        at com.google.firebase.storage.StreamDownloadTask.access$000(com.google.firebase:firebase-storage@@19.1.1:36)
        at com.google.firebase.storage.StreamDownloadTask$1.call(com.google.firebase:firebase-storage@@19.1.1:167)
        at com.google.firebase.storage.StreamDownloadTask$1.call(com.google.firebase:firebase-storage@@19.1.1:164)
        at com.google.firebase.storage.StreamDownloadTask$StreamProgressWrapper.ensureStream(com.google.firebase:firebase-storage@@19.1.1:325)
        at com.google.firebase.storage.StreamDownloadTask$StreamProgressWrapper.access$100(com.google.firebase:firebase-storage@@19.1.1:262)
        at com.google.firebase.storage.StreamDownloadTask.run(com.google.firebase:firebase-storage@@19.1.1:175)
        at com.google.firebase.storage.StorageTask.lambda$getRunnable$7(com.google.firebase:firebase-storage@@19.1.1:1072)
        at com.google.firebase.storage.StorageTask$$Lambda$12.run(Unknown Source:2)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
E/StorageException: StorageException has occurred.
    Object does not exist at location.
     Code: -13010 HttpResult: 404

लेकिन छवि भंडारण में है, और संदर्भ सीधे इसे इंगित करता है:

storageRef = storage.getReference("photos").child(title); //for all images in the current folder named with the 'title' attribute
StorageReference reference = storageRef.child(imageName); //for the image I want to retrieve

मुझे किसकी याद आ रही है?

संपादित करें: टिप्पणियों में सुझाव का उपयोग करते हुए, मैंने इसके साथ प्रयास किया:

reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                Glide.with(ViewScenesSG.this)
                        .load(uri.toString())
                        .into(imageView);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(ViewScenesSG.this, "Retrieving image failed",
                        Toast.LENGTH_SHORT).show();
            }
        });

लेकिन इस बार मुझे त्रुटि मिलती है:

E/StorageException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object",    "status": "GET_OBJECT"  }}
    java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object",    "status": "GET_OBJECT"  }}
        at com.google.firebase.storage.network.NetworkRequest.parseResponse(com.google.firebase:firebase-storage@@19.1.1:433)
        at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(com.google.firebase:firebase-storage@@19.1.1:450)
        at com.google.firebase.storage.network.NetworkRequest.processResponseStream(com.google.firebase:firebase-storage@@19.1.1:441)
        at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@19.1.1:272)
        at com.google.firebase.storage.network.NetworkRequest.performRequest(com.google.firebase:firebase-storage@@19.1.1:286)
        at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(com.google.firebase:firebase-storage@@19.1.1:70)
        at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(com.google.firebase:firebase-storage@@19.1.1:62)
        at com.google.firebase.storage.GetDownloadUrlTask.run(com.google.firebase:firebase-storage@@19.1.1:76)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
2
Cristina 2 जुलाई 2020, 16:17

2 जवाब

सबसे बढ़िया उत्तर

मुझे निम्न समाधान मिला (जैसा कि पहले टिप्पणियों में सुझाया गया था) ):

गिल्ड के साथ Firebase UI प्लगइन का उपयोग करते हुए, मैंने निम्नलिखित निर्भरता को जोड़ा:

implementation 'com.firebaseui:firebase-ui-storage:6.2.0'

अब, StorageReference reference छवि की ओर इशारा करते हुए, और ImageView जिसमें सामग्री अपलोड की जानी चाहिए, निम्न कोड छवि को पुनः प्राप्त करता है और इसे ImageView में डालता है:

Glide.with(ViewScenesSG.this)  //this is the current Activity
                .load(reference)
                .into(imageView);

यह उल्लेख करने के लिए कि ImageView में आयाम एक विशिष्ट मान पर सेट होना चाहिए, wrap_content या match_parent (मेरे मामले में कम से कम ऊंचाई के लिए) का उपयोग नहीं करना चाहिए, अन्यथा यह दिखाई देगा एक छोटे आइकन के रूप में। यह इस बात पर भी निर्भर कर सकता है कि स्टोरेज में इमेज को पहले कैसे सेव किया गया था।

आशा है कि यह किसी और की भी मदद करेगा!

1
Cristina 2 जुलाई 2020, 18:50

मुझे यकीन नहीं है कि आपके दूसरे स्निपेट में क्या गलत हो रहा है, लेकिन पहले स्निपेट में आप ग्लाइड को StorageReference पास कर रहे हैं। चूंकि ग्लाइड को फायरबेस स्टोरेज के बारे में कुछ भी पता नहीं है, इसलिए यह काम नहीं करेगा।

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

कुछ इस तरह:

reference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        // Got the download URL for 'users/me/profile.png'

        Glide.with(ViewScenesSG.this)
                .load(uri.toString())
                .into(imageView);
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});
0
Frank van Puffelen 2 जुलाई 2020, 16:53