2009-10-19 4 views
3

Я использую следующий код: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. Мой пользователь фактически нажал кнопку BACK BUTTON ... и ничего не отправил.

Есть ли способ сделать это различие?

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

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

благодарит заранее.

Hub

ответ

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 не будет вызываться. Таким образом, вы можете проверить, действительно ли пользователь отправил электронную почту/sms/твит или если они нажали назад. Например, если это мой 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} в журнале, если пользователь выбрал приложение Телеграмма. Используя ключ android.intent.extra.CHOSEN_COMPONENT, вы сможете найти то, что выбрал пользователь. Кроме того, не забудьте объявить BroadcastReceiver в вашем манифесте.

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

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

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

  • Нет связанных вопросов^_^