从Firebase Storage检索存储的图像

6

我正在尝试使用Firebase存储和检索图像。当存储图像时,一切正常,但是我无法在ImageView中显示它。它没有给出错误,因此我无法理解错误在哪里。

public class MainActivity extends AppCompatActivity {

private Button btnSelectImage;
private ImageView mImageView;

private StorageReference mStorage;

private static final int CAMERA_REQUEST_CODE = 1 ;

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

    btnSelectImage = (Button) findViewById(R.id.btn_image);
    mImageView = (ImageView) findViewById(R.id.imageView);

    //Get instance
    mStorage = FirebaseStorage.getInstance().getReference();

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

            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, CAMERA_REQUEST_CODE);

        }
    });

}

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

    if(requestCode==CAMERA_REQUEST_CODE && resultCode==RESULT_OK){

        Uri uri = data.getData();

        StorageReference filePath = mStorage.child("CameraPhotos").child(uri.getLastPathSegment());
        filePath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                //Show image
                Uri downloadUri = taskSnapshot.getDownloadUrl();
                Picasso.with(MainActivity.this).load(downloadUri).into(mImageView);

                Toast.makeText(MainActivity.this,"Upload Done",Toast.LENGTH_SHORT).show();
                Log.v("Test","image load");

            }
        });


    }
}
}

也要授予权限。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

这是我的 Firebase 存储规则。
service firebase.storage {
  match /b/fir-app-ce89f.appspot.com/o {
    match /{allPaths=**} {
      allow read, write: if true;
    }
  }
}

这是我的活动布局。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.yusuf.firebaseapp.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Select Image"
        android:id="@+id/btn_image"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="400dp"
        android:layout_height="350dp"
        android:id="@+id/imageView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

你看到“上传完成”的提示了吗? - Bob Snyder
是的,Toast和Log都可以,而且我也成功上传了图片。 - ysfcyln
我复制了你的代码,并在Firebase 9.6.1和Picasso 2.5.2上运行。图片成功上传和下载。也许问题出在你的ImageView属性上。你能把它的XML贴出来吗? - Bob Snyder
我发布了XML,不太确定可能与Firebase版本有关,我使用的是9.4.0? - ysfcyln
1
我改变了意图并使ACTION_PICK,然后测试上传和检索,它工作正常,我认为问题是关于图像捕获。 - ysfcyln
3个回答

13

我建议查看FirebaseUI 0.6,其中包括一个Glide插件,使从Firebase Storage下载图像变得简单:

// Reference to an image file in Firebase Storage
StorageReference storageReference = ...;

// ImageView in your Activity
ImageView imageView = ...;

// Load the image using Glide
Glide.with(this /* context */)
        .using(new FirebaseImageLoader())
        .load(storageReference)
        .into(imageView);

这段代码在Firebase中如果使用相同的存储名称和URL更新了图像,则不会更新图像。我们是否有任何机制可以在存储中更新图像时更新ImageView中的图像? - Hardik Joshi

4

我认为如果您使用这种方法会更容易

StorageReference mImageRef = 
FirebaseStorage.getInstance().getReference("image/test.jpg");
    final long ONE_MEGABYTE = 1024 * 1024;
    mImageRef.getBytes(ONE_MEGABYTE)
    .addOnSuccessListener(new onSuccessListener<byte[]>() {
        @Override
        public void onSuccess(byte[] bytes) {
            Bitmap bm = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            DisplayMetrics dm = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(dm);

            imageView.setMinimumHeight(dm.heightPixels);
            imageView.setMinimumWidth(dm.widthPixels);
            imageView.setImageBitmap(bm);
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
        }
    });

我看到Firebase UI使用Glide。但是在Android Studio中,当我实现它时,会出现错误。因此,我选择使用Bitmap来显示来自Firebase结果(字节数组)的图像。 - Khanh Trần Công

0
    private List<Upload> uploads;
    Upload upload = uploads.get(position);
    Glide.with(context).load(upload.getUrl()).into(holder.imageView);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接