我想创建从相机捕获的图像的缩略图

时间:2017-08-13 18:46:38

标签: android thumbnails

当我通过相机捕获图像时,我在此代码中出错。我想将缩略图存储在设备存储中的MyImages文件夹中。我收到错误

  

引起:java.lang.NullPointerException:file == null“at”fos = new FileOutputStream(thumbnailFile);

在forActivityResult中的代码:

public class FragmentTwo extends Fragment {
Button btn1, btn2;
View v;
File image;
private static final int REQUEST_IMAGE_CAPTURE = 1;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.fragment_two, container, false);
    btn1 = (Button) v.findViewById(R.id.btn1);
    btn2 = (Button) v.findViewById(R.id.btn2);

    btn1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);


            File file = new File(Environment.getExternalStorageDirectory(), "MyImages");
            file.mkdirs();

            File image = new File(file, "picture1" + ".jpg");
            Uri uriSavedImage = Uri.fromFile(image);
            i.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
            startActivityForResult(i, REQUEST_IMAGE_CAPTURE);
        }
    });


    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MyImages");
            imagesFolder.mkdirs();

            File image = new File(imagesFolder, "picture2" + ".jpg");
            Uri uriSavedImage = Uri.fromFile(image);

            i.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);

            startActivity(i);
        }
    });
    return v;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    final int THUMBSIZE = 64;
Bitmap thumbnail = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile("/MyImages/picture1"),
        THUMBSIZE, THUMBSIZE);

File thumbnailFile = image;
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(thumbnailFile);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, fos);
    try {
        fos.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

1 个答案:

答案 0 :(得分:0)

用于创建File以告知相机应用程序保存图像的位置的代码如下所示:

        File imagesFolder = new File(Environment.getExternalStorageDirectory(), "MyImages");
        imagesFolder.mkdirs();

        File image = new File(imagesFolder, "picture2" + ".jpg");

用于创建不完整的代码 - File用于解码图像的代码如下所示:

        "/MyImages/picture1"

这些不一样:

  • 第一个有Environment.getExternalStorageDirectory(),第二个没有

  • 第一个有.jpg分机,第二个没有

因此,BitmapFactory将找不到此文件。

此外,您还没有检查到onActivityResult()确实得到了肯定的结果。如果用户决定不拍照并按BACK退出相机活动,则表示您没有照片。

此外,这不起作用:

File thumbnailFile = image;

您永远不会为image字段指定值,因此imagenullthumbnailFilenull,您尝试时会崩溃创建FileOutputStream。要解决此问题,请将File image = new File(file, "picture1" + ".jpg");替换为image = new File(file, "picture1" + ".jpg");,以便将值分配给名为image的字段,而不是创建名为image的局部变量。

您将在未来遇到更多问题(例如,无法在Android 7.0+上使用Uri.fromFile(),而无法处理在相机应用程序位于前台时终止您的进程的情况。)