Android Studio Firebase Storage getDownloadUrl()没有令牌

x8goxv8g  于 2023-05-05  发布在  Android
关注(0)|答案(1)|浏览(149)

我可以成功地将图像上传到firebase存储,但当我尝试使用存储引用和getDownloadUrl检索图像时()我只得到不包含token的图像url,没有token我无法显示图像我试着谷歌如何正确检索链接从firebase存储,似乎我做得正确(对于记录IM试图使用该URL将其保存为包含链接的字符串的Firestore字段中的字符串)
例如:我得到这个:
https://firebasestorage.googleapis.com/XX/X/XXXXXXXXXXXXXX/X/XXXXXXXXXXX
而不是这个,当我把从firebase存储手动获取放在firebase控制台上时,它确实起作用
https://firebasestorage.googleapis.com/XX/X/XXXXXXXXXXXXXX/X/XXXXXXXXXXX?alt=media&token=XXXXXXXXXXXXXXXXXXXXXXXXX
这是我如何让用户选择图像

private void openFileChooser()
    {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);

        activityResultContracts.launch(intent);
    }

这就是我如何得到图像uri

ActivityResultLauncher<Intent> activityResultContracts = registerForActivityResult(new  ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {
            if(result.getResultCode() == Activity.RESULT_OK)
            {
                mImageUri = result.getData().getData();
                uploadFile();
            }
        }
    });

最后这里是上传文件函数

private void uploadFile()
    {
        if(mImageUri != null)
        {
            StorageReference fileReference = storageRef.child("star_images/" + System.currentTimeMillis() + "." + getFileExtension(mImageUri));
            fileReference.putFile(mImageUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<UploadTask.    TaskSnapshot> task) {
                    task.getResult().getMetadata().getReference().getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            db.document("stars/" + starId).update("imagePath", uri.toString());
                        }
                    });
                }
            });
        }
        else
        {
            Snackbar.make(findViewById(R.id.starProfileLayout),"No file selected.", Snackbar.LENGTH_SHORT).show();
        }
    }
}

(in我的firestore数据库中的星星有一个名为imagePath的字符串字段
在我的firebase存储中,图像位于名为星星_imageS的文件夹中)
我只是不明白什么是错的。

iqjalb3h

iqjalb3h1#

要获取downloadUrl,不需要用途:

task.getResult().getMetadata().getReference().getDownloadUrl().addOnSuccessListener(/* ... /*);

这是因为你只阅读图像的引用。task.getResult().getMetadata()返回类型为StorageMetadata的对象。对这样的对象调用getReference()将返回一个StorageReference类型的对象,该对象返回:
此元数据所属的关联StorageReference。
所以看起来你在绕圈子,因为你得到的是对图像本身的引用,而不是包含令牌的downloadUrl
要解决这个问题,您只需使用以下代码行:

fileReference.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        fileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                String downloadUrl = uri.toString();
                Log.d("TAG", downloadUrl);

                //Update the downloadUrl in Firestore.
                db.document("stars/" + starId).update("imagePath", downloadUrl);
            }
        });
    }
});

相关问题