Android невозможно вернуться из сообщения электронной почты - PullRequest
1 голос
/ 16 июня 2020

Итак, в моем приложении у меня есть кнопка для открытия Gmail, чтобы пользователь мог проверить код подтверждения.

Я использую этот код для открытия Gmail:

val intent = Intent(Intent.ACTION_MAIN)
intent.addCategory(Intent.CATEGORY_APP_EMAIL)
try {
    activity?.startActivity(intent)
} catch (e: Exception) {
    activity?.let {
        AlertDialog.Builder(it)
            .setTitle("Email App Not Found")
            .show()
    }
}

Он работает Отлично запускать Gmail, однако мне нужно, чтобы кнопка "Назад" вернулась в мое приложение.

В настоящее время, когда я нажимаю кнопку «Назад» в Gmail, мое приложение сворачивается, а при повторном открытии приложения просто снова открывается Gmail без возможности вернуться в мое приложение без его полного закрытия и повторного открытия.

Есть ли способ переопределить кнопку «Назад», чтобы вернуться в мое приложение из Gmail?

Ответы [ 3 ]

0 голосов
/ 16 июня 2020

Я попробовал ваш код, и он работает на Emulator Pixel 2. Итак, есть несколько вещей, которые вы можете проверить.

Первый, который проверяет, есть ли у вас код, который вызывает что-то вроде finish(), который очищает эту активность из заднего стека, особенно в onPause() и onStop().

Второй для проверки, включаете ли вы Don't Keep activities в параметрах разработчика устройства. . Это уничтожит текущую активность перед переходом в Gmail, так что вы не сможете вернуться назад.

0 голосов
/ 30 июня 2020

У меня была точно такая же проблема, и я обнаружил различия между разными почтовыми приложениями. Когда я выбираю Samsung Mail в окне выбора, я не сталкиваюсь с этой проблемой и могу вернуться в свое приложение, нажав назад. Однако, когда я выбираю Gmail из средства выбора, я сталкиваюсь с той же проблемой, что и вы описываете.

Я пробовал почти все возможные решения, которые мог найти в StackOverflow, но это, казалось, был единственный рабочий ответ: { ссылка } Я отправлю код на случай, если ссылка умрет.

Java:

Intent emailIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("mailto:"));
PackageManager packageManager = getPackageManager();
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(emailIntent, 0);

if (resolveInfoList.size() > 0) {
    ResolveInfo resolveInfo = resolveInfoList.get(0);

    // First create an intent with only the package name of the first registered email app
    // and build a picked based on it
    Intent chooserIntent = Intent.createChooser(packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName), "");

    // Then create a list of LabeledIntent for the rest of the registered email apps
    List<LabeledIntent> intentList = new ArrayList<>();

    for (int i = 1; i < resolveInfoList.size(); i++) {
        // Extract the label and repackage it in a LabeledIntent
        resolveInfo = resolveInfoList.get(i);
        String packageName = resolveInfo.activityInfo.packageName;
        Intent intent = packageManager.getLaunchIntentForPackage(packageName);
        intentList.add(new LabeledIntent(intent, packageName, resolveInfo.loadLabel(packageManager), resolveInfo.icon));
    }

    LabeledIntent[] extraIntents = intentList.toArray(new LabeledIntent[0]);
            
    // Add the rest of the email apps to the picker selection
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, extraIntents);
    startActivity(chooserIntent);
}

Kotlin:

val emailIntent = Intent(Intent.ACTION_VIEW, Uri.parse("mailto:"))
val packageManager = context?.packageManager
val resolveInfoList = packageManager?.queryIntentActivities(emailIntent, 0)

if (!resolveInfoList.isNullOrEmpty()) {
    var resolveInfo = resolveInfoList[0]

    // First create an intent with only the package name of the first registered email app
    // and build a picked based on it
    val chooserIntent = Intent.createChooser(packageManager.getLaunchIntentForPackage(resolveInfo.activityInfo.packageName), "")

    // Then create a list of LabeledIntent for the rest of the registered email apps
    val intentList: MutableList<LabeledIntent> = ArrayList()

    for (i in 1 until resolveInfoList.size) {
         // Extract the label and repackage it in a LabeledIntent
         resolveInfo = resolveInfoList[i]
         val packageName = resolveInfo.activityInfo.packageName
         val intent = packageManager.getLaunchIntentForPackage(packageName)
         intentList.add(LabeledIntent(intent, packageName, resolveInfo.loadLabel(packageManager), resolveInfo.icon))
    }

    // Add the rest of the email apps to the picker selection
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toTypedArray())
    startActivity(chooserIntent)
}
0 голосов
/ 16 июня 2020

Итак, в моем приложении есть кнопка для открытия Gmail, чтобы пользователь мог проверить проверочный код

У вас неправильно сконструированный Intent для открытия почтового клиента. Документация особо указывает на то, что вы используете CATEGORY_APP_EMAIL неверно:

ПРИМЕЧАНИЕ. Не следует использовать его в качестве первичного ключа Intent, поскольку он не приведет к запуску приложения с правильным действием и категорией. Вместо этого используйте это с makeMainSelectorActivity(java.lang.String,java.lang.String), чтобы сгенерировать основное намерение с этой категорией в селекторе.

Если вы пытаетесь запустить то же действие, что и средство запуска, вам понадобится ACTION_MAIN / CATEGORY_LAUNCHER Intent с селектором Intent, который пытается ограничить выбор приложениями электронной почты.

Есть ли способ переопределить кнопку возврата, чтобы вернуться в мое приложение из Gmail ?

Обычно нет. Как приложение реагирует на системную кнопку НАЗАД, зависит от разработчиков этого приложения. Возможно, решение проблемы Intent улучшит это поведение как побочный эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...