如果旋转相机,来自相机的图像为空

时间:2013-06-06 09:08:26

标签: android android-intent android-activity android-camera

我正在向用户显示一个选择器,用于在图库或相机之间进行选择以选择照片。如果我选择相机,那么一旦相机加载我旋转拍摄风景照片,拍照并点击完成,它返回我的应用程序但返回的图像为空。 如果我不旋转相机,图像将返回正常。 我错过了什么? 我知道旋转导致重建Activity,但为什么onActivityResult不包含正确的信息? 这是我的openImage Intent:

public void openImageIntent() {

        // Determine Uri of camera image to save.
        final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyAppImages"
                + File.separator);
        root.mkdirs();
        SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy-hhmmss");
        final String fname = String.format("%s.jpg", sdf.format(new Date()));
        final File sdImageMainDirectory = new File(root, fname);
        outputFileUri = Uri.fromFile(sdImageMainDirectory);

        // Camera.
        final List<Intent> cameraIntents = new ArrayList<Intent>();
        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);
        }

        // Filesystem.
        final Intent galleryIntent = new Intent();
        galleryIntent.setType("image/*");
        galleryIntent.setAction(Intent.ACTION_GET_CONTENT);

        // Chooser of filesystem options.
        final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");

        // Add the camera options.
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[] {}));

        startActivityForResult(chooserIntent, SELECT_PICTURE_REQUEST);
    }

onActivityResult方法:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE_REQUEST) {
                final boolean isCamera;
                if (data == null) {
                    isCamera = true;
                } else {
                    final String action = data.getAction();
                    if (action == null) {
                        isCamera = false;
                    } else {
                        isCamera = true;
                    }
                }

                Uri selectedImageUri;
                if (isCamera) {
                    selectedImageUri = outputFileUri;
                } else {
                    selectedImageUri = data == null ? null : data.getData();
                }

                if (imageDelegate != null) {
                    Log.e(TAG, "imageDelegate not null: " + imageDelegate);
                    imageDelegate.gotNewImageUri(selectedImageUri);
                    imageDelegate = null;

                } else if (getSupportFragmentManager().findFragmentByTag("addofferdialog") != null) {
                    imageDelegate = (AddOfferFragment) getSupportFragmentManager().findFragmentByTag("addofferdialog");
                    Log.e(TAG, "imageDelegate is null but found fragment: " + imageDelegate);
                    Log.e(TAG, "Activity image: " + selectedImageUri);
                    imageDelegate.gotNewImageUri(selectedImageUri);
                    imageDelegate = null;
                } else {
                    Log.e(TAG, "cannot find imageDelegate!!!!");
                }

             Log.e(TAG, "selectedImageUri: " + selectedImageUri);
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

只需在onSaveInstanceState中保存outputFileUri,然后在onRestoreInstanceState中将其恢复,否则在方向更改时将为空。

答案 1 :(得分:2)

您必须更改清单文件

您的清单中的

只需替换下面的代码

<activity android:name=".CameraTestActivity"
              android:label="@string/app_name"     android:configChanges="keyboardHidden|orientation">

使用您的代码

<activity android:name=".CameraTestActivity"
          android:label="@string/app_name">

答案 2 :(得分:1)

这对我很有用..

<activity
    android:name=".CameraTestActivity"
    android:configChanges="orientation|screenSize|keyboardHidden">
</activity>