数据null onActivityResult

时间:2019-05-06 18:12:51

标签: java android

活动结果为NullPointerException,我做错了或遗漏了什么?

照片库应用程序(最终),按照android开发者网站上的说明使用内置相机拍照。 onActivityResult提供空指针。我是android新手,所以无法弄清楚。 因此,它崩溃了,我希望它在活动中显示一个位图。

public class aCamera extends AppCompatActivity {

    static  final  int REQUEST_IMAGE_CAPTURE = 1;
    static final int REQUEST_TAKE_PHOTO = 1;
    ImageView imageView;
    String currentPhotoPath;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a_camera);
        dispatchTakePictureIntent();

    }

    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {

            File photoFile = null;
            try {
                photoFile = createImageFile();
                Log.i("DTPI-1", "dispatchTakePictureIntent: The IF AND TRY");
            } catch (IOException ex) {
                Log.i("DTPI-3" , "dispatchTakePictureIntent: catch");
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Log.i("photoURI", "dispatchTakePictureIntent: PHOTO FILE NOT EMPTY");
                Uri photoURI = FileProvider.getUriForFile(this,
                    "com.example.android.fileprovider",
                    photoFile);
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
                //setResult(RESULT_OK, takePictureIntent);
            }
        }
    }

    private File createImageFile() throws IOException {
        // Create an image file name
        Log.i("CIF -1", "createImageFile: Create FILE");
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",   /* suffix */
            storageDir      /* directory */
    );

        // Save a file: path for use with ACTION_VIEW intents
        currentPhotoPath = image.getAbsolutePath();
        return image;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.i("Result", "onActivityResult: WE GET HERE");
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            imageView = findViewById(R.id.imageView);
            imageView.setImageBitmap(imageBitmap);
        }
}

错误日志。

2019-05-06 20:01:33.555 23363-23363/com.example.camera E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.camera, PID: 23363
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=null} to activity {com.example.camera/com.example.camera.aCamera}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4339)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4382)
    at android.app.ActivityThread.-wrap19(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1654)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:251)
    at android.app.ActivityThread.main(ActivityThread.java:6572)
    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 'android.os.Bundle android.content.Intent.getExtras()' on a null object reference
    at com.example.camera.aCamera.onActivityResult(aCamera.java:81)
    at android.app.Activity.dispatchActivityResult(Activity.java:7235)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:4335)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:4382) 
    at android.app.ActivityThread.-wrap19(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1654) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:251) 
    at android.app.ActivityThread.main(ActivityThread.java:6572) 
    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) 

3 个答案:

答案 0 :(得分:2)

相机将图像保存到photoUri中提供的Intent中。在onActivityResult中,您必须从该文件中获取Bitmap

答案 1 :(得分:0)

putExtra行是问题所在。删除该行并在其中接收bitmap onActivityResult,如下所述。

 @Override
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) {
        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        image.setImageBitmap(bitmap);
    }
}

希望这行得通。您会在类似问题的帖子上看到解释here

答案 2 :(得分:0)

正如@aalap patel所提到的,问题不在于onActivityResult,而是在dispatchTakePictureIntent方法中只有一行。 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,photoURI); 他还提到了这段代码。