【问题标题】:Android Send Camera Intent Image to FirebaseAndroid 将相机意图图像发送到 Firebase
【发布时间】:2018-06-15 21:44:17
【问题描述】:

我有一个 ImageButton。每当我们点击 ImageButton 时,Camera Intent 是打开的,我们会抓拍。一切正常,直到这里很好。那么,如何通过身份验证将此相机 Intent 图像上传到 Firebase?我找不到任何认为我们这样的教程视频,但我尝试将图像编码为一个名为 submit 的函数名。从这里我不知道该怎么办

package com.example.android.besafe;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.storage.StorageManager;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import static com.example.android.besafe.R.id.imageview;

public class CameraActivity extends AppCompatActivity {
    private ImageButton mProfileImage;
    Bitmap photo;
    private static final int CAMERA_REQ = 1;
    StorageReference mstorageRef;
    String userId;
    private FirebaseAuth mAuth;
    FirebaseUser firebaseUser;
    FirebaseDatabase firebaseDatabase;
    DatabaseReference ref;

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

        mProfileImage = (ImageButton) findViewById(R.id.btnselect);
        firebaseDatabase = FirebaseDatabase.getInstance();
        ref = firebaseDatabase.getReference("ProfileInfo");
        mAuth = FirebaseAuth.getInstance();

        firebaseUser = mAuth.getCurrentUser();
        userId = firebaseUser.getUid();

        mProfileImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(cameraIntent, CAMERA_REQ);

            }
        });
    }

    public void submit(View v){

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);

        byte[] b = stream.toByteArray();

        StorageReference storageReference =mstorageRef.child("documentImages").child(userId).child("noplateImg");
        //StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profile_images").child(userID);
        storageReference.putBytes(b).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                Uri downloadUrl = taskSnapshot.getDownloadUrl();

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(CameraActivity.this,"failed",Toast.LENGTH_LONG).show();


            }
        });

    }


    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == CAMERA_REQ && resultCode ==RESULT_OK) {

            photo = (Bitmap) data.getExtras().get("data");

        }
    }

}

【问题讨论】:

    标签: android firebase android-intent firebase-authentication firebase-storage


    【解决方案1】:

    我在你的代码中发现了两个错误,你没有调用 submit() 方法,所以它永远不会执行。

    第二次您没有创建 mstorageRef 的实例。

    检查下面的代码,我测试并上传了一张图片。为了简单起见,我在没有用户身份验证的情况下这样做。

    public class CameraActivity extends AppCompatActivity {
        private ImageButton mProfileImage;
        Bitmap photo;
        private static final int CAMERA_REQ = 1;
        StorageReference mstorageRef;
        String userId;
        private FirebaseAuth mAuth;
        FirebaseUser firebaseUser;
        FirebaseDatabase firebaseDatabase;
        DatabaseReference ref;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mProfileImage = (ImageButton) findViewById(R.id.image_holder);
            firebaseDatabase = FirebaseDatabase.getInstance();
            ref = firebaseDatabase.getReference("ProfileInfo");
            mAuth = FirebaseAuth.getInstance();
    
            firebaseUser = mAuth.getCurrentUser();
    //        userId = firebaseUser.getUid();
    
            mProfileImage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    startActivityForResult(cameraIntent, CAMERA_REQ);
    
                }
            });
        }
    
        public void submit(){
    
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            photo.compress(Bitmap.CompressFormat.JPEG, 100, stream);
    
            byte[] b = stream.toByteArray();
            StorageReference storageReference =FirebaseStorage.getInstance().getReference().child("documentImages").child("noplateImg");
            //StorageReference filePath = FirebaseStorage.getInstance().getReference().child("profile_images").child(userID);
            storageReference.putBytes(b).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
    
                    Uri downloadUrl = taskSnapshot.getDownloadUrl();
                    Toast.makeText(CameraActivity.this, "uploaded", Toast.LENGTH_SHORT).show();
    
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(CameraActivity.this,"failed",Toast.LENGTH_LONG).show();
    
    
                }
            });
    
        }
    
    
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CAMERA_REQ && resultCode ==RESULT_OK) {
    
                photo = (Bitmap) data.getExtras().get("data");
                submit();
            }
        }
    }
    

    注意事项

    • 如果不使用用户身份验证,请检查 Firebase 存储读写权限是否设置为允许。

    • 相机是危险权限,您需要获得用户的许可才能使用它。在清单和代码中添加使用相机的权限

    • 确保您的互联网/wifi 已打开

    【讨论】:

      【解决方案2】:

      task.getDowloadUrl() 未定义。你可以使用这个我检查,完美的工作。

       private void firebaseUploadBitmap(Bitmap bitmap) {
          ByteArrayOutputStream stream = new ByteArrayOutputStream();
          bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
          byte[] data = stream.toByteArray();
          StorageReference imageStorage = storage.getReference();
          StorageReference imageRef = imageStorage.child("images/" + "imageName");
      
          Task<Uri> urlTask = imageRef.putBytes(data).continueWithTask(task -> {
              if (!task.isSuccessful()) {
                  throw task.getException();
              }
      
              // Continue with the task to get the download URL
              return imageRef.getDownloadUrl();
          }).addOnCompleteListener(task -> {
              if (task.isSuccessful()) {
                  Uri downloadUri = task.getResult();
                  String uri = downloadUri.toString();
                  sendMessageWithFile(uri);
              } else {
                  // Handle failures
                  // ...
              }
              progressBar.setVisibility(View.GONE);
          });
          
      }
      @Override
      protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
          if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) {
              //      Bitmap imageBitmap = data.getData() ;
              Bitmap photo = (Bitmap) data.getExtras().get("data");
              if (photo != null)
                  firebaseUploadBitmap(photo);
      
          } else if (requestCode == SELECT_IMAGE && resultCode == Activity.RESULT_OK) {
      
              Uri uri = data.getData();
              if (uri != null)
                  firebaseUploadImage(uri);
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多