Android: отправка почты / SMS / твита с Intent.ACTION_SEND / requestCode / resultCode?

Я использую следующий код:

Intent sendMailIntent = new Intent(Intent.ACTION_SEND); 
        sendMailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.Share_Mail_Subject));
        sendMailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.Share_Mail_Text)); 
        sendMailIntent.setType("text/plain");

startActivity(Intent.createChooser(sendMailIntent, "Email / SMS / Tweet ?"));

Тогда я хотел бы иметь возможность различать: 1. мой пользователь действительно отправил электронное письмо / SMS ... ИЛИ 2. мой пользователь фактически нажал КНОПКУ НАЗАД ... и ничего не отправил.

Есть ли способ изменить это к лучшему?

=> Следует ли запускать действие с помощью startActivityForResult? и поймать requestCode / resultCode с помощью onActivityResult ...

=> Какого царя resultCode мне следует ожидать? как правильно схватить? Куда мне поместить эти строки кода? Здесь будет очень полезен любой фрагмент кода.

заранее спасибо.

Центр


person Hubert    schedule 19.10.2009    source источник


Ответы (1)


Я понимаю, что прошло много времени с тех пор, как вы задали этот вопрос, и Android за это время сильно изменился. Я не уверен, что вы все еще ищете ответ, но если да, вы можете сделать это с помощью нового метода Intent.createChooser(), который принимает третий аргумент PendingIntent.getIntentSender() и BroadcastReceiver. Вот как это сделать:

Intent sendMailIntent = new Intent(Intent.ACTION_SEND); 
sendMailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.Share_Mail_Subject));
sendMailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.Share_Mail_Text)); 
sendMailIntent.setType("text/plain");

Intent receiver = new Intent(this, BroadcastTest.class);
receiver.putExtra("test", "test");

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT);
Intent chooser = Intent.createChooser(intent, "test", pendingIntent.getIntentSender());
startActivity(chooser);

Обратите внимание, что целью моего receiver намерения был класс BroadcastTest, который расширяет BroadcastReceiver. Когда пользователь выбирает приложение из средства выбора, будет вызван метод onReceive в BroadcastTest, и если пользователь нажмет обратно, onReceive не будет вызываться. Таким образом, вы можете проверить, действительно ли пользователь отправил электронное письмо / смс / твит или нажал на него обратно. Например, если это мой BroadcastTest класс:

public class BroadcastTest extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        for (String key : intent.getExtras().keySet()) {
            Log.d(getClass().getSimpleName(), " " + intent.getExtras().get(key));
        }
    }
}

вы бы получили что-то вроде ComponentInfo{org.telegram.messenger/org.telegram.ui.LaunchActivity} в своем журнале, если бы пользователь выбрал приложение Telegram. Используя ключ android.intent.extra.CHOSEN_COMPONENT, вы сможете найти то, что выбрал пользователь. Кроме того, не забудьте указать BroadcastReceiver в своем манифесте.

Другой способ - использовать PackageManager и queryIntentActivities(), чтобы сделать свой собственный селектор. Это позволит вам программно получить выбор пользователя. Метод описан в этом Сообщение на StackOverflow.

Чтобы ответить на ваш вопрос о startActivityForResult из источника Android, вы можете увидеть, что Activity, который выбирает из Intents, вообще не setResult(). Таким образом, если вы попытаетесь поймать код результата в onActivityResult, он всегда будет 0 (RESULT_CANCELED). Таким образом, используя startActivityForResult, вы не можете определить, выбрал ли пользователь опцию или вернулся назад.

person Ishita Sinha    schedule 13.07.2016
comment
Использование BroadcastReceiver по-прежнему не помогает определить, действительно ли было отправлено сообщение. - person Matvey Rybakov; 30.11.2020
comment
Вероятно, вы должны увидеть этот ответ: stackoverflow.com/a/1094666/5746918 - person Ishita Sinha; 01.12.2020