照片拍摄后的Android活动重置(方向?)

时间:2012-06-07 12:33:06

标签: android android-activity camera orientation reset

基本上,我按一个按钮,这会通过使用相机意图打开您的默认相机应用程序。拍摄照片后,它会保存所需的内容并重定向到另一个活动。

在本次活动中,我有一个可以成功上传图片的AsyncTask。那么你可能会问我的问题是什么。我的问题是它重新创建了我的活动,因此重置了我的ProgressDialog。 (它运行活动,aSyncTask是否会在它完成之前消失并重新创建我的Activity以再次执行asynctask。)

并不总是如此。我认为这样做是因为它改变了手机的方向,从风景到肖像。 (我有一个三星。当我去相机时,它会改变为风景,当我完成它时,它会回到肖像。)

我已完成作业并将这些内容添加到我的清单中:

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

我确保以纵向方式“锁定”我的应用,但我仍然看到我的应用更改了方向,我相信这就是我的活动重新创建的原因。

我计划添加各种检查,但我认为这不是处理这种情况的正确方法,因为它有时不会重新创建活动。

我所说的支票是使用:

protected void onSaveInstanceState(Bundle outState) {
    outState.putString("started", "1");
}

无论如何,有人可以帮帮我吗?我只是想让它加载活动而不会让我自我毁灭。

PS:VM没有任何问题。 VM加载活动并完成它而不重新创建它。

PPS:在我的三星上进行了额外的测试,如果我将它保持在横向模式下它会起作用。因此,相机正在摧毁我的活动,因为它会改变方向。

3 个答案:

答案 0 :(得分:9)

我有同样的问题,结果你还需要监听API等级13或更高的屏幕尺寸变化,如此处所述; https://stackoverflow.com/a/11483806

android:configChanges="orientation|screenSize"

答案 1 :(得分:1)

为了解决这个问题,我必须在清单文件中使用以下内容:

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

答案 2 :(得分:0)

尝试创建片段活动以处理显示和更新进度对话框

在片段活动中确保并设置“setRetainInstance(true);”这将确保在创建/销毁主活动时不会销毁它。

将整个图像捕获过程放在此片段中可能是个好主意,包括asynctask。确保不从AsyncTask中的doInBackground()中引用父活动的上下文。如果你这样做并且方向改变(即活动被破坏),它将引发错误。

这是一个粗略的例子:

public class MyFragment extends FragmentActivity {

    private ProgressBar mProgressBar;
    private boolean mAsyncTaskActive = false;


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);

        // grab reference to progress bar
        mProgressBar = (ProgressBar) getActivity().findViewById(R.id.my_progress_bar);


        // check to see if the async task is active and set the progress bar visibility accordingly
        if (mAsyncTaskActive) {
            mProgressBar.setVisibility(View.VISIBLE);
            mProgressBarText.setVisibility(View.VISIBLE);
        }


    }

    // this method is called from your main activity when the user does something (i.e. clicks a button)
    // make sure you have already instantiated the fragment

    public void startSomething() {
        if (mAsyncTaskActive == false) {
            mProgressBar.setVisibility(View.VISIBLE);
            new MyAsyncTask().execute();
            mAsyncTaskActive = true;
        }
    }

    private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        Context applicationContext;



        @Override
        protected Void doInBackground(String... params) {
            // do stuff
            publishProgress(//some number);
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
        }



}

如果您还不熟悉,还应该看一下如何实现片段。 Android开发博客在DialogFragments上有一个很好的帖子,同样的原则。 http://android-developers.blogspot.com/2012/05/using-dialogfragments.html