web-dev-qa-db-ja.com

taskSnapshot.getDownloadUrl()は非推奨です

これまで、Firebaseのストレージ上のファイルからURLを取得する方法は、これまでtaskSnapshot.getDownloadUrlが、現在は非推奨です。どのメソッドを使用する必要がありますか?

enter image description here

12
Liliana J

ダグが言うように、タスク内で実行する必要があります

実装方法のヒントを次に示します

final StorageReference ref = storageRef.child("your_REF");
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();
                String downloadURL = downloadUri.toString();
            } else {
                // Handle failures
                // ...
            }
        }
    });

実装方法の詳細については、これに回答してから7日後に開かれたこのgithubの質問を確認できます https://github.com/udacity/and-nd-firebase/issues/41

13

このコードは私のために機能します。

あなたが試すことができます。

package br.com.amptec.firebaseapp;

import Android.graphics.Bitmap;
import Android.net.Uri;
import Android.provider.ContactsContract;
import Android.support.annotation.NonNull;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.View;
import Android.widget.Button;
import Android.widget.ImageView;
import Android.widget.Toast;

import com.google.Android.gms.tasks.OnCompleteListener;
import com.google.Android.gms.tasks.OnFailureListener;
import com.google.Android.gms.tasks.OnSuccessListener;
import com.google.Android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import Java.io.ByteArrayOutputStream;
import Java.util.UUID;

public class MainActivity extends AppCompatActivity {

    private DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    private FirebaseAuth auth = FirebaseAuth.getInstance();

    private Button btnUpload;
    private ImageView imgPhoto;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnUpload = findViewById(R.id.btnUpload);
        imgPhoto = findViewById(R.id.imgPhoto);

        btnUpload.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                imgPhoto.setDrawingCacheEnabled(true);
                imgPhoto.buildDrawingCache();
                Bitmap bitmap = imgPhoto.getDrawingCache();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] imageBytes = baos.toByteArray();
                String fileName = UUID.randomUUID().toString();

                StorageReference storageReference = FirebaseStorage.getInstance().getReference();
                StorageReference images = storageReference.child("images");
                StorageReference imageRef = images.child(fileName + ".jpeg");

                UploadTask uploadTask = imageRef.putBytes(imageBytes);

                uploadTask.addOnFailureListener(MainActivity.this, new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(MainActivity.this, "Upload Error: " +
                                e.getMessage(), Toast.LENGTH_LONG).show();
                    }
                }).addOnSuccessListener(MainActivity.this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        //Uri url = taskSnapshot.getDownloadUrl();
                        Task<Uri> uri = taskSnapshot.getStorage().getDownloadUrl();
                        while(!uri.isComplete());
                        Uri url = uri.getResult();

                        Toast.makeText(MainActivity.this, "Upload Success, download URL " +
                                url.toString(), Toast.LENGTH_LONG).show();
                        Log.i("FBApp1 URL ", url.toString());
                    }
                });
            }
        });
    }
}
4
Adriano Pereira

StorageReference.getDownloadUrl() を使用できます。タスクを返すので、他のタスクと同様に非同期で処理することを忘れないでください。

3
Doug Stevenson
//Create an instance of StorageReference first (here in this code snippet, it is storageRef)  

StorageReference filepath = storageRef.child("images.jpg");

 //If file exist in storage this works.
 filepath.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                            @Override
                            public void onComplete(@NonNull Task<Uri> task) {
                                String downloadUrl = task.getResult().toString();
                                // downloadurl will be the resulted answer
                             }
 });
1
Ananthu

UploadTaskにこの実装を使用すると機能します。 :)

uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Task<Uri> firebaseUri = taskSnapshot.getStorage().getDownloadUrl();
                firebaseUri.addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {

                        String url = uri.toString();
                        Log.e("TAG:", "the url is: " + url);

                        String ref = yourStorageReference.getName();
                        Log.e("TAG:", "the ref is: " + ref);
                    }
                });
            }
        });
1

以下のコードを追加します。

Task<Uri> downUrl=taskSnapshot.getMetadata().getReference().getDownloadUrl();
Log.i("url:",downUrl.getResult().toString());
0
Qamber

現在使用している画像のダウンロードURLは取得できません

ImageUrl = 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
            // ...
        }
    }
});

Progressリスナーを追加することで、アップロードの進行状況を追跡できます。

uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
            double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
            System.out.println("Upload is " + progress + "% done");
            Toast.makeText(mContext, "Upload is " + progress + "% done", Toast.LENGTH_SHORT).show();
        }
    }).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
            System.out.println("Upload is paused");
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // Handle successful uploads on complete
            // ...
        }
    });
0
MIDHUN CEASAR

ref.putFile(uriImage).addOnSuccessListener(new OnSuccessListener()の代わりにTaskを使用するだけで、最近では、firebase参照はUploadtaskオブジェクトの使用を提案しています

私はこのようにしました:

UploadTask uploadTask;
        uploadTask = storageReferenceProfilePic.putFile(uriProfileImage );

        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 storageReferenceProfilePic.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    progressBarImageUploading.setVisibility(View.GONE);
                    Uri downloadUri = task.getResult();
                    profileImageUrl = downloadUri.toString();
                    ins.setText(profileImageUrl);
                } else {
                    // Handle failures
                    // ...
                }
            }
        });

上記のコードの次の行に注意してください。

Uri downloadUri = task.getResult();
profileImageUrl = downloadUri.toString();

ProfileImageUrlには、「 http:// adressofimage 」のようなものが含まれます。これは画像にアクセスするためのURLです

これで、自由にString profileImageUrlを使用できます。たとえば、GlideまたはFrescoライブラリを使用して、URLをImageViewにロードします。

0
Sougata Ghosh