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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用相机意图拍摄照片并将其保存到文件中相关的知识,希望对你有一定的参考价值。

我正在尝试让我的应用程序启动摄像头意图以拍摄照片并将其保存到目录中以及在主视图中显示缩略图,但我似乎并不是很正确。这是我正在使用的方法:

@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);

我怎样才能解决这个问题?

答案

将你的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);
    }
另一答案

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

用这个

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

而不是这个

File photoFile = null;

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

只是Inizeize你的ImageView

另一答案

File photoFile = null - 因为你将null分配给photoFile,每当你尝试在NullPointerException上调用方法时,你将得到一个photoFile。您需要将photoFile设置为由File配置覆盖的某些FileProvider,因为您使用的是FileProvider。另请注意,您可以摆脱createNewFile()呼叫,因为这不是必需的。

而且,既然你正在使用qazxsw poi,qazxsw poi将返回qazxsw poi。您的图像应该位于EXTRA_OUTPUT指示的位置。

extras.get("data")展示nullphotoFile的使用。

以上是关于用相机意图拍摄照片并将其保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用意图的片段中拍摄和保存图片?

相机意图/活动 - 避免保存到画廊

将其他相机拍摄的 DNG(原始照片)保存到 iOS 照片库

如何从我的 Windows Phone 8 应用程序(XAML 和 C#)访问相机并将拍摄的照片保存在确定的文件夹中?

从片段中的相机意图返回后屏幕变为白色

如何在 iOS 5 中连续拍摄两张照片