什么是检索和显示存储在 Firebase 存储中的用户特定图像的好方法?

Posted

技术标签:

【中文标题】什么是检索和显示存储在 Firebase 存储中的用户特定图像的好方法?【英文标题】:What would be a good way to retrieve and display user-specific images that are stored in firebase storage? 【发布时间】:2019-10-26 16:40:30 【问题描述】:

我正在制作一个显示用户个人资料信息的 android 应用。我可以将图像存储在 Cloud Storage 中,但我不确定如何检索和显示存储在 Cloud Storage 中的用户特定图像。

我面临的一个主要问题是user.getPhotoUrl() 没有给我正确的 uri。它给了我 com.google.android.gms 形式的东西。等等。

我尝试使用 Glide 来显示图像。但是,它不起作用,因为我收到了 FileNotFoundException。所以,我尝试使用 Glide 和 StorageReference。

但是,使用 StorageReference 的问题是我必须明确提供图像的 uri,而我想检索特定于用户的图像。

我希望用户选择的个人资料图片会显示在个人资料页面上,但是当我在 Android Studio 上运行该应用时,什么都没有显示。

【问题讨论】:

一般方法如下,您可以使用@Asad Ali Choudhry 的方法将图像上传到 Firebase 存储,当您取回存储 url 时将其存储在您的数据库中(firestore 或实时)为用户。因此,每当您检索用户的信息时,您也会获得图像 url。您可以在应用中显示。 @Egghead 我也遇到了类似的问题。你知道为什么函数 getPhotoUrl() 没有返回正确的值吗?还是我没有正确解释它的输出? @PHcoDer 它返回了什么?您是否正确设置了值?也许这会有所帮助:***.com/questions/41214447/… 【参考方案1】:

我写了一个方法,将位图上传到android中的firebase存储并检索它的url,请使用此方法上传图像并检索url,之后如果您遇到任何问题,请告诉我。

public static void UploadBitmap(Activity activity, Bitmap bitmap, String serverFileName) 

        if (bitmap == null) 
            return;
        

        Thread thread = new Thread(new Runnable() 
            @Override
            public void run() 

                FirebaseStorage storage = FirebaseStorage.getInstance();
                StorageReference storageRef = storage.getReference();
                // Create a reference to the file you want to upload
                String directory = "images/";

                StorageReference fileRef = storageRef.child(directory + serverFileName);

                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] data = stream.toByteArray();

                activity.runOnUiThread(new Runnable() 
                    @Override
                    public void run() 


                        UploadTask uploadTask = fileRef.putBytes(data);
                        uploadTask.addOnFailureListener(new OnFailureListener() 
                            @Override
                            public void onFailure(@NonNull Exception exception) 
                                // Handle unsuccessful uploads
                                Log.e("oops","error in bitmap uploading");

                            
                        ).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() 
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
                                // taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
                                // ...
                                // now download url first
                            
                        );

                        Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() 
                            @Override
                            public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception 
                                if (!task.isSuccessful()) 
                                    throw task.getException();
                                

                                // Continue with the task to get the download URL
                                return fileRef.getDownloadUrl();
                            
                        ).addOnCompleteListener(new OnCompleteListener<Uri>() 
                            @Override
                            public void onComplete(@NonNull Task<Uri> task) 
                                if (task.isSuccessful()) 
                                    Uri downloadUri = task.getResult();
                                    String stringUrl = downloadUri.toString();

                                    // Great image is uploaded and url is here, you can load image anywhere via this stringUrl with Glide or Picasso.

                                 else 
                                    // Handle unsuccessful uploads
                                    Log.e("oops","error in url retrieval");
                                
                            
                        );


                    
                );


            
        );
        thread.start();




    

【讨论】:

你试过了吗?它解决了你的问题吗?如果您遇到任何问题,请告诉我。谢谢。 您好,在您的解决方案中,您同时上传并显示了图像。但是,在我的应用程序中,我已经在另一个活动中上传了用户的个人资料图片。现在,我创建了另一个活动,我想在其中显示用户上传的个人资料图片。你能帮我解决这个问题吗? 你可以这样做,使用我所有的代码,上传图片,得到它的 url 如上面的代码,然后将该 url 保存到某个变量 / arraylist / 数据库 & 现在你所在的活动想要使用图片,获取保存的url并显示图片。 如果您需要任何其他帮助,请告诉我。如果可行,请投票并接受我的回答。谢谢。 抱歉来晚了,你能解释一下你传递给函数的参数吗?

以上是关于什么是检索和显示存储在 Firebase 存储中的用户特定图像的好方法?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 以 firebase:authUser 的形式检索存储在本地存储中的用户数据:

使用 Angular 7 从 Firebase 存储中检索图像

为什么我在firelerview中显示/不显示我从firebase检索到的图像?

Firebase 存储异步图像下载随机顺序

检索存储在 childByAutoId() 参考 (Swift) 中的特定 Firebase 数据

在反应中使用异步等待从firebase存储中检索图像