错误捕获照片和显示缩略图android studio

时间:2017-09-14 03:57:34

标签: android android-intent android-camera android-bitmap android-camera-intent

嗨,我正在为我的实习制作一个应用程序,但我收到了一个错误。
请帮我解决这个问题

这是activity.java

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intents
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.provider", photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

这是onActivityResult()代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageView.setImageBitmap(imageBitmap);
    }
    if (resultCode == Activity.RESULT_OK){
        if (requestCode == PICK_FILE_REQUEST){
            if (data == null){
                return;
            }

            Uri selectedFileUri = data.getData();
            selectedFilePath = FilePath.getPath(this, selectedFileUri);
            Log.i(TAG,"Selected File Path:"+selectedFilePath);

            if (selectedFilePath != null && !selectedFilePath.equals("")){
                tv_file_name.setText(selectedFilePath);
            }else{
                Toast.makeText(this, "Cannot upload file to server", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

我得到了这个

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent {  }} to activity {com.example.febryan.apptest/com.example.febryan.apptest.RequestActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference
                                                                           at android.app.ActivityThread.deliverResults(ActivityThread.java:4324)
                                                                           at android.app.ActivityThread.handleSendResult(ActivityThread.java:4367)
                                                                           at android.app.ActivityThread.-wrap19(Unknown Source:0)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1649)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:105)
                                                                           at android.os.Looper.loop(Looper.java:164)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6541)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
                                                                        Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.os.Bundle.get(java.lang.String)' on a null object reference
                                                                           at com.example.febryan.apptest.RequestActivity2.onActivityResult(RequestActivity2.java:311)
                                                                           at android.app.Activity.dispatchActivityResult(Activity.java:7235)
                                                                           at android.app.ActivityThread.deliverResults(ActivityThread.java:4320)

请帮我解决这个问题。 THX

1 个答案:

答案 0 :(得分:1)

默认的Android相机应用程序仅在传回返回的Intent中的缩略图时才返回非空的intent。如果您传递带有要写入的URI的EXTRA_OUTPUT,它将返回一个空意图,并且图片位于您传入的URI中。

因此,如果您根据自己的意图传递EXTRA_OUTPUT位置,它将始终使用数据重新调整null,即在您的情况下,现在照片/捕获的图像位于photoURI路径。

因此,不要在onActivityResult()中查看数据意图,而是从photoURI路径中获取它。如下所示。这里的照片文件是保存实际相机图像的文件EXTRA_OUTPUT位置

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == REQUEST_TAKE_PHOTO) {

        Uri uri = Uri.fromFile(photoFile);  // Here photo file is the file EXTRA_OUTPUT location where you saved the actual camera image
        Bitmap bitmap;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            bitmap = crupAndScale(bitmap, 300); // if you mind scaling
            pofileImageView.setImageBitmap(bitmap);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        imageView.setImageBitmap(bitmap);
    }

}

如果您想剪裁和缩放此图片,可能就像您提到缩略图一样。

public static  Bitmap crupAndScale (Bitmap source,int scale){
    int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth();
    int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth();
    int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2;
    int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2;
    source = Bitmap.createBitmap(source, x, y, factor, factor);
    source = Bitmap.createScaledBitmap(source, scale, scale, false);
    return source;
}