java - 在 firebase 中上传后,保存在数据库中的图像链接不起作用

标签 java android firebase

我制作了一个聊天应用程序,并且我制作了一个在聊天中发送图像的功能,该图像应上传到 Firebase 存储中,其链接应存储在 Firebase 数据库中,

图像已上传到 Firebase 存储中,但其链接未保存在数据库中,而是保存了此链接 -

“com.google.android.gms.tasks.zzu@4298b5d”

这是代码 -

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == 1 && resultCode == RESULT_OK)
        {
            Uri url = data.getData();

            DatabaseReference messageRef = FirebaseDatabase.getInstance().getReference().child("Messages").child(currentUserId).child(otherUserId).push();
            final String messageId = messageRef.getKey();

            DatabaseReference notificationRef = FirebaseDatabase.getInstance().getReference().child("Notifications").child(otherUserId).push();
            final String notificationId = notificationRef.getKey();

            StorageReference file = FirebaseStorage.getInstance().getReference().child("message_images").child(messageId + ".jpg");

            file.putFile(url).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>()
            {
                @Override
                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
                {
                    if(task.isSuccessful())
                    {
                        String imageUrl = task.getResult().getStorage().getDownloadUrl().toString();

                        Map messageMap = new HashMap();
                        messageMap.put("message", imageUrl);
                        messageMap.put("type", "image");
                        messageMap.put("from", currentUserId);
                        messageMap.put("to", otherUserId);
                        messageMap.put("timestamp", ServerValue.TIMESTAMP);

                        HashMap<String, String> notificationData = new HashMap<>();
                        notificationData.put("from", currentUserId);
                        notificationData.put("type", "message");

                        Map userMap = new HashMap();
                        userMap.put("Messages/" + currentUserId + "/" + otherUserId + "/" + messageId, messageMap);
                        userMap.put("Messages/" + otherUserId + "/" + currentUserId + "/" + messageId, messageMap);

                        userMap.put("Chat/" + currentUserId + "/" + otherUserId + "/message", "You have sent a picture.");
                        userMap.put("Chat/" + currentUserId + "/" + otherUserId + "/timestamp", ServerValue.TIMESTAMP);
                        userMap.put("Chat/" + currentUserId + "/" + otherUserId + "/seen", ServerValue.TIMESTAMP);

                        userMap.put("Chat/" + otherUserId + "/" + currentUserId + "/message", "Has send you a picture.");
                        userMap.put("Chat/" + otherUserId + "/" + currentUserId + "/timestamp", ServerValue.TIMESTAMP);
                        userMap.put("Chat/" + otherUserId + "/" + currentUserId + "/seen", 0);

                        userMap.put("Notifications/" + otherUserId + "/" + notificationId, notificationData);

                        FirebaseDatabase.getInstance().getReference().updateChildren(userMap, new DatabaseReference.CompletionListener()
                        {
                            @Override
                            public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference)
                            {
                                sendButton.setEnabled(true);

                                if(databaseError != null)
                                {
                                    Log.d(TAG, "sendMessage(): updateChildren failed: " + databaseError.getMessage());
                                }
                            }
                        });
                    }
                }
            });
        }
    }

最佳答案

我自己找到了解决方案,这就是解决方案。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 1 && resultCode == RESULT_OK) {
            Uri url = data.getData();

            DatabaseReference messageRef = FirebaseDatabase.getInstance().getReference().child("Messages").child(currentUserId).child(otherUserId).push();
            final String messageId = messageRef.getKey();

            DatabaseReference notificationRef = FirebaseDatabase.getInstance().getReference().child("Notifications").child(otherUserId).push();
            final String notificationId = notificationRef.getKey();

            final StorageReference file = FirebaseStorage.getInstance().getReference().child("message_images").child(messageId + ".jpg");

            file.putFile(url).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                    file.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            String imageUrl = uri.toString();

                            Map messageMap = new HashMap();
                            messageMap.put("message", imageUrl);
                            messageMap.put("type", "image");
                            messageMap.put("from", currentUserId);
                            messageMap.put("to", otherUserId);
                            messageMap.put("timestamp", ServerValue.TIMESTAMP);

                            HashMap<String, String> notificationData = new HashMap<>();
                            notificationData.put("from", currentUserId);
                            notificationData.put("type", "message");

                            Map userMap = new HashMap();
                            userMap.put("Messages/" + currentUserId + "/" + otherUserId + "/" + messageId, messageMap);
                            userMap.put("Messages/" + otherUserId + "/" + currentUserId + "/" + messageId, messageMap);

                            userMap.put("Chat/" + currentUserId + "/" + otherUserId + "/message", "You have sent a picture.");
                            userMap.put("Chat/" + currentUserId + "/" + otherUserId + "/timestamp", ServerValue.TIMESTAMP);
                            userMap.put("Chat/" + currentUserId + "/" + otherUserId + "/seen", ServerValue.TIMESTAMP);

                            userMap.put("Chat/" + otherUserId + "/" + currentUserId + "/message", "Has send you a picture.");
                            userMap.put("Chat/" + otherUserId + "/" + currentUserId + "/timestamp", ServerValue.TIMESTAMP);
                            userMap.put("Chat/" + otherUserId + "/" + currentUserId + "/seen", 0);

                            userMap.put("Notifications/" + otherUserId + "/" + notificationId, notificationData);

                            FirebaseDatabase.getInstance().getReference().updateChildren(userMap, new DatabaseReference.CompletionListener() {
                                @Override
                                public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
                                    sendButton.setEnabled(true);

                                    if (databaseError != null) {
                                        Log.d(TAG, "sendMessage(): updateChildren failed: " + databaseError.getMessage());
                                    }
                                }
                            });
                        }
                    });
                }
            });
        }
    }

关于java - 在 firebase 中上传后,保存在数据库中的图像链接不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61484856/

相关文章:

android - Google place api 在 Android 中显示错误

android - 致命异常 : com. google.firebase.database.d : Class com. myapp.android.c 缺少没有参数的构造函数

ios - 如何在 iOS 上使用 Firebase 和 Flutter 获取推送通知?

java - Spring @Cacheable如何配置复杂的key

android - 在RxJava上链接调用

java - Java中使用jsoup解析元素

android - 如何将 C++ 源代码解析为 obj?

javascript - Angularfire2更新所有子节点

java - 为什么我们为包含jar的文件夹设置hadoop_classpath才能运行?

java - 在 android studio 中膨胀类 com.google.android.gms.ads.AdView 时出错