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

问题描述 投票:-2回答:3

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

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

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

android camera
3个回答
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);
    }

0
投票

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

用这个

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

而不是这个

File photoFile = null;

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

只是Inizeize你的ImageView


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.