如何在android中通过摄像头传递单独的参数

如何在android中通过摄像头传递单独的参数,android,android-intent,camera,arguments,bundle,Android,Android Intent,Camera,Arguments,Bundle,我正在创建一个动态表单活动,我得到了如何从db生成表单的说明。活动本质上只是滚动问题列表,查看问题类型并添加它们。因此,这是一项将视图添加为问题的活动。这一切本身都很好。我试图将回答/问题保留在特定的问题类中,这些问题类只是基本问题的子类 我遇到的问题是,当我尝试添加相机“问题”以提示用户拍照时,我无法在视图中获得结果。我在视图中管理了启动活动,它将结果返回给问卷活动。活动不知道要将其添加到哪个问题,因为它都是动态完成的。所以我试着在相机意图中把questionId作为一个额外信息传递给大家,并

我正在创建一个动态表单活动,我得到了如何从db生成表单的说明。活动本质上只是滚动问题列表,查看问题类型并添加它们。因此,这是一项将视图添加为问题的活动。这一切本身都很好。我试图将回答/问题保留在特定的问题类中,这些问题类只是基本问题的子类

我遇到的问题是,当我尝试添加相机“问题”以提示用户拍照时,我无法在视图中获得结果。我在视图中管理了启动活动,它将结果返回给问卷活动。活动不知道要将其添加到哪个问题,因为它都是动态完成的。所以我试着在相机意图中把questionId作为一个额外信息传递给大家,并在问卷活动中接收它,然后滚动它添加的问题,如果是同一个问题,它会将图片添加到它关联的问题中

它添加问题的方式是使用一个视图组,该视图组仅为每个问题插入一个零件

这是启动相机的相关部分(我也尝试过不捆绑使用它)这是BaseQuestion的一个子类,它只是linearlayout的一个子类

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            Bundle bundle = new Bundle();
            bundle.putInt("questionId", getQuestionId());
            intent.putExtras(bundle);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
                    Environment.getExternalStorageDirectory(), "image.tmp")));
            ((Activity)getContext()).startActivityForResult(intent, TAKE_PHOTO);
这是处理活动中的结果的相关部分

protected void onActivityResult(int requestCode, int resultCode,
        Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    Bitmap image = null;
    switch (requestCode) 
    {
        case TAKE_PHOTO: 
        {
            if (resultCode == RESULT_OK) 
            {
                InputStream inputStream = null;
                File file = new File(Environment.getExternalStorageDirectory(),
                        "image.tmp");
                try {
                    inputStream = new FileInputStream(file);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                if (inputStream == null) {
                    Uri uri = imageReturnedIntent.getData();
                    try {
                        inputStream = getContentResolver().openInputStream(uri);
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                image = createScaledBitmapFromStream(inputStream, 200, 300);
                Bundle bundle = imageReturnedIntent.getExtras();
                if (bundle != null)
                {
                    int questionId = bundle.getInt("questionId");
                    for (BaseQuestion questionView : questionViews)
                    {
                        if (questionId == questionView.getQuestionId())
                        {
                            questionView.setResponse(image);
                        }
                    }
                }
            } 
            else if (resultCode == Activity.RESULT_CANCELED) 
            {
                Log.d("something", "something");
            }
            break;
        }
    }
}
编辑:已解决,答案可能不清楚


我在设置为-1的超类中生成了questionIdForResult。然后在运行startActivityForResult时将其设置为questionId,然后在onActivityResult中,检查每个问题的questionIdForResult是否与questionId匹配,如果匹配,则使用该问题。然后我将其设置回-1,以确保如果您有两个,它不会转到另一个。

您的方法将不起作用,因为不需要任何摄像头应用程序将额外内容从传入的
Intent
神奇地复制到结果
Intent
。事实上,如果有任何相机活动会这样做,我会相当惊讶


您可以将
questionId()
存储在活动的数据成员中(例如,
questionIdForTheNextActivityResult
),然后在
onActivityResult()中使用该值。但是请记住,使用第三方应用程序拍照意味着在您再次获得控制权之前,您的过程可能会终止,因此请确保通过
onSaveInstanceState()
保存该数据成员,并通过
onRestoreInstanceState()
恢复该数据成员。您的方法将不起作用,因为不需要任何摄像头应用程序将传入的
Intent
中的额外内容神奇地复制到结果
Intent
。事实上,如果有任何相机活动会这样做,我会相当惊讶


您可以将
questionId()
存储在活动的数据成员中(例如,
questionIdForTheNextActivityResult
),然后在
onActivityResult()中使用该值。不过,请记住,使用第三方应用程序拍照意味着在您再次获得控制权之前,您的过程可能会终止,因此请确保通过
onSaveInstanceState()
保存该数据成员,并通过
onRestoreInstanceState()

将其还原?听起来像是建议将变量作为全局值存储在活动中。我仍然有在事先不知道id的情况下将其传递回活动的问题。当我从摄像机返回时,我如何将其传递回?@Gentatsu:“我仍然有在事先不知道id的情况下将其传递回活动的问题”--如果你有足够的“id知识”要将它放在与
startActivity()
一起使用的
Intent
中,您有足够的“id知识”,只需在数据成员的活动中保留它即可。创建它时,它知道每个问题的所有id,但不知道其中发生了什么。该活动只是作为一个容器。现在是CameraQuestionView->CameraActivity->QuestionNaiResponsibility。如果它能回到摄像机视图,我会接受的。该活动包含所有ID,它无法区分要将信息添加到哪个ID,我只需要一种方法告诉它需要转到哪个ID。如果我听起来很粗鲁,我很抱歉,但是如果我想把我想说的话连贯地表达出来,那是非常令人沮丧的。我发现你可以将信息添加到物理文件本身,比如图像的描述,但如果可能的话,我想避免这样做。我还希望避免将其作为SP,或应用程序中全球可用的任何其他内容。我正在寻找一个好的方法,而不仅仅是一个快速而肮脏的修复方法。@Gentatsu:“活动只是充当一个容器”——然后您需要为容器提供更多的智能,或者使用一个更智能的容器(例如,一个片段,而不是自定义视图)。“它无法区分将信息添加到哪一个”——你表现得好像你有选择权。你没有。无论是活动还是片段,onActivityResult()的实现者都需要拥有处理该响应所需的一切。首先是
onActivityResult()
的实现者负责
startActivityForResult()
调用。我如何传递它?听起来像是建议将变量作为全局值存储在活动中。我仍然有在事先不知道id的情况下将其传递回活动的问题。当我从摄像机返回时,我如何将其传递回?@Gentatsu:“我仍然有在事先不知道id的情况下将其传递回活动的问题”--如果你有足够的“id知识”将其放在与
startActivity()一起使用的
Intent
的额外部分<