【问题标题】:Why image upload failed in firebase storage? [duplicate]为什么图像上传在 Firebase 存储中失败? [复制]
【发布时间】:2020-08-16 08:26:39
【问题描述】:

可以通过单击“选择图像”按钮来选择图像,它将显示在图像视图中 单击“保存图像”后将上传到 Firebase 存储。如果成功,则有关该图像的数据将上传到实时 Firebase 数据库。但是单击“保存图像”按钮后没有任何反应。那里有什么问题?

这些是我的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button chooseButton,saveButton,displayButton;
    private EditText imagenameEdittext;
    private ImageView imageView;
    private ProgressBar progressBar;
    private Uri imageUri;
    private StorageReference storageReference;
    private DatabaseReference  databaseReference;
    private StorageTask uploadTask;

    private static final int IMAGE_REQUEST = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        databaseReference = FirebaseDatabase.getInstance().getReference("Upload");
        storageReference = FirebaseStorage.getInstance().getReference("Upload");

        chooseButton = findViewById(R.id.chooseImageButtonid);
        saveButton = findViewById(R.id.saveImageButtonid);
        displayButton = findViewById(R.id.displayImageButtonid);
        progressBar = findViewById(R.id.progressbarid);

        imageView = findViewById(R.id.imageviewid);
        imagenameEdittext = findViewById(R.id.imagenameEdittextid);

        chooseButton.setOnClickListener(this);
        saveButton.setOnClickListener(this);
        displayButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        switch(view.getId()){

            case R.id.chooseImageButtonid:
                openFileChooser();
                break;
            case R.id.saveImageButtonid:
                if(uploadTask!=null && uploadTask.isInProgress()){
                    Toast.makeText(this, "Uploading in progress", Toast.LENGTH_SHORT).show();
                }
                else{
                    saveData();
                }
                saveData();
                break;
            case R.id.displayImageButtonid:

                break;
        }
    }
    public void openFileChooser(){
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intent,IMAGE_REQUEST);
    }

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

        if(requestCode==IMAGE_REQUEST && resultCode==RESULT_OK && data!=null && data.getData()!=null){
            imageUri = data.getData();
            Picasso.get().load(imageUri).into(imageView);
        }
    }

    public String getFileExtension(Uri imageUri){
        ContentResolver contentResolver = getContentResolver();
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(imageUri));
    }

    private void saveData(){
        final String imageName = imagenameEdittext.getText().toString().trim();
        if(imageName.isEmpty()){
            imagenameEdittext.setError("Enter the image name");
            imagenameEdittext.requestFocus();
            return;
        }
        StorageReference ref = storageReference.child(System.currentTimeMillis()+"."+getFileExtension(imageUri));
        ref.putFile(imageUri)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        // Get a URL to the uploaded content
                        Toast.makeText(MainActivity.this, "Image is stored Successfully", Toast.LENGTH_SHORT).show();

                        Upload upload = new Upload(imageName,taskSnapshot.getStorage().getDownloadUrl().toString());
                        String uploadId = databaseReference.push().getKey();
                        databaseReference.child(uploadId).setValue(upload);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        // Handle unsuccessful uploads
                        Toast.makeText(MainActivity.this, "Image store failed", Toast.LENGTH_SHORT).show();
                    }
                });
    }
}

【问题讨论】:

  • 可能是运行时权限问题。从 API 23 开始,您需要运行时权限才能访问 Gallert 来挑选图像。 stackoverflow.com/questions/39866869/…
  • 你无法获得这样的下载地址 => taskSnapshot.getStorage().getDownloadUrl().toString()
  • 这个不行:taskSnapshot.getStorage().getDownloadUrl().toString()获取下载地址的正确方法,见documentationstackoverflow.com/questions/51056397/…
  • 尝试使用VPN 上传。您可以使用Hotspot Sheild VPN。如果上传可以使用 VPN,那么您必须了解您所在国家/地区的互联网服务存在问题。因为,从 2020 年 5 月 29 日起,Bangladesh firebase 存储的本机 sdk 无法正常工作。这是孟加拉国的BTCL 的问题。我们对此无能为力。所以,试试 Hotspot Sheild VPN。
  • mubin986 在这方面我使用了 SuperVPN。但还是什么都没发生

标签: android firebase-realtime-database firebase-storage


【解决方案1】:

如果 imageuri 不为空,你能告诉我吗? 尝试在日志中打印 imageuri 以检查它是否不为空。

【讨论】:

  • 我检查了 imageuri ,它不为空
猜你喜欢
  • 2019-05-07
  • 2020-07-05
  • 2020-11-20
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多