Java Android应用程序在使用相机拍摄图像后崩溃

Java Android应用程序在使用相机拍摄图像后崩溃,java,android,firebase-storage,Java,Android,Firebase Storage,该应用程序尝试使用设备的摄像头捕获图像并将其上载到FireBase。但是,在捕获图像后,应用程序崩溃 它显示错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.net.Uri android.content.Intent.getData()” MainActivity中的功能: private File createImageFile() throws IOException { String timeStamp

该应用程序尝试使用设备的摄像头捕获图像并将其上载到FireBase。但是,在捕获图像后,应用程序崩溃

它显示错误:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.net.Uri android.content.Intent.getData()”

MainActivity中的功能:

 private File createImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        mCurrentPhotoPath = image.getAbsolutePath();
        return image;
    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
            } catch (IOException e) {
                Log.e("MainActivity", "Error creating file", e);
            }
            if (photoFile != null) {
                photoURI = FileProvider.getUriForFile(this,
                        "com.example.android.fileprovider",
                        photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
            }
        }
    }

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

        storage = FirebaseStorage.getInstance().getReference();
        take_pic = (Button) findViewById(R.id.take_pic);
        imageView = (ImageView) findViewById(R.id.pic_view);

        progressDialog = new ProgressDialog(this);

        take_pic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dispatchTakePictureIntent();

            }
        });
    }

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

        if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) {
            progressDialog.setMessage("Uploading...");
            progressDialog.show();
            StorageReference filepath;

            Uri uri = data.getData();

            filepath = storage.child("Photos").child(uri.getLastPathSegment());

            filepath.putFile(photoURI).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(MainActivity.this, "Upload Successful!", Toast.LENGTH_SHORT).show();
                    progressDialog.dismiss();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(MainActivity.this, "Upload Failed!", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
private File createImageFile()引发IOException{
字符串时间戳=新的SimpleDateFormat(“yyyyMMdd_HHmmss”)。格式(新日期();
字符串imageFileName=“JPEG_389;”+时间戳+“389;”;
File storageDir=getExternalFilesDir(Environment.DIRECTORY\u图片);
File image=File.createTempFile(
imageFileName,/*前缀*/
“.jpg”,/*后缀*/
storageDir/*目录*/
);
mCurrentPhotoPath=image.getAbsolutePath();
返回图像;
}
私有无效DispatchTakePictureContent(){
Intent takePictureIntent=新的意图(MediaStore.ACTION\u IMAGE\u CAPTURE);
if(takePictureContent.resolveActivity(getPackageManager())!=null){
//创建照片应该放在哪里的文件
文件photoFile=null;
试一试{
photoFile=createImageFile();
}捕获(IOE异常){
Log.e(“MainActivity”,“创建文件时出错”,e);
}
if(photoFile!=null){
photoURI=FileProvider.getUriForFile(这个,
“com.example.android.fileprovider”,
照片文件);
takePictureContent.putExtra(MediaStore.EXTRA_输出,photoURI);
startActivityForResult(拍摄图片内容、摄像头请求代码);
}
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
storage=FirebaseStorage.getInstance().getReference();
take_pic=(按钮)findviewbyd(R.id.take_pic);
imageView=(imageView)findViewById(R.id.pic_视图);
progressDialog=新建progressDialog(此);
以_pic.setOnClickListener(new View.OnClickListener()为例{
@凌驾
公共void onClick(视图){
DispatchTakePictureContent();
}
});
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==CAMERA\u REQUEST\u CODE&&resultCode==RESULT\u OK){
progressDialog.setMessage(“上载…”);
progressDialog.show();
StorageReference文件路径;
Uri=data.getData();
filepath=storage.child(“照片”).child(uri.getLastPathSegment());
filepath.putFile(photoURI).addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
Toast.makeText(MainActivity.this,“上载成功!”,Toast.LENGTH_SHORT.show();
progressDialog.disclose();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(MainActivity.this,“上载失败!”,Toast.LENGTH_SHORT.show();
}
});
}
}

由于您的intent.getData为null,因此您会收到该错误。这也发生在我身上,当使用拍照意图时,您的onActivityResult总是将数据显示为null。作为一种解决方法,我将photoURI作为活动中的一个全局变量,然后onActivityResult再次调用它。应该是这样的:

首先声明变量

Uri myPhotoUri = null;
然后,在DispatchTakePictureContent函数中启动它:

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException e) {
            Log.e("MainActivity", "Error creating file", e);
        }
        if (photoFile != null) {

            //you are adding initializing the uri
            myPhotoUri = FileProvider.getUriForFile(this,
                    "com.example.android.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, CAMERA_REQUEST_CODE);
        }
    }
}
在onActivityResult上,使用该uri调用firebase函数。现在,它将拥有上传所需的信息:

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

    if (requestCode == CAMERA_REQUEST_CODE && resultCode == RESULT_OK) {
        progressDialog.setMessage("Uploading...");
        progressDialog.show();
        StorageReference filepath;

      //you delete the Uri uri = data.getData();
        filepath = storage.child("Photos").child(uri.getLastPathSegment());

        //here you call it

        filepath.putFile(myPhotoUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Toast.makeText(MainActivity.this, "Upload Successful!", Toast.LENGTH_SHORT).show();
                progressDialog.dismiss();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(MainActivity.this, "Upload Failed!", Toast.LENGTH_SHORT).show();
            }
        });
    }
}
@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==CAMERA\u REQUEST\u CODE&&resultCode==RESULT\u OK){
progressDialog.setMessage(“上载…”);
progressDialog.show();
StorageReference文件路径;
//删除Uri=data.getData();
filepath=storage.child(“照片”).child(uri.getLastPathSegment());
//给你
filepath.putFile(myPhotoUri).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
Toast.makeText(MainActivity.this,“上载成功!”,Toast.LENGTH_SHORT.show();
progressDialog.disclose();
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(MainActivity.this,“上载失败!”,Toast.LENGTH_SHORT.show();
}
});
}
}

首先检查您是否有使用相机的权限,然后

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQ);
然后是活动结果

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_REQ && resultCode == Activity.RESULT_OK) {
        bitmap = (Bitmap) data.getExtras().get("data");
        Bitmap.createScaledBitmap(bitmap, 150, 150, true);
    }
}
然后从位图到字节[]

public static byte[] getByteArrayFromBitmap(Bitmap bitmap) {
        if(bitmap == null) return null;

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 50, byteArrayOutputStream);

        return byteArrayOutputStream.toByteArray();
    }

现在,您可以使用位图或字节[]执行任何操作。

您是否理解您的
NullPointerException
?你知道是哪一行代码引起的吗?不要使用data.getData(),而是使用旧的photoURI。