Метод taskSnapshot.getDownloadUrl () не работает

private void uploadImageToFirebaseStorage() {
    StorageReference profileImageRef =
        FirebaseStorage.getInstance().getReference("profilepics/" + System.currentTimeMillis() + ".jpg");

    if (uriProfileImage != null) {
        progressBar.setVisibility(View.VISIBLE);
        profileImageRef.putFile(uriProfileImage)
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(@NonNull UploadTask.TaskSnapshot taskSnapshot) {
                    progressBar.setVisibility(View.GONE);
                    profileImageUrl = taskSnapshot.**getDownloadUrl**().toString();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    progressBar.setVisibility(View.GONE);
                    Toast.makeText(ProfileActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
    }
}

Метод taskSnapshot.getDownloadUrl() не работает, под ним отображается красная линия

19
0
39 926
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

taskSnapshot.**getDownloadUrl**().toString(); //deprecated and removed

используйте приведенный ниже код для загрузки Url

final StorageReference profileImageRef= FirebaseStorage.getInstance().getReference("profilepics/" + "abc_10123" + ".jpg");

profileImageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
        {
            @Override
            public void onSuccess(Uri downloadUrl) 
            {                
               //do something with downloadurl
            } 
        });

да. его нужно сделать окончательным. пожалуйста, отметьте как решение, если оно вам поможет

Muhammad Saad 30.05.2018 11:37
final StorageReference profileImageRef= FirebaseStorage.getInstance().getReference("profilepics/" +" abc_10123" + ".jpg");
Muhammad Saad 30.05.2018 11:40

для последней версии попробуйте

profileImageUrl = taskSnapshot.getStorage().getDownloadUrl().toString();
Ответ принят как подходящий

Редактировать: см. этот комментарий, почему подход в этом ответе не работает:

firebaser here This answer is wrong. While it at first may appear to work (since it compiles) the result of getDownloadUrl().toString() is not a download URL, but a string representation of a Task object. For a better answer, see stackoverflow.com/a/55503926 or the sample in the Firebase documentation.

Оригинальный ответ ниже ...


В Firebase Storage API версии 16.0.1, изменен метод getDownloadUrl (), использующий объект taskSnapshot. теперь вы можете использовать,

taskSnapshot.getMetadata().getReference().getDownloadUrl().toString()

чтобы получить URL-адрес загрузки из хранилища firebase.

Я использую Firebase Storage API версии 16.0.5, и на задачу нужно ссылаться как на uploadTask.getResult (). GetMetadata (). GetReference (). GetDownl‌ oadUrl (). ToString ();

LeleMarieC 17.01.2019 03:43

теперь какой-то пользователь должен использовать объект StorageReference (путь, куда вы загружаете файл), а затем getDownloadUrl (), а затем добавить CompleteListener, чтобы получить прямой URL-адрес загрузки для конкретного документа ссылки.

SUMIT MONAPARA 23.01.2019 19:23

метод не возвращает URL-адрес загрузки (что ожидается). Ссылка - stackoverflow.com/a/55503926/7764015. Этот код дает ожидаемый результат. (Фактический URL для загрузки файла)

Priyankchoudhary 12.12.2019 11:23
Огнебазер здесьЭто неверный ответ. Хотя сначала может показаться, что он работает (поскольку он компилируется), результатом getDownloadUrl().toString() является не URL-адрес загрузки, а строковое представление объекта Task. Для лучшего ответа см. stackoverflow.com/a/55503926 или образец в документации Firebase: firebase.google.com/docs/storage/android/…
Frank van Puffelen 27.03.2020 22:00

Мои плагины Google Firebase в build.gradle (модуль: приложение):

implementation 'com.firebaseui:firebase-ui-database:3.3.1'
implementation 'com.firebaseui:firebase-ui-auth:3.3.1'
implementation 'com.google.firebase:firebase-core:16.0.0'
implementation 'com.google.firebase:firebase-database:16.0.1'
implementation 'com.google.firebase:firebase-auth:16.0.1'
implementation 'com.google.firebase:firebase-storage:16.0.1'

build.gradle (Проект):

 classpath 'com.google.gms:google-services:3.2.1'

Моя функция upload () и получение загруженных данных из хранилища Firebase:

private void upload() {
    if (filePath!=null) {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();

        final StorageReference ref = storageReference.child(new StringBuilder("images/").append(UUID.randomUUID().toString()).toString());
        uploadTask = ref.putFile(filePath);

        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();
                }

                return ref.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                    progressDialog.dismiss();
                    // Continue with the task to get the download URL
                    saveUrlToCategory(downloadUri.toString(),categoryIdSelect);
                } else {
                    Toast.makeText(UploadWallpaper.this, "Fail UPLOAD", Toast.LENGTH_SHORT).show();
                }
            }
        }).addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                progressDialog.setMessage("Uploaded: ");
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                progressDialog.dismiss();
                Toast.makeText(UploadWallpaper.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

ДЛЯ ТЕХ, КТО ИСПОЛЬЗУЕТ ПОСЛЕДНЮЮ ВЕРСИЮ FIREBASE, метод taskSnapshot.getDownloadUrl () УСТАРЕЛ или УСТАРЕЛ !!

Попробуйте использовать это:

taskSnapshot.getMetadata().getReference().getDownloadUrl().toString()

Попробуйте использовать это, он загрузит изображение из хранилища FireBase

Библиотеки FireBase версии 16.0.1

Task<Uri> result = taskSnapshot.getMetadata().getReference().getDownloadUrl();
result.addOnSuccessListener(new OnSuccessListener<Uri>() {
      @Override
      public void onSuccess(Uri uri) {
             String photoStringLink = uri.toString();
      }
});

Отметить это как действительный ответ

Pandiri Deepak 15.09.2018 11:53

Теперь вы не получите URL-адрес загрузки изображения, используя

profileImageUrl = taskSnapshot.**getDownloadUrl**().toString();

этот метод устарел.

Вместо этого вы можете использовать метод ниже

    uniqueId = UUID.randomUUID().toString();
    ur_firebase_reference = storageReference.child("user_photos/" + uniqueId);

    Uri file = Uri.fromFile(new File(mphotofile.getAbsolutePath()));
    UploadTask uploadTask = ur_firebase_reference.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 ur_firebase_reference.getDownloadUrl();
        }
    }).addOnCompleteListener(new OnCompleteListener<Uri>() {
        @Override
        public void onComplete(@NonNull Task<Uri> task) {
            if (task.isSuccessful()) {
                Uri downloadUri = task.getResult();
                System.out.println("Upload " + downloadUri);
                Toast.makeText(mActivity, "Successfully uploaded", Toast.LENGTH_SHORT).show();
                if (downloadUri != null) {

                    String photoStringLink = downloadUri.toString(); //YOU WILL GET THE DOWNLOAD URL HERE !!!!
                    System.out.println("Upload " + photoStringLink);

                }

            } else {
                // Handle failures
                // ...
            }
        }
    });

У меня все еще есть эта ошибка. Что может быть не так? Я уже изменил разрешения, а пользователей на анонимных.

//upload button onClick
public void uploadImage(View view){
    openImage()
}

private Uri imageUri;

ProgressDialog pd;

//Call open Image from any onClick Listener
private void openImage() {
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(intent,IMAGE_REQUEST);
}

private void uploadImage(){
    pd = new ProgressDialog(mContext);
    pd.setMessage("Uploading...");
    pd.show();

    if (imageUri != null){
        final StorageReference fileReference = storageReference.child(userID
                + "."+"jpg");

        // Get the data from an ImageView as bytes
        _profilePicture.setDrawingCacheEnabled(true);
        _profilePicture.buildDrawingCache();

        //Bitmap bitmap = ((BitmapDrawable) _profilePicture.getDrawable()).getBitmap();

        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
        } catch (IOException e) {
            e.printStackTrace();
        }

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
        byte[] data = baos.toByteArray();

        UploadTask uploadTask = fileReference.putBytes(data);
        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle unsuccessful uploads
                pd.dismiss();
                Log.e("Data Upload: ", "Failled");
            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
                // ...
                Log.e("Data Upload: ", "success");
                Task<Uri> result = taskSnapshot.getMetadata().getReference().getDownloadUrl();
                result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        String downloadLink = uri.toString();
                        Log.e("download url : ", downloadLink);
                    }
                });

                pd.dismiss();

            }
        });

    }else {
        Toast.makeText(getApplicationContext(),"No Image Selected", Toast.LENGTH_SHORT).show();
    }
}

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

    Bitmap bitmap = null;
    if (requestCode == IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null){
        imageUri = data.getData();
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(),imageUri);
            _profilePicture1.setImageBitmap(bitmap);
            _profilePicture1.setDrawingCacheEnabled(true);
            _profilePicture1.buildDrawingCache();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (uploadTask != null && uploadTask.isInProgress()){
            Toast.makeText(mContext,"Upload in Progress!", Toast.LENGTH_SHORT).show();
        }
        else {
            try{
                uploadImage();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

Я столкнулся с аналогичной ошибкой, которую решил этим методом. Надеюсь, поможет

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Task<Uri> task = taskSnapshot.getMetadata().getReference().getDownloadUrl();
                task.addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        String photoLink = uri.toString();
                        Map userInfo = new HashMap();
                        userInfo.put("profileImageUrl", photoLink);
                        mUserDatabase.updateChildren(userInfo);
                    }
                });
                finish();
                return;
            }
        });

Я использую Firebase Storage API версии 16.0.5, и на задачу нужно ссылаться как

 someTask.getResult().getMetadata().getReference().getDownloadUrl().toString();

надеюсь это поможет!

Чтобы получить путь к imageUrl из хранилища, используйте этот код:

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        if (taskSnapshot.getMetadata() != null) {
            if (taskSnapshot.getMetadata().getReference() != null) {
                Task<Uri> result = taskSnapshot.getStorage().getDownloadUrl();
                result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        String imageUrl = uri.toString();
                        //createNewPost(imageUrl);
                    }
                });
            }
        }
    }});

это все ?

NOTE: Do not forget initialize StorageReference and UploadTask in your uploadFile method.

Только это...

taskSnapshot.getStorage (). getDownloadUrl ();

Task<Uri> result = taskSnapshot.getStorage().getDownloadUrl();
result.addOnSuccessListener(new OnSuccessListener<Uri>() {
   @Override
   public void onSuccess(Uri uri) {
       String photoStringLink = uri.toString();
       mDatavaseRef.push().setValue(photoStringLink);
   }
});
 ref.putFile(filePath)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                        taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                            @Override
                            public void onComplete(@NonNull Task<Uri> task) {
                                changeProfilePic(String.valueOf(task.getResult()));//gives image or file string url
                            }
                        });

попробуйте этот код точно будет работать

Этот ответ рекомендуется.

Umar Ata 29.11.2019 14:44

Версия библиотеки FirebaseStorage 19.0.1 работает с

String download_image_path = task.getResult().getUploadSessionUri().toString();
//firebase database
implementation 'com.google.firebase:firebase-database:15.0.0'
//firebase storage
implementation 'com.google.firebase:firebase-storage:15.0.0'

Метод .getDownloadUrl() удален из более поздних версий, я изменил его на 15.0.0 и работает отлично. Вы можете найти его в build.gradle (module: app)

Для кода Java

String downloadUrl = taskSnapshot.getMetadata().getReference().getDownloadUrl().toString();

Для Котлина

val downloadUrl = taskSnapshot.getMetadata()?.getReference()?.getDownloadUrl()?.toString()

Это будет работать:

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


                Task<Uri> result = taskSnapshot.getMetadata().getReference().getDownloadUrl();
                result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        String photoStringLink = uri.toString();
                        Log.i("urlimage", photoStringLink);
                    }
                });
            }
        });

Попробуй это:

Uri download_uri ;

final Map<String, String> userData = new HashMap<>();
    if (task != null) {
       //download_uri = task.getResult().getDownloadUrl();
      download_uri = task.getResult().getUploadSessionUri();
    }
    else {
        download_uri= imageUri;
    }

userData.put("Image", download_uri.toString());
userData.put("name",username);
userData.put("category",category);
userData.put("status",status);

это поможет мне с последними зависимостями в 04/2020

     // Get a reference to store file at chat_photos/<FILENAME>
     final StorageReference photoRef = mChatPhotosStorageReference.child(selectedImageUri.getLastPathSegment());
     photoRef.putFile(selectedImageUri).addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        //When the image has successfully uploaded, get its downloadURL
                        photoRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                Uri dlUri = uri;
                                FriendlyMessage friendlyMessage = new 
                                  FriendlyMessage(null, mUsername, dlUri.toString());

Используйте Хранилище Firebase версии 15.0.0.

Uri downloadUrl=taskSnapshot.getDownloadUrl().toString();

вы также можете использовать Picasso dependencies. его легко использовать для загрузки изображения в firebase.

ActivityFile:

 Picasso.get().load(uriImage).into(ImageUri);

приложение-градиент:

com.squareup.picasso:picasso:2.71828

Это решит вашу проблему ....

if (uploadTask.isSuccessfull()){
Task<Uri> uriTask=uploadTask.getResult().getStorage().getDownloadUrl();                                               while(!uriTask.isSuccessful());
Uri downloadUri=uriTask.getResult();
final String download_url=downloadUri.toString();
}

не могли бы вы объяснить, почему это решит его проблему?

Uni 14.10.2020 07:04

Другие вопросы по теме