【问题标题】:Not able to upload an Image in Firebase Storage无法在 Firebase 存储中上传图片
【发布时间】:2017-09-21 20:54:49
【问题描述】:

这是我的代码(在 GitHub 上查看此文件 full code),用于将图像上传到 Firebase 存储。

// ImagePickerButton shows an image picker to upload a image for a message
    mPhotoPickerButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent();
            i.setType("image/*");
            i.setAction(Intent.ACTION_GET_CONTENT);
            i.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
            startActivityForResult(Intent.createChooser(i, "Complete action using"), RC_PHOTO_PICKER);
        }
    });

这是OnActivityResult方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
      if (requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK) {

      Uri selectedImageUri = data.getData();

      //get the reference to stored file at database
      StorageReference selectedImageFilePath = mStorageReference.child(selectedImageUri.getLastPathSegment());

      //upload file to firebase
      selectedImageFilePath.putFile(selectedImageUri).addOnSuccessListener(MainActivity.this, new OnSuccessListener < UploadTask.TaskSnapshot > () {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
          @SuppressWarnings("VisibleForTests")
          String downloadUrl = taskSnapshot.getDownloadUrl().toString();
          Message message = new Message(null, userName, downloadUrl);
          messagesDatabaseReference.push().setValue(message);
        }
      });
    }
  }
}

从图库中选择 Image 工作正常,但我无法将所选图像上传到 Firebase 存储。更正我的代码如果我在任何网站上都错了。但是,我在manifest 文件中手动输入了这些行

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我目前正在通过 USB 连接的自己的移动设备上运行该应用程序(Moto G4 - Nougat)

【问题讨论】:

  • 算数吗?因为,默认情况下,Firebase 以 Internet 权限运行,对吗? @PatrixWilliams

标签: android firebase firebase-storage


【解决方案1】:

data.getData() 可以返回不指向文件的 URI。

你应该使用 InputStream is = getContentResolver().openInputStream(data.getData()) 而不是使用 selectedImageFilePath.putStream(is)

您也可以在上传任务中添加一个 onFailureListener 并调试问题所在。

另外,如果我没记错的话,我认为你直接读取onActivityResult中的数据时不需要存储权限。

【讨论】:

  • 它给了我 FileNotFoundException。而且,它不起作用!
  • @PC 可以分享 LogCat 吗?
  • @PC 在 GitHub 上查看您的代码时也是如此。文件上传部分永远无法到达,因为 requestCode 永远不会 2. 检查您的 if 嵌套。
  • LogCat details 。另外,我会将整个项目上传到 GitHub 上。你能检查一下吗?
【解决方案2】:

试试这个按钮点击:

//Select Image functionality
    btnselectImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, 2);
        }
    });

用于将图像保存到火基地:

//Storing and getting image from firebase
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

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

        final Uri uri = data.getData();

        StorageReference filepath = mStorageRef.child("Photos").child(name);
        filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {

            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                Uri downloadUri = taskSnapshot.getDownloadUrl();
                //Getting url where image is stored
                saveImage(downloadUri);
                Picasso.with(getActivity()).load(downloadUri).fit().centerCrop().into(profileImage);
            }
        });
    }

这对我来说很好,希望这会有所帮助。

【讨论】:

  • .child(name) 代表什么?
  • .child(name) 是我分配给图像的用户名,因此我可以指定哪个图像属于哪个用户,但是如果您不需要它,可以将其删除。跨度>
【解决方案3】:

我没有使用else if 语句,而是通过编写单独的if 语句对其进行了修改。

if (requestCode == RC_SIGN_IN) {
  if (resultCode == RESULT_OK) {

  }else if (resultCode == RESULT_CANCELED) {

   }

  // This was the change I made
  if (requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK) {

  }
}

【讨论】:

    【解决方案4】:
    If ( //sign in)
    {
           If (//result ok)
               {}
           else if (//result cancel)
              {}
    }
    
    else if (//rc photot picker && result ok)
       { //your storage code here.....}
    

    tats 效果很好.....仔细检查大括号....

    【讨论】:

    • 欢迎来到 Stack Overflow!您能否在您的问题中添加一些 cmets?帽子使它与现有答案不同?
    • 如何将图像存储在 onActivityResult() 下的 firebase 存储中!
    猜你喜欢
    • 2021-08-18
    • 1970-01-01
    • 2016-11-28
    • 2021-11-21
    • 2021-12-23
    • 2021-06-28
    • 2020-10-05
    相关资源
    最近更新 更多