从onActivityResult intent检索putExtra值

问题描述:

我试图在使用StartActivityForResult之前将某些数据追加到intent中。从onActivityResult intent检索putExtra值

当意图在OnActivityForResult中返回时,我想访问我在意图中追加的数据。因此,我可以将意图中检索到的数据与数据库条目,容器ID等内容相关联。

不幸的是,返回的意图似乎与我开始的意图不一样。我试着在测试用例中比较(==)旧的和新的意图,并且结果失败,并且不奇怪,那么我尝试追加的数据就不存在了。是否有任何链接回到原始意图?

什么,我已经试过基本思想:

守则StartActivityForResult在伪代码:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI) 
i.putExtra([-Key-], [int]); 
i.putExtra([-Key-], [int]); 
.... 
getParentFragment().startActivityForResult(i, requestCode); 

的伪码OnActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent intent) { 

....   

    switch(requestcode){ 

    case RESULT_LOAD_IMAGE : 

    //These always evaluate to default. The intent returns with the picture, 
    //and I process it fine (with default values), but any extra data i try to append 
    //to the intent is lost. 

    int rowId = intent.getIntExtra([-Key-], [-def_value-]); 

      .... 
      .... 

    break; 
    default: 
     throw new RuntimeException(); 
    } 
} 
+0

你能描述PLZ这段代码的目的是什么?你想要达到什么目标? –

+0

希望这个答案可以帮助你,http://*.com/a/2141166/2150044我在移动设备atm,但如果你仍然需要一个小时的帮助,我会发布我的回复 – NitroNbg

+0

活动开始让我们用户选择一个图像(从手机,Picasa,谷歌等)。 当意图返回时,我想将意图与变量相关联,如sqlite中的rowID,容器/框架ID等。 我想我可以依赖意图按顺序启动并返回,只需将数据转储一个全局变量......我不确定最后一个关于顺序开始和返回的假设是否会持续。 – NameSpace

当您使用隐式意图发起活动分辨率,这是你在做这件事时所要做的:

Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI) 
.... 
getParentFragment().startActivityForResult(i, requestCode); 

你没有任何保证,实际上会选择什么Activity来执行该操作。正因为如此,您的活动与将用于执行所需操作的活动之间没有任何“契约”。不幸的是,这是使用隐式Intent解析的缺点之一。由于这两项活动之间没有合同,因此您无法确定将在onActivityResult()中返回给您的结果中包含哪些内容。

如果你看看documentation for ACTION_PICK,它至少表明什么是“应该”发生(如果所选择的活动实际上表现的文件读取方式):

输入:的getData()是含有目录URI的数据 (vnd.android.cursor.dir/*)从中选择一个项目。

输出:选取的项目的URI。

这表示您应该提供一个包含数据目录的URI,并且您将返回一个包含所选项目URI的Intent。而已。这就是你所期待的。您可以在Intent中输入很多其他“额外”,您将其传递给活动ACTION_PICK,但该活动并不关心这些额外内容,而只是忽略它们。执行ACTION_PICK的活动将创建一个新的Intent,其中包含所选项目的URI并将其传回给您。它没有通过你原来的Intent回来。 “输入Intent”和“输出Intent”完全不同,彼此之间没有任何关系。

为了解决您的问题,我建议您创建一个唯一的整数requestCode并将您的“额外”保存在与requestCode相关的Activity中的表格或地图中。然后,您可以使用requestCode启动ACTION_PICK活动。在onActivityResult()中,您可以使用返回的requestCode参数来查找您保存的“额外”,并且您可以将返回的URI与它们关联起来。

注意:还有一件事:当您拨打startActivityForResult()时,您的活动将被暂停,并且启动的活动将会运行。在调用onActivityResult()之前,您的活动将不会恢复。这意味着您在任何时候都只能有一个ACTION_PICK挂起。出于这个原因,您可能不需要将特定PICK操作与任何给定数据相关联的方法。