2014-01-13 4 views
1

Я пытаюсь добавить определенные данные в намерение, прежде чем использовать StartActivityForResult.Извлечение значений putExtra из onActivityResult-цели

Когда намерение возвращается в OnActivityForResult, я хотел бы получить доступ к данным, которые я добавил в намерении. Таким образом, я могу сопоставить данные, полученные в намерении, с такими вещами, как записи в базе данных, идентификаторы контейнеров и т. Д.

К сожалению, намерение, которое возвращается, похоже, не та, что я начал. Я попытался сравнить (==) старое и новое намерение в тестовом примере, и результат не удался, и неудивительно, что данные, которые я пытаюсь добавить, отсутствуют. Есть ли связь с первоначальным намерением?

Основная идея о том, что я пробовал:

Код для 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://stackoverflow.com/a/2141166/2150044 Я нахожусь на мобильном устройстве atm, но если вам все еще нужна помощь через час, я отправлю свой ответ – NitroNbg

+0

Начатая деятельность позволяет пользователь выбирает изображение (с телефона, picasa, google и т. д.). Когда намерение возвращается, я хотел бы связать намерение с переменными, такими как rowID в sqlite, идентификаторы контейнера/фрейма и т. Д. Я полагаю, что могу полагаться на намерения, которые запускаются и возвращаются последовательно, и просто сбрасывать данные в глобальная переменная ... Я не был уверен, что последнее предположение, о последовательном запуске и возврате, будет продолжаться. – NameSpace

ответ

5

Когда вы запускаете активность, используя неявную Intent это то, что вы делаете, когда вы это делаете:

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

у вас нет гарантий, что на самом деле будет выбрано действие для выполнения действия. Из-за этого не существует «контракта» между вашей Деятельностью и Деятельностью, которая будет использоваться для выполнения желаемого действия. Это, к сожалению, одно из недостатков использования неявного разрешения Intent. Поскольку между двумя действиями нет контракта, вы не можете быть уверены, что получите в результате, который возвращается вам в onActivityResult().

Если вы посмотрите на documentation for ACTION_PICK, то, по крайней мере указывает на то, что «должно» произойти (если выбранная активность на самом деле ведет себя так, как документация читает):

Вход: GetData() является URI, содержащий каталог данных (vnd.android.cursor.dir/*), из которого можно выбрать элемент.

Выход: URI элемента, который был выбран.

Это указывает на то, что вы должны предоставить URI, который содержит каталог данных, и вы будете возвращены в Intent содержащий URI элемента, который был выбран. Вот и все. Это все, что вы можете ожидать. Вы можете добавить в Intent много других «дополнительных», которые вы передаете Деянию с ACTION_PICK, но это действие не заботится об этих дополнительных функциях и просто игнорирует их. Операция, которая выполняет команду ACTION_PICK, будет создать новый Intent, содержащий URI выбранного элемента и передать его обратно. Он не передает ваш оригинал Intent назад. «Вход Intent» и «выход Intent» совершенно разные и не имеют ничего общего друг с другом.

Чтобы решить проблему, я предлагаю вам создать уникальное целое requestCode и сохранить «дополнительные услуги» в таблице или карту в вашем Activity, связанный с этим requestCode. Затем вы можете запустить операцию ACTION_PICK, используя requestCodeonActivityResult() вы можете использовать аргумент requestCode, который возвращается, чтобы найти ваши «дополнительные», которые вы сохранили, и вы сможете связать возвращаемый URI с ними.

ПРИМЕЧАНИЕ: Еще одна вещь: Когда вы позвоните startActivityForResult(), ваша деятельность будет приостановлена, и запущенная активность будет запущена. Ваша деятельность не будет возобновлена ​​до тех пор, пока не вызывается onActivityResult(). Это означает, что вы только сможете иметь один ACTION_PICK в ожидании в любой момент времени. По этой причине вам может не понадобиться способ связать конкретное действие PICK с любыми данными.

Смежные вопросы