Java Firebase内容-如何从onSuccess()方法外部访问taskSnapshot.getDownloadUrl()

Java Firebase内容-如何从onSuccess()方法外部访问taskSnapshot.getDownloadUrl(),java,android,firebase,firebase-realtime-database,firebase-storage,Java,Android,Firebase,Firebase Realtime Database,Firebase Storage,我目前正在使用Firebase将图像上传到Android Studio中的Firebase内容中。成功上载文件后,我将使用taskSnapshot.getDownloadUrl()接收上载图像的url。然后我想把这个url放在Firebase实时数据库中作为参考。我正在努力从onSuccess()方法之外访问taskSnapshot.getDownloadUrl()。有什么想法吗?我知道您想将上传的图像URL放入Firebase数据库 您可以做的是,声明一个字符串类型的全局变量 private

我目前正在使用Firebase将图像上传到Android Studio中的Firebase内容中。成功上载文件后,我将使用
taskSnapshot.getDownloadUrl()
接收上载图像的url。然后我想把这个url放在Firebase实时数据库中作为参考。我正在努力从
onSuccess()
方法之外访问
taskSnapshot.getDownloadUrl()
。有什么想法吗?

我知道您想将上传的图像URL放入Firebase数据库

您可以做的是,声明一个字符串类型的全局变量

private String imageUrl;
然后在onSuccess()方法中获取图像的url并存储在字符串中

imageUrl = taskSnapshot.getDownloadUrl().toString();
然后在上传图像后,您将图像URL设置为字符串,所以只需像这样将其推送到数据库

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("ImageUrl").setValue(imageUrl);
#如下声明变量:
字符串存储\u Path=“Image\u Uploads/”;
String Database_Path=“All_Image_Uploads_Database”;
#声明firebase存储或实时数据库变量,如下所示:
储存参考文献;
数据库参考数据库参考;
MyReference=FirebaseStorage.getInstance().getReference();
databaseReference=FirebaseDatabase.getInstance().getReference(数据库路径);
public void上载ImageFileToFireBaseStorage(Uri FilePathUri){
//正在检查FilePathUri是否为空。
if(FilePathUri!=null){
//设置对话框标题。
//progressDialog.setTitle(“图像正在上载…”);
//显示进度对话框。
//progressDialog.show();
//创建第二个StorageReference。
StorageReference storageReference2nd=myreference.child(Storage_Path+System.currentTimeMillis()+“”+GetFileExtension(FilePathUri));
//将addOnSuccessListener添加到第二个StorageReference。
storageReference2nd.putFile(FilePathUri)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
//从EditText获取图像名称并存储到字符串变量中。
//字符串TempImageName=ImageName.getText().toString().trim();
//完成上载后隐藏progressDialog。
//progressDialog.disclose();
//上传完成后显示toast消息。
//Toast.makeText(getApplicationContext(),“图像上传成功”,Toast.LENGTH_LONG.show();
@抑制警告(“VisibleForTests”)
ImageUploadInfo ImageUploadInfo=new ImageUploadInfo(“,taskSnapshot.getDownloadUrl().toString()”);
//正在获取图像上载ID。
字符串ImageUploadId=databaseReference.push().getKey();
//正在将图像上载id的子元素添加到databaseReference中。
databaseReference.child(ImageUploadId).setValue(imageUploadInfo);
}
})
//如果出了问题。
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//隐藏进程对话框。
//progressDialog.disclose();
//显示异常错误消息。
//Toast.makeText(MainActivity.this,exception.getMessage(),Toast.LENGTH_LONG.show();
}
})
//在进度上更改上载时间。
.addOnProgressListener(新的OnProgressListener(){
@凌驾
public void onProgress(UploadTask.TaskSnapshot TaskSnapshot){
//设置对话框标题。
//progressDialog.setTitle(“图像正在上载…”);
}
});
}否则{
//Toast.makeText(MainActivity.this,“请选择图像或添加图像名称”,Toast.LENGTH_LONG.show();
}
}
//正在创建从文件路径URI获取所选图像文件扩展名的方法。
公共字符串GetFileExtension(Uri){
ContentResolver ContentResolver=getContentResolver();
MimeTypeMap MimeTypeMap=MimeTypeMap.getSingleton();
//正在返回文件扩展名。`在此处输入代码`
返回mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}

为什么要在外部访问它,您不能在内部存储到数据库中吗
onSuccess
?请编辑问题以包含以下内容。如果没有这一点,我能做的最好的事情就是让你看看这篇很棒的博客文章,它解释了为什么你不能在
onSuccess()方法之外访问下载URL:你不能这样做,你需要做的是连接引用并移动你的alertdialog,因为数据库是实时的,下载的URL可以随时更改,将该值存储在一个变量中,它不会异步更改,您可能会得到一个NullPointerExecAction,试图访问已更改的内容。在您想要使用它的方法中调用它的可能重复…(我认为您在ActivityResult中调用它)将ImageFileToFireBaseStorage上载(结果);结果是在onactivityresult中返回的imagepath。
# declare variable like below:
    String Storage_Path = "Image_Uploads/";
    String Database_Path = "All_Image_Uploads_Database";
 # declare firebase storage or real time database  variable like below : 
    StorageReference myrefrence;
    DatabaseReference databaseReference;

  myrefrence = FirebaseStorage.getInstance().getReference();     
        databaseReference = FirebaseDatabase.getInstance().getReference(Database_Path);

 public void UploadImageFileToFirebaseStorage(Uri FilePathUri) {
        // Checking whether FilePathUri Is empty or not.
        if (FilePathUri != null) {
            // Setting progressDialog Title.
           // progressDialog.setTitle("Image is Uploading...");
            // Showing progressDialog.
           // progressDialog.show();
            // Creating second StorageReference.
            StorageReference storageReference2nd = myrefrence.child(Storage_Path + System.currentTimeMillis() + "." + GetFileExtension(FilePathUri));

            // Adding addOnSuccessListener to second StorageReference.
            storageReference2nd.putFile(FilePathUri)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            // Getting image name from EditText and store into string variable.
                            //String TempImageName = ImageName.getText().toString().trim();
                            // Hiding the progressDialog after done uploading.
                           // progressDialog.dismiss();
                            // Showing toast message after done uploading.
                            //Toast.makeText(getApplicationContext(), "Image Uploaded Successfully ", Toast.LENGTH_LONG).show();

                            @SuppressWarnings("VisibleForTests")
                            ImageUploadInfo imageUploadInfo = new ImageUploadInfo("",taskSnapshot.getDownloadUrl().toString());
                            // Getting image upload ID.
                            String ImageUploadId = databaseReference.push().getKey();
                            // Adding image upload id s child element into databaseReference.
                            databaseReference.child(ImageUploadId).setValue(imageUploadInfo);
                        }
                    })
                    // If something goes wrong .
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception exception) {
                            // Hiding the progressDialog.
                            //progressDialog.dismiss();
                            // Showing exception erro message.
                           // Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    })

                    // On progress change upload time.
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            // Setting progressDialog Title.
                            //progressDialog.setTitle("Image is Uploading...");
                        }
                    });
        } else {
            //Toast.makeText(MainActivity.this, "Please Select Image or Add Image Name", Toast.LENGTH_LONG).show();

        }
    }

    // Creating Method to get the selected image file Extension from File Path URI.
    public String GetFileExtension(Uri uri) {
        ContentResolver contentResolver = getContentResolver();
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        // Returning the file Extension.`enter code here`
        return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));

    }