Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从firebase存储中获取imageUrl以存储在firebase实时数据库中?_Java_Android_Firebase_Firebase Storage - Fatal编程技术网

Java 如何从firebase存储中获取imageUrl以存储在firebase实时数据库中?

Java 如何从firebase存储中获取imageUrl以存储在firebase实时数据库中?,java,android,firebase,firebase-storage,Java,Android,Firebase,Firebase Storage,基本上,我创建了一个名为“俱乐部”的类。我成功地将一个新的club保存到firebase实时数据库,没有任何实际问题,直到我想将一个imageURL(称为ClubiImage)从firebase存储添加到我的club类 我能够使用以下代码成功地将我的图像上载到Firebase存储 private void uploadImage() { //upload selected image to database //code from https://code

基本上,我创建了一个名为“俱乐部”的类。我成功地将一个新的club保存到firebase实时数据库,没有任何实际问题,直到我想将一个imageURL(称为ClubiImage)从firebase存储添加到我的club类

我能够使用以下代码成功地将我的图像上载到Firebase存储

    private void uploadImage() {
        //upload selected image to database
        //code from https://code.tutsplus.com/tutorials/image-upload-to-firebase-in-android-application--cms-29934
             if(filePath != null)
        {
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("Uploading...");
            progressDialog.show();

            final StorageReference ref = storageReference.child("images/"+ UUID.randomUUID().toString());


            ref.putFile(filePath)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            progressDialog.dismiss();
                            Toast.makeText(AddClubActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();

                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            progressDialog.dismiss();
                            Toast.makeText(AddClubActivity.this, "Failed "+e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot
                                    .getTotalByteCount());
                            progressDialog.setMessage("Uploaded "+(int)progress+"%");
                        }
                    });
        }
    }
private void uploadImage(){
//将所选图像上载到数据库
//代码来自https://code.tutsplus.com/tutorials/image-upload-to-firebase-in-android-application--cms-29934
if(filePath!=null)
{
final ProgressDialog ProgressDialog=新建ProgressDialog(此);
progressDialog.setTitle(“上载…”);
progressDialog.show();
final-storagereferef=StorageReference.child(“images/”+UUID.randomUUID().toString());
ref.putFile(文件路径)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
progressDialog.disclose();
Toast.makeText(addclubativity.this,“上载”,Toast.LENGTH_SHORT.show();
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
progressDialog.disclose();
Toast.makeText(addclubativity.this,“Failed”+e.getMessage(),Toast.LENGTH\u SHORT.show();
}
})
.addOnProgressListener(新的OnProgressListener(){
@凌驾
public void onProgress(UploadTask.TaskSnapshot TaskSnapshot){
双进度=(100.0*taskSnapshot.GetByTestTransferred()/taskSnapshot
.getTotalByteCount());
progressDialog.setMessage(“上传”+(int)进度+“%”;
}
});
}
}
这一切都很好。然而,在相同的方法中,我也有这段代码,这是我尝试获取上传图像的下载URL的地方

            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    Uri downloadUrl = uri;
                    clubImage = downloadUrl.toString();
                }
            });
ref.getDownloadUrl().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
Uri downloadUrl=Uri;
clubImage=downloadUrl.toString();
}
});
我知道,对于同一件事,使用两个OnSuccessListener是低效的,我只是不知道如何同时上传图像和获取下载URL。 不管怎样,这是行不通的,我的新俱乐部在没有clubImage字段的情况下进行储蓄。 我得到错误:E/StorageException:StorageException已发生。 对象在位置处不存在

有人知道如何解决这个问题吗? 谢谢。

尝试使用以下方法:

private Uri ImageUri;   //and get image from gallery intent to this ImageUri
...............
StorageReference filePath = FirebaseStorage.getInstance().getReference().child("Club Images").child(ImageUri.getLastPathSegment() + ".jpg");

    filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
        {
            if(task.isSuccessful())
            {
                downloadUrl = task.getResult().getDownloadUrl().toString();

                updatetoFirebaseDatabase();

            }
            else
            {
                String message = task.getException().getMessage();
            }
        }
    });
........... 
尝试使用以下方法:

private Uri ImageUri;   //and get image from gallery intent to this ImageUri
...............
StorageReference filePath = FirebaseStorage.getInstance().getReference().child("Club Images").child(ImageUri.getLastPathSegment() + ".jpg");

    filePath.putFile(ImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task)
        {
            if(task.isSuccessful())
            {
                downloadUrl = task.getResult().getDownloadUrl().toString();

                updatetoFirebaseDatabase();

            }
            else
            {
                String message = task.getException().getMessage();
            }
        }
    });
........... 
我知道在同一件事上使用两个OnSuccessListener是低效的

您有两项任务要完成:

  • 上传文件
  • 获取该文件的下载URL
  • 由于这是两个独立的任务,因此需要两个
    OnSuccessListeners
    。这没有什么低效的,任务也不一样

    上的Firebase文档精确显示了如何连续完成这两项任务:

    final-storagereferef=storageRef.child(“images/mountains.jpg”);
    uploadTask=ref.putFile(文件);
    Task urlTask=uploadTask.continueWithTask(新的Continuation(){
    @凌驾
    公共任务(@NonNull Task Task)引发异常{
    如果(!task.issusccessful()){
    抛出task.getException();
    }
    //继续执行任务以获取下载URL
    return ref.getDownloadUrl();
    }
    }).addOnCompleteListener(新的OnCompleteListener(){
    @凌驾
    未完成的公共void(@NonNull任务){
    if(task.issusccessful()){
    Uri downloadUri=task.getResult();
    }否则{
    //处理故障
    // ...
    }
    }
    });
    
    您将注意到,这段代码首先完成
    上传任务
    (上传文件),然后才启动新任务以获取下载URL。按此顺序执行任务可防止收到“位置上不存在对象”错误消息

    我知道在同一件事上使用两个OnSuccessListener是低效的

    您有两项任务要完成:

  • 上传文件
  • 获取该文件的下载URL
  • 由于这是两个独立的任务,因此需要两个
    OnSuccessListeners
    。这没有什么低效的,任务也不一样

    上的Firebase文档精确显示了如何连续完成这两项任务:

    final-storagereferef=storageRef.child(“images/mountains.jpg”);
    uploadTask=ref.putFile(文件);
    Task urlTask=uploadTask.continueWithTask(新的Continuation(){
    @凌驾
    公共任务(@NonNull Task Task)引发异常{
    如果(!task.issusccessful()){
    抛出task.getException();
    }
    //继续执行任务以获取下载URL
    return ref.getDownloadUrl();
    }
    }).addOnCompleteListener(新的OnCompleteListener(){
    @凌驾
    未完成的公共void(@NonNull任务){
    if(task.issusccessful()){
    Uri downloadUri=task.getResult();
    }否则{
    //处理故障
    // ...
    }
    }
    });
    
    您将注意到,这段代码首先完成
    上传任务
    (上传文件),然后才启动新任务以获取下载URL。执行官
    final StorageReference ref = storageRef.child("images/mountains.jpg");
    uploadTask = ref.putFile(file);
    
    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 ref.getDownloadUrl();
        }
    }).addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(@NonNull Task<Uri> task) {
            if (task.isSuccessful()) {
                Uri downloadUri = task.getResult();
            } else {
                // Handle failures
                // ...
            }
        }
    });