Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从相机中拾取图像时无法传递结果,但从库中拾取图像时没有问题_Android_Android Intent_Camera_Onactivityresult_Android Intent Chooser - Fatal编程技术网

Android 从相机中拾取图像时无法传递结果,但从库中拾取图像时没有问题

Android 从相机中拾取图像时无法传递结果,但从库中拾取图像时没有问题,android,android-intent,camera,onactivityresult,android-intent-chooser,Android,Android Intent,Camera,Onactivityresult,Android Intent Chooser,我正在开发一个应用程序,其中有一个按钮,用于从画廊中拾取图像或从相机捕获图像。当我从gallery中选取图像时,没有错误,图像最终显示良好,但当我从相机应用程序中捕获图像时崩溃 错误如下: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=66, result=-1, data=null} to activity {com.byteshaft.prospectform/com.

我正在开发一个应用程序,其中有一个按钮,用于从画廊中拾取图像或从相机捕获图像。当我从gallery中选取图像时,没有错误,图像最终显示良好,但当我从相机应用程序中捕获图像时崩溃

错误如下:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=66, result=-1, data=null} to activity 

{com.byteshaft.prospectform/com.byteshaft.prospectform.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
                                                                              at android.app.ActivityThread.deliverResults(ActivityThread.java:4297)
                                                                              at android.app.ActivityThread.handleSendResult(ActivityThread.java:4347)
                                                                              at android.app.ActivityThread.-wrap20(ActivityThread.java)
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1557)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                              at android.os.Looper.loop(Looper.java:173)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6459)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:938)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)
                                                                           Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference
                                                                              at com.byteshaft.prospectform.MainActivity.onActivityResult(MainActivity.java:400)
                                                                              at android.app.Activity.dispatchActivityResult(Activity.java:6926)
                                                                              at android.app.ActivityThread.deliverResults(ActivityThread.java:4293)
                                                                              at android.app.ActivityThread.handleSendResult(ActivityThread.java:4347) 
                                                                              at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                                                                              at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1557) 
                                                                              at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                              at android.os.Looper.loop(Looper.java:173) 
                                                                              at android.app.ActivityThread.main(ActivityThread.java:6459) 
                                                                              at java.lang.reflect.Method.invoke(Native Method) 
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:938) 
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828) 
从画廊/照相机中拾取图像的我的代码:

public void openImageIntent() {

        File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String fname = "Prospect-form" + timeStamp;

        final File sdImageMainDirectory = new File(storageDir, fname);
        outputFileUri = Uri.fromFile(sdImageMainDirectory);

        // Camera.
        final List<Intent> cameraIntents = new ArrayList<>();
        final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        final PackageManager packageManager = getPackageManager();
        final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
        for(ResolveInfo res : listCam) {
            final String packageName = res.activityInfo.packageName;
            final Intent intent = new Intent(captureIntent);
            intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
            intent.setPackage(packageName);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            cameraIntents.add(intent);
        }


        //Gallery.
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

        // Filesystem.
        final Intent fsIntent = new Intent();
        fsIntent.setType("*/*");
        fsIntent.setAction(Intent.ACTION_GET_CONTENT);
        cameraIntents.add(fsIntent);



        //Create the Chooser
        final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));

        startActivityForResult(chooserIntent, 66);
    }
关于stackoverflow有一些非常有用的答案,但我无法解决我的问题。只有当我从相机中选择“捕获图像”时才会出现错误,否则,当我从“多媒体资料”中选择“图像”时,根本没有错误


有什么建议吗?

这是因为从相机和多媒体资料中拾取图像不会返回相同的结果。您必须通过查看意图来检查用户选择了哪一个。您可以这样做:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == mRequestCode) {
            if (resultCode == Activity.RESULT_OK) {
                boolean isCamera = true;
                if (data != null && data.getData() != null) {
                    String action = data.getAction();
                    isCamera = MediaStore.ACTION_IMAGE_CAPTURE.equals(action);
                }

                try {
                    Uri uriFileSrc = isCamera ? mOutputFileUri : data.getData();

                    //Do what do you need with the Uri

                } catch (Exception ex) {
                    Toast.makeText(mActivity, R.string.error_creating_file, Toast.LENGTH_SHORT).show();
                }
            } 
        }
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == mRequestCode) {
            if (resultCode == Activity.RESULT_OK) {
                boolean isCamera = true;
                if (data != null && data.getData() != null) {
                    String action = data.getAction();
                    isCamera = MediaStore.ACTION_IMAGE_CAPTURE.equals(action);
                }

                try {
                    Uri uriFileSrc = isCamera ? mOutputFileUri : data.getData();

                    //Do what do you need with the Uri

                } catch (Exception ex) {
                    Toast.makeText(mActivity, R.string.error_creating_file, Toast.LENGTH_SHORT).show();
                }
            } 
        }
}