如何通过android中的Camera意图传递一个单独的参数

时间:2014-01-27 16:14:41

标签: android android-intent camera arguments bundle

我正在创建一个动态表单活动,并且我获得了如何从db创建表单的说明。活动基本上只是滚动问题列表并查看它们的类型并添加它们。所以这是一个将视图添加为问题的活动。这一切都很好。我试图将响应/问题保留在特定问题类中,这些类只是一个基本问题的子类。

我遇到的问题是当我尝试添加相机“问题”以提示用户拍照时,我无法在视图中获得结果。我在视图中管理了启动活动,并将结果返回到问卷调查活动。活动不知道将其添加到哪个问题,因为它都是动态完成的。因此,我尝试通过问题ID作为相机意图中的额外内容,并在问卷调查活动中接收它,然后滚动查看它添加的问题,如果它是相同的,它会将图片添加到与之关联的问题中。

它添加问题的方法是让一个视图组只插入每个部分的一个部分。

这是启动相机的相关部分(我也试过使用它而没有捆绑)。 这是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以确定你是否有两个,它不会转到另一个。

1 个答案:

答案 0 :(得分:5)

您的方法不起作用,因为不需要任何相机应用程序将附加内容从传入的Intent神奇地复制到结果Intent。事实上,如果有任何相机活动,我会感到很惊讶。

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