【问题标题】:Null image on firebase storage. How to save it original?Firebase 存储上的空图像。怎么保存原来的?
【发布时间】:2021-05-15 09:19:41
【问题描述】:

我试图解决我的应用程序上的一个问题,但我找不到解决方案。我希望应用程序在单击post 后将图像上传到Firebase Storage。问题是,当我点击post 时,图片以 .null 的形式上传,我无法将它们作为帖子添加到我的应用程序中,这是一张Firebase Storage 的照片:

这是 PostsActivity 的代码:

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.webkit.MimeTypeMap;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.selfcial.R;
import com.google.android.gms.tasks.Continuation;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.StorageTask;
import com.theartofdev.edmodo.cropper.CropImage;

import java.util.HashMap;

public class PostActivity extends AppCompatActivity {

    
    Uri imageUri;
    String myUrl;
    StorageTask uploadTask;
    StorageReference storageReference;

    ImageView close, image_added;
    TextView post;
    EditText description;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_post);

        close = findViewById(R.id.close);
        image_added = findViewById(R.id.image_added);
        post = findViewById(R.id.postPhoto);
        description = findViewById(R.id.description);


        storageReference = FirebaseStorage.getInstance().getReference("posts");

        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(PostActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        });


        post.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                uploadImage();
            }
        });


        CropImage.activity()
                .setAspectRatio(1, 1)
                .start(PostActivity.this);

    }


    private String getFileExtension(Uri uri) {
        ContentResolver contentResolver = this.getContentResolver();
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();

        return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
    }


    private void uploadImage() {
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Posting please wait..");
        progressDialog.show();


        if (imageUri != null) {
            StorageReference fileReference = storageReference.child(System.currentTimeMillis()
            + "." + getFileExtension(imageUri));

            uploadTask = fileReference.putFile(imageUri);
            uploadTask.continueWithTask(new Continuation() {
                @Override
                public Object then(@NonNull Task task) throws Exception {
                    if (task.isSuccessful()) {
                        throw task.getException();
                    }

                    return fileReference.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if (task.isSuccessful()) {
                        Uri downloadUri = task.getResult();
                        myUrl = downloadUri.toString();

                        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("posts");

                        String postId = reference.push().getKey();

                        HashMap<String, Object> hashMap = new HashMap<>();
                        hashMap.put("postId", postId);
                        hashMap.put("postImage", myUrl);
                        hashMap.put("description", description.getText().toString());
                        hashMap.put("publisher", FirebaseAuth.getInstance().getCurrentUser().getUid());

                        reference.child(postId).setValue(hashMap);

                        progressDialog.dismiss();

                        startActivity(new Intent(PostActivity.this, MainActivity.class));
                        finish();
                    }else {
                        Toast.makeText(PostActivity.this, "Failed.", Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(PostActivity.this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }else {
            Toast.makeText(this, "No image selected.", Toast.LENGTH_SHORT).show();
        }
    }



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

        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);
            imageUri = result.getUri();

            image_added.setImageURI(imageUri);
        }else {
            Toast.makeText(this, "Something gone wrong", Toast.LENGTH_SHORT).show();
            startActivity(new Intent(PostActivity.this, MainActivity.class));
        }
    }
}

我认为我必须在 onCreate 方法中初始化 Uri,但没有任何改变。应该是什么?

【问题讨论】:

  • 您的 getFileExtension 方法似乎返回 null;使用调试器确保正确检索 mime 类型
  • @kylexy1357 感谢您的回复。我做到了,它告诉我:file:///data/user/0/com.example.selfcial/cache/cropped4720168377540316567.jpg 你知道吗?

标签: java android flutter android-studio xamarin.android


【解决方案1】:

我为遇到相同问题的其他人找到了解决方案,解决方案是我应该在其中添加!,如果,像这样:

if (!task.isSuccessful()) {
   throw task.getException();
 }

【讨论】:

    【解决方案2】:

    我们注意到,您用于检索文件 mime 类型的方法在某些设备上不起作用。您可以尝试其他一些替代方法,例如使用 apache commonsIO lib,或者尝试以下代码:

    public String getMimeType(Uri uri) {           
    String mimeType = null;
    if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
        ContentResolver cr = getAppContext().getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
    }
    

    【讨论】:

    • 我明白了,据我所知,我必须将private String getFileExtension(Uri uri) 中的所有内容替换为private String getFileExtension(Uri uri) 中的所有内容。对吗?
    • 再次显示同样的问题,伙计。我试过了。
    • 它实际上应该返回一个文件扩展名,而不是那个 Uri。 uploadTask = fileReference.putFile(imageUri); 行中 fileReference 的值是多少?
    • 我明白你的意思。我认为它是imageUri,但似乎必须将其更改为其他内容。我会检查一下。非常感谢您的时间和耐心。
    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2021-11-20
    • 2019-07-22
    • 2019-09-14
    • 2020-12-04
    • 2016-09-18
    相关资源
    最近更新 更多