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

Я смотрю старый учебник о Firebase Storage.Метод getDownloadUrl() из UploadTask.TaskSnapshot больше не существует, а документация мне не понятна.

Я реализовал процесс загрузки, и я могуПодтвердите, что это работает, но получить URL-адрес очень сложно, и я не могу объяснить, как это сделать, потому что:

1) Создание Task<Uri> urlTask = uploadTask.add[...]() приведет к следующей ошибке в IDE:

enter image description here

Я не понимаю, потому что это указано в документации.

2) Использование reference.getDownloadUrl() отобразит другоеURL сравнивается с тем, что отображается на консоли при просмотре деталей загруженного изображения.URL загрузки, который показывает консоль:

https://firebasestorage.googleapis.com/v0/b/chatroom-e44e6.appspot.com/o/chat_photos%2F73185640?alt=media&token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

, в то время как в журнале будет отображаться

com.google.android.gms.tasks.xxx @ xxxxxxx

Мой полный код на данный момент:

if (requestCode == RC_PHOTO_PICKER) {
    if (data != null) {
        Toast.makeText(MainActivity.this, "Uploading...", Toast.LENGTH_SHORT).show();

        Uri file = data.getData();
        final StorageReference reference = mPhotoStorageReference.child(file.getLastPathSegment());
        UploadTask upload = reference.putFile(file);

        upload.addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(MainActivity.this, "Image could not be uploaded: " + e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }).addOnCompleteListener(this, new OnCompleteListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                ChatroomMessage message = new ChatroomMessage(null, mUsername, reference.getDownloadUrl().toString()); // <- com.google.android.gms.tasks.xxx@xxxxxxx
                mMessagesDatabaseReference.push().setValue(message);
                Toast.makeText(MainActivity.this, "Image uploaded!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

В моем приложении уже реализован пользовательский интерфейс Firebase для обработки операций входа в систему, и действуют следующие правила:

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

После многих попыток мне удалось ее решить.Это реализация:

Uri file = data.getData();
final StorageReference reference = mPhotoStorageReference.child(file.getLastPathSegment());
UploadTask upload = reference.putFile(file);

upload.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Toast.makeText(MainActivity.this, "Image could not be uploaded: " + e.getMessage(), Toast.LENGTH_LONG).show();
    }
});

upload.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 reference.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri downloadUrl = task.getResult();
            ChatroomMessage message = new ChatroomMessage(null, mUsername, downloadUrl.toString());

            mMessagesDatabaseReference.push().setValue(message);

            Toast.makeText(MainActivity.this, "Image uploaded!", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, task.getException().toString(), Toast.LENGTH_SHORT).show();
        }
    }
});
0 голосов
/ 08 декабря 2018

Я потратил много времени и наконец получил это решение

    private void uploadImage() {

    if (filePath != null) {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();
        final StorageReference ref = storageReference.child("images/" +currentFirebaseUser.getUid() + "");

        ref.putFile(filePath)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        progressDialog.dismiss();

                        Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl();
                        while (!urlTask.isSuccessful());
                        Uri downloadUrl = urlTask.getResult();
                        Log.e("uri12",downloadUrl+"This is uri of image download");
                        Toast.makeText(AddItemActivity.this, "Uploaded", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        progressDialog.dismiss();
                        Toast.makeText(AddItemActivity.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 + "%");
                    }
                });
    }
}
0 голосов
/ 30 мая 2018

У вас есть Permission denied error это означает, что у вас нет разрешения на доступ к данным из firebase.Пожалуйста, отметьте здесь

enter image description here

, если ваши правила безопасности определены как общедоступные, тогда вам не нужно разрешение, а если оно не является публичным или защищенным, тогда вам нужновойти в систему с помощью авторизации до того, как вы получите данные из firebase, и в случае успешного входа вы можете продолжить свою работу.

отметьте это , это поможет вам понять правила безопасности firebase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...