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

Posted

技术标签:

【中文标题】屏幕方向更改时导致 uri 变为 null 的相机活动【英文标题】:Camera activity causing uri to go to null when screen orientation changes 【发布时间】:2012-03-02 03:06:33 【问题描述】:

我设置了一个数据成员 imageUri,并将其传递到启动相机活动的意图中。在相机活动中,我拍照并旋转屏幕,然后单击复选框返回我的活动。当我这样做时,调用 onActivityResult 时 imageUri 为空。如果我不旋转屏幕,一切正常,并且 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();
            
        
    

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

谢谢

【问题讨论】:

看看这个答案:***.com/a/8248392/392781 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

伊斯特万·乔尼尔。非常感谢。我的问题解决了。 当我在我的手机 Galaxy j510 j5 2016 中关闭自动旋转设置并在横向中旋转相机时出现错误。 但你帮助我。 我添加此代码: android:configChanges="keyboardHidden|orientation|screenSize" 清单文件以标记我启动相机的活动。

【讨论】:

由于这不是对原始问题的实际答案,请将其作为新问题发布。

以上是关于屏幕方向更改时导致 uri 变为 null 的相机活动的主要内容,如果未能解决你的问题,请参考以下文章

Android:在方向更改时保留相机预览,而其他视图可以旋转

从片段中的相机意图返回后屏幕变为白色

显示从相机拍摄的图像时,Uri 为空

如何实现 Android 相机以任何屏幕方向拍照?

方向改变时相机出现问题

Windows Phone开发:处理屏幕方向的改变