Android上相机意图保持打开状态

3

我正在制作一款应用程序,当活动被创建时,我会运行相机意图。问题是,当我点击拍摄的图片后的“确定”按钮时,它只会再次打开相机来拍照。以下是代码:taken从另一个活动中设置为false。我可以确认,在此活动开始时,taken为false。

public class QuickEditActivity extends Activity {

    public static boolean taken;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.quickedit);

        if(!QuickEditActivity.taken) {
            RunCam();
        }

    }

    private void RunCam() {
        QuickEditActivity.taken = true;
        Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(camIntent,1);

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(data != null && data.getExtras() != null) {
            Bitmap bitmap = (Bitmap)data.getExtras().get("data");

            if(bitmap != null) {
            ImageView imgView = (ImageView)findViewById(R.id.CamView);

            imgView.setImageBitmap(bitmap);

            }
            else
            {

            this.finish();
            }

        }
        else {
            this.finish();
        }

        super.onActivityResult(requestCode, resultCode, data);
    }
}     

需要将taken设置为true,表示您已处理它吗?还是您在谈论其他事情?此外,请发布您的其他代码,您提到了另一个活动,它在做什么? - Jack
2个回答

4
我的心灵感应告诉我你有一部Nexus手机。此外,我的心灵感应还告诉我,当你通过camIntent启动相机捕获Activity时,你的进程会被杀死,然后在相机捕获Activity完成后重新启动。因此,你的静态变量taken被重置为false,导致你的onCreate方法总是认为这是它第一次启动,从而将你置于无限的相机捕获循环中。
你可以通过在onCreate方法中添加以下语句来验证这一点:
Log.d("QuickEditActivity", "Value of taken = " + (taken ? "true" : "false"));

您可以通过重写onSaveInstanceState()来解决此问题:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean("taken", true);
}

然后在传递给您的onCreate(Bundle)方法的Bundle中检查此值。

一定要让我知道我的心灵感应力量表现如何。


你的能力很接近。我有一个Droid,听说它和Nexus有类似的问题。我发现它总是被设置为false,所以这让我有了一些进展。我甚至将变量放在另一个类中,使其更全局化,但出于某种原因它仍然重置为false。我实现了onSaveInstanceState(),但它崩溃了,我无法弄清楚原因。当我尝试使用savedInstanceState.getboolean()时,它会崩溃。我可能需要手动嵌入相机。你还有其他建议吗,灵能者? - Cody
当程序崩溃时,堆栈是什么? - i_am_jorf
我解决了,但是当我的时间用完时,我将不得不发布答案。 - Cody
嗨,Cody,你解决了吗?我也有同样的问题,但迄今为止没有解决方案......我的心灵力量也没有帮助到我... - Tom Burger
他的解决方案已经作为一个单独的答案发布。 - i_am_jorf

-1
我通过另一种方式解决了这个问题,方法如下: 这个代码片段应该放在启动QuickEditActivity的类中。
    private void startQuickEditActivity() {

    RunCam();

}


private void RunCam() {
    Intent camIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(camIntent,1);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Intent i = new Intent(this, QuickEditActivity.class);
    i.putExtras(data);
    startActivity(i);

    super.onActivityResult(requestCode, resultCode, data);
}

这是QuickEdit中的代码:

public class QuickEditActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.quickedit);

    Intent data = this.getIntent();

    if(data != null && data.getExtras() != null) {
        Bitmap bitmap = (Bitmap)data.getExtras().get("data");


    if(bitmap != null) {
        ImageView imgView = (ImageView)findViewById(R.id.CamView);

        imgView.setImageBitmap(bitmap);



    }
    else
    {

        this.finish();
    }

    }
    else {
        this.finish();
    }

}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接