用相机意图拍摄照片并将其保存到文件中

时间:2017-11-21 12:19:23

标签: android camera

我试图让我的应用启动相机意图以拍照并将其保存到目录中以及在主视图中显示缩略图,但我似乎不太相似把它弄好。以下是我使用的方法:

@RequiresApi(api = Build.VERSION_CODES.M)
private void dispatchTakePictureIntent() {
    if (ContextCompat.checkSelfPermission(getContext(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{android.Manifest.permission.CAMERA},
                    5);
        }
    }

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getContext().getPackageManager()) != null) {
        File photoFile = null;

        try {
            photoFile.createNewFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        if(photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(getContext(),
                    "com.example.android.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

这里是OnActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        image.setImageBitmap(imageBitmap);
    }

}

我似乎在两个不同的地方获得NullPointerException,位于:

  • photoFile.createNewFile();
  • image.setImageBitmap(imageBitmap);

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

  

在两个不同的地方发生NullPointerException,在photoFile.createNewFile();

使用此

 File photoFile = new File(Environment.getExternalStorageDirectory() + File.separator + "filename");

而不是

File photoFile = null;
  

在两个不同的地方出现NullPointerException,位于image.setImageBitmap(imageBitmap);

只是暂停您的ImageView

答案 1 :(得分:0)

File photoFile = null - 由于您要将null分配给photoFile,因此每当您尝试在NullPointerException上调用方法时,您都会获得photoFile。您需要将photoFile设置为File配置所涵盖的某些FileProvider,因为您使用的是FileProvider。另请注意,您可以删除createNewFile()电话,因为这不是必需的。

而且,由于您使用EXTRA_OUTPUTextras.get("data")将返回null。您的图片应位于photoFile指示的位置。

Here is a sample app演示了ACTION_IMAGE_CAPTUREFileProvider的使用情况。

答案 2 :(得分:0)

onActivityResult更改为

  @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {  
                    onCaptureImageResult(data);
            }
        }
用于设置缩略图的

通过data变量中的ImageView,如下所示:

private void onCaptureImageResult(Intent data) {

        Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
        byteArray = bytes.toByteArray();
        encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
        File destination = new File(Environment.getExternalStorageDirectory(),
                System.currentTimeMillis() + ".jpg");
        FileOutputStream fo;
        try {
            destination.createNewFile();
            fo = new FileOutputStream(destination);
            fo.write(bytes.toByteArray());
            fo.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        imageView.setImageBitmap(thumbnail);
    }