当屏幕方向改变时,相机活动导致uri变为null

时间:2012-02-09 16:04:09

标签: android android-intent android-camera

我设置了一个数据成员imageUri,并将其传递给启动相机活动的intent。在相机活动中,我拍照并旋转屏幕,然后单击复选框返回我的活动。当我这样做时,调用onActivityResult时imageUri为null。如果我不旋转屏幕,一切正常,imageUri不为空。

onConfigurationChanged未在我的活动中调用,因此不是问题。

public void takePhoto() {
    //define the file-name to save photo taken by Camera activity
    fileName = getFileNameDate();
    //create parameters for Intent with filename
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.TITLE, fileName);
    values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera");

    imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

    //create new Intent
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
    startActivityForResult(intent, picture_result_code);

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.i("Camera_onActivityResult", "Got activity result requestCode = " + requestCode + " resultCode: " + resultCode);
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
    case picture_result_code:
        if (resultCode == Activity.RESULT_OK) {
            try {
                Log.i("Camera", "Preparing to upload image...");

                picFile = convertImageUriToFile(imageUri);  // Here imageUri is null and causing crash

                uploadFile(picFile.getPath());

            } catch (Exception e) {
                Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show();
                Log.e("Camera", e.toString());
                e.printStackTrace();
            }
        }
    }
}

我还有其他方法可以检索图像吗?

由于

3 个答案:

答案 0 :(得分:2)

我相信imageUri是你活动中的一个领域,对吧?如果您旋转设备,活动将被销毁并重新启动,并且您的字段为空。您必须将URI保存为活动状态的一部分。有几种可能的方法可以实现,使用onSaveInstanceState(),请参阅此处了解更多详细信息:http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29

答案 1 :(得分:0)

锁定调用Activity的屏幕方向为我解决了问题。 如果您不想锁定自己,可以创建一个具有锁定方向的活动,仅用于调用相机,然后将结果返回到“真实”活动。

要锁定屏幕方向,请将其放入清单中的活动定义(两行):

android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize"

“肖像”也可以是“风景”

答案 2 :(得分:0)

Istvan Jonyer。非常感谢。我的问题解决了。 当我在手机银河J510 J5 2016中关闭自动旋转设置并横向旋转相机时,出现错误。 但是你帮我 我添加此代码:android:configChanges =“ keyboardHidden | orientation | screenSize” 清单文件以标记我启动相机的活动。