setResult(Activity.RESULT_OK, returnIntent) из дочерней активности всегда возвращает мне Activity.CANCELED в основную активность

Я хочу вернуть некоторые данные из моего дочернего действия ActivityChild в мое основное действие ActivityMain

Сначала я вызываю свой ActivityChild из моего ActivityMain таким образом:

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
startActivityForResult(intent, 1)
// Actually, this code first launch chrome, then when the user identify on
// chrome, the redirect_uri calls the ActivityChild

затем я возвращаю свои данные из ActivityChild в ActivityMain следующим образом:

val data: Uri? = intent.data
val returnedIntent = Intent();
returnedIntent.putExtra("code", data!!.getQueryParameter("code"))
setResult(Activity.RESULT_OK, returnedIntent)
finish()

и, наконец, я перехватываю данные с переопределением onActivityResult в ActivityMain:

public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == 1) {
        if (resultCode == Activity.RESULT_OK) {
            val returnedValue = data!!.getStringExtra("data")
        }
        else if (resultCode == Activity.RESULT_CANCELED)
            Log.d("mDebug", "Couldn't retrieve data") // Always enters here
        else
            Log.d("mDebug", "final")
    }
}

Это продолжается в состоянии Activity.RESULT_CANCELED. Я не могу решить это, если это разрешимо.

Я считаю, что причина в том, что я сначала запускаю хром через намерение, и что каким-то образом данные не могут быть переданы в файл ActivityMain. Я далек от того, чтобы знать все, что касается намерений, и я, вероятно, что-то здесь упускаю, поэтому, если кто-то может мне помочь и объяснить это, пожалуйста!


person HartWoom    schedule 06.03.2019    source источник
comment
Вы изменили режим запуска ActivityChild?   -  person Jeffrey Blattman    schedule 07.03.2019
comment
Как изменить режим запуска?   -  person HartWoom    schedule 07.03.2019


Ответы (2)


Вы можете добавить этот флаг FLAG_ACTIVITY_FORWARD_RESULT в свой returnedIntent. Это описано здесь https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_FORWARD_RESULT

Если установлено и это намерение используется для запуска нового действия из существующего, то цель ответа существующего действия будет перенесена в новое действие. Таким образом, новое действие может вызвать Activity.setResult(int) и отправить этот результат обратно в цель ответа исходного действия.

person Bach Vu    schedule 07.03.2019
comment
Я добавил returnIntent.flags = Intent.FLAG_ACTIVITY_FORWARD_RESULT в свою дочернюю активность, но, к сожалению, это не работает - person HartWoom; 07.03.2019
comment
Почему детская активность? Вы должны указать это в намерении, когда startActivityForResult - person Bach Vu; 07.03.2019
comment
Потому что это приводит к сбою приложения - person HartWoom; 07.03.2019
comment
Что такое журнал сбоев? - person Bach Vu; 07.03.2019
comment
FORWARD_RESULT_FLAG используется при запросе результата. Я просто хочу уточнить, как называются мои действия: ActivityMain запускает Google Chrome через намерение. Когда пользователь входит в систему, перенаправление вызывает метод ActivityChild. Из ActivityChild я хочу отправить данные в ActivityMain. Надеюсь, это поможет - person HartWoom; 07.03.2019

Итак, спасибо @Bach Vu и этому сообщению: Intent.FLAG_ACTIVITY_FORWARD_RESULT и PendingIntent Мне удается получить то, что я хотел, используя общие настройки. Я храню свои данные в общих настройках в ActivityChild и получаю их в своем ActivityMain, используя переопределение onActivityResult.

person HartWoom    schedule 07.03.2019