मुझे पता है कि यह एक चर्चा का विषय है, लेकिन यहां मैं हूं, अन्य सभी समाधानों के बाद मैंने पाया है कि मेरी समस्या का समाधान नहीं हुआ है। मैंने फायरबेस स्टोरेज में कई छवियों को सहेजा है और अब मैं उनमें से एक प्राप्त करना चाहता हूं और इसे 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 जवाब
मुझे निम्न समाधान मिला (जैसा कि पहले टिप्पणियों में सुझाया गया था) ):
गिल्ड के साथ 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
(मेरे मामले में कम से कम ऊंचाई के लिए) का उपयोग नहीं करना चाहिए, अन्यथा यह दिखाई देगा एक छोटे आइकन के रूप में। यह इस बात पर भी निर्भर कर सकता है कि स्टोरेज में इमेज को पहले कैसे सेव किया गया था।
आशा है कि यह किसी और की भी मदद करेगा!
मुझे यकीन नहीं है कि आपके दूसरे स्निपेट में क्या गलत हो रहा है, लेकिन पहले स्निपेट में आप ग्लाइड को 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
}
});
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।