6

我向用户展示了一个选择器,让用户在图库或相机之间进行选择以选择照片。如果我选择相机,那么一旦相机加载完毕,我会旋转拍摄一张风景照片,拍摄照片并单击完成,它会返回到我的应用程序,但返回的图像为空。如果我不旋转相机,图像会很好地返回。我错过了什么?我知道轮换会导致 Activity 被重建,但为什么 onActivityResult 不包含正确的信息?这是我的 openImage 意图:

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);
            }
        }
    }
4

3 回答 3

3

只需保存outputFileUri onSaveInstanceState并将 其恢复到onRestoreInstanceState否则它将在方向更改时为空。

于 2013-06-06T09:14:56.713 回答
2

你必须改变你的清单文件

在您的清单中只需替换以下代码

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

用你的代码

<activity android:name=".CameraTestActivity"
          android:label="@string/app_name">
于 2013-06-06T09:12:30.420 回答
1

这对我很有效..

<activity
    android:name=".CameraTestActivity"
    android:configChanges="orientation|screenSize|keyboardHidden">
</activity>
于 2015-11-27T09:46:44.423 回答