Как получить URL изображения Firebase Storage в андроид студии? - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу отобразить изображение на imageView из Firebase Storage без сохранения изображения на устройстве, поэтому я попытался использовать выделенный URL-адрес (с фото ниже), и это работает, но я не хочу писать адрес вручную. Как я могу получить адрес, используя код? ps Я попытался dataBaseStorageRef.getDownloadUrl (), и он дает мне другой URL, а не тот, что на картинке.

введите описание изображения здесь

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

    final StorageReference filePath = storage.child("books").child(""+AddBook.book_id+1).child("photo.jpg");
    if(requestCode == RESULT_GALLERY){
        if (resultCode == RESULT_OK){
            pic_uri = data.getData();
            book_img.setImageURI(pic_uri);
            filePath.putFile(pic_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(AddBookActivity.this, "Upload done", Toast.LENGTH_SHORT).show();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(AddBookActivity.this, "Failed to upload!", Toast.LENGTH_SHORT).show();

                }
            });
            img_addr = filePath.getDownloadUrl().toString();


            Toast.makeText(this, "picture was selected", Toast.LENGTH_SHORT).show();
        }
    }
}

Затем я пытаюсь отобразить картинку из img_addr из другого действия и это не работает, потому что адрес image_addr не является хорошим (если я заменю вручную img_addr на адрес из прикрепленной ссылки, он работает)

    if(books_list.get(i).img_addr!=null){
        Toast.makeText(v.getContext(),books_list.get(i).img_addr,Toast.LENGTH_LONG).show();

        Picasso.with(v.getContext()).load(books_list.get(i).img_addr).resize(50,50).into(img);

    }

Спасибо тем, кто помогает

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Вы можете использовать continueWithTask метод для возврата URL загрузки

Вроде следующего:

final UploadTask uploadTask = filepath.putFile(uri);   
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                    @Override
                                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                        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 filepath.getDownloadUrl();

                                            }
                                        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Uri> task) {
                                                if (task.isSuccessful()) {
                                                    thumb_download_url = task.getResult().toString();


                                                }
                                            }
                                        });

                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                    }
                                });
0 голосов
/ 07 сентября 2018

Вы можете получить URL-адрес для загрузки по нижеуказанному методу:

private void uploadToStorage(String imgPath, String fileName) {

    Uri file = Uri.fromFile(new File(imgPath));
    StorageReference storageReference = mStorageRef.child(userId + "/images/" + fileName);

    storageReference.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Task<Uri> downloadUrl = taskSnapshot.getStorage().getDownloadUrl();
            downloadUrl.addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    Log.v(TAG, "Media is uploaded");

                    String downloadURL = "https://" + task.getResult().getEncodedAuthority() 
                            + task.getResult().getEncodedPath() 
                            + "?alt=media&token=" 
                            + task.getResult().getQueryParameters("token").get(0);

                    Log.v(TAG, "downloadURL: " + downloadURL);
                    //save your downloadURL
                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Log.v(TAG, "Media is not uploaded");
            Log.v(TAG, "Exception: " + exception.getLocalizedMessage());
        }
    });
}

Вы также можете получить имя схемы и запрос из методов в task.getResult()

0 голосов
/ 03 сентября 2018

Сделать getDownloadUrl() асинхронным, добавив к нему прослушиватели onsuccess и onfailure.

Ваша полная задача загрузки изображения должна выглядеть следующим образом

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

                photoReference.getDownloadUrl().addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                       //do something
                    }
                }).addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        //get your image uri here
                        Uri imgUrl = uri;
                        String imgStringUrl = imgUrl.toString();
                    }
                });

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
               // do something
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...