Android: отправка информации из приложения [дубликат]

Другие ответы превосходны, и я просто хочу дать прямой ответ на этот вопрос. Просто ограничение асинхронных вызовов jQuery

Все вызовы ajax (включая $.get или $.post или $.ajax) асинхронны.

Учитывая ваш пример

var outerScopeVar;  //line 1
$.post('loldog', function(response) {  //line 2
    outerScopeVar = response;
});
alert(outerScopeVar);  //line 3

Выполнение кода начинается с строки 1, объявляет переменную и триггеры и асинхронный вызов в строке 2 (т. е. пост-запрос), и продолжает выполнение из строки 3, не дожидаясь, когда почтовый запрос завершит выполнение .

Допустим, что запрос на отправку занимает 10 секунд, значение outerScopeVar будет установлено только после этих 10 секунд.

Чтобы попробовать,

var outerScopeVar; //line 1
$.post('loldog', function(response) {  //line 2, takes 10 seconds to complete
    outerScopeVar = response;
});
alert("Lets wait for some time here! Waiting is fun");  //line 3
alert(outerScopeVar);  //line 4

Теперь, когда вы выполните это, вы получите предупреждение в строке 3. Теперь подождите некоторое время, пока не убедитесь, что почтовый запрос вернул некоторое значение. Затем, когда вы нажмете «ОК», в окне предупреждения следующее предупреждение выведет ожидаемое значение, потому что вы его ждали.

В сценарии реальной жизни код становится,

var outerScopeVar;
$.post('loldog', function(response) {
    outerScopeVar = response;
    alert(outerScopeVar);
});

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

466
задан Amir Rachum 6 September 2014 в 21:34
поделиться

18 ответов

Лучший (и самый простой) способ - использовать Intent:

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"recipient@example.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "subject of email");
i.putExtra(Intent.EXTRA_TEXT   , "body of email");
try {
    startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}

В противном случае вам придется писать свой собственный клиент.

897
ответ дан Jeremy Logan 1 September 2018 в 05:24
поделиться

Используйте .setType("message/rfc822") или выборщик покажет вам все (многие) приложения, которые поддерживают намерение отправки.

185
ответ дан Ahmad 1 September 2018 в 05:24
поделиться

Это покажет вам только почтовые клиенты (а также PayPal по неизвестной причине)

 public void composeEmail() {

    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:"));
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
    intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    intent.putExtra(Intent.EXTRA_TEXT, "Body");
    try {
        startActivity(Intent.createChooser(intent, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }
}
2
ответ дан Avi Parshan 1 September 2018 в 05:24
поделиться

Вот как я это сделал. Приятно и просто.

String emailUrl = "mailto:email@example.com?subject=Subject Text&body=Body Text";
        Intent request = new Intent(Intent.ACTION_VIEW);
        request.setData(Uri.parse(emailUrl));
        startActivity(request);
1
ответ дан Dog Lover 1 September 2018 в 05:24
поделиться

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

    Intent i = new Intent(Intent.ACTION_SENDTO);
    i.setType("message/rfc822"); 
    i.setData(Uri.parse("mailto:"));
    i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"test@gmail.com"});
    i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
    i.putExtra(Intent.EXTRA_TEXT   , "body of email");
    try {
        startActivity(Intent.createChooser(i, "Send mail..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
    }
0
ответ дан Faris Muhammed 1 September 2018 в 05:24
поделиться

Я использую приведенный ниже код в своих приложениях. Это показывает точно почтовые клиентские приложения, такие как Gmail.

    Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null));
    contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject));
    startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser)));
3
ответ дан lomza 1 September 2018 в 05:24
поделиться

Используйте это для отправки электронной почты ...

boolean success = EmailIntentBuilder.from(activity)
    .to("support@example.org")
    .cc("developer@example.org")
    .subject("Error report")
    .body(buildErrorReport())
    .start();

use build gradle:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
2
ответ дан Manish 1 September 2018 в 05:24
поделиться

попробуйте эту функцию

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    buttonSend = (Button) findViewById(R.id.buttonSend);
    textTo = (EditText) findViewById(R.id.editTextTo);
    textSubject = (EditText) findViewById(R.id.editTextSubject);
    textMessage = (EditText) findViewById(R.id.editTextMessage);

    buttonSend.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            String to = textTo.getText().toString();
            String subject = textSubject.getText().toString();
            String message = textMessage.getText().toString();

            Intent email = new Intent(Intent.ACTION_SEND);
            email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
            // email.putExtra(Intent.EXTRA_CC, new String[]{ to});
            // email.putExtra(Intent.EXTRA_BCC, new String[]{to});
            email.putExtra(Intent.EXTRA_SUBJECT, subject);
            email.putExtra(Intent.EXTRA_TEXT, message);

            // need this to prompts email client only
            email.setType("message/rfc822");

            startActivity(Intent.createChooser(email, "Choose an Email client :"));

        }
    });
}
3
ответ дан NagarjunaReddy 1 September 2018 в 05:24
поделиться

Вот пример рабочего кода, который открывает почтовое приложение в устройстве android и автоматически заполняется с адресом To и Subject в отправляющей почте.

protected void sendEmail() {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:feedback@gmail.com"));
    intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
3
ответ дан NovelGuy 1 September 2018 в 05:24
поделиться

Я решил эту проблему с простыми строками кода, как объясняет документация по android.

( https://developer.android.com/guide/components/intents-common.html#Email )

Наиболее важным является флаг: это ACTION_SENDTO, а не ACTION_SEND

. Другая важная строка -

intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***

Кстати, если вы отправите пустой Extra, то if() в конце не будет работать, и приложение не запустит почтовый клиент.

Согласно документации Android. Если вы хотите, чтобы ваше намерение обрабатывалось только приложением электронной почты (а не другими текстовыми сообщениями или социальными приложениями), используйте действие ACTION_SENDTO и включите схему данных «mailto:». Например:

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // only email apps should handle this
    intent.putExtra(Intent.EXTRA_EMAIL, addresses);
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}
15
ответ дан Pedro Varela 1 September 2018 в 05:24
поделиться

Этот метод работает для меня. Он открывает приложение Gmail (если установлено) и устанавливает mailto.

public void openGmail(Activity activity) {
    Intent emailIntent = new Intent(Intent.ACTION_VIEW);
    emailIntent.setType("text/plain");
    emailIntent.setType("message/rfc822");
    emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to)));
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info ");
    final PackageManager pm = activity.getPackageManager();
    final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
    ResolveInfo best = null;
    for (final ResolveInfo info : matches)
        if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
            best = info;
    if (best != null)
        emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
    activity.startActivity(emailIntent);
}
0
ответ дан psycho 1 September 2018 в 05:24
поделиться

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

Intent intent = new Intent(Intent.ACTION_SENDTO); // it's not ACTION_SEND
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject of email");
intent.putExtra(Intent.EXTRA_TEXT, "Body of email");
intent.setData(Uri.parse("mailto:default@recipient.com")); // or just "mailto:" for blank
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // this will make such that when user returns to your app, your app is displayed, instead of the email app.
startActivity(intent);
77
ответ дан Randy Sugianto 1 September 2018 в 05:24
поделиться

Стратегия использования .setType("message/rfc822") или ACTION_SEND, похоже, также соответствует приложениям, которые не являются почтовыми клиентами, такими как Android Beam и Bluetooth .

Использование ACTION_SENDTO и mailto: URI, кажется, работает отлично, и рекомендуется в документации разработчика . Однако, если вы делаете это на официальных эмуляторах и не настроено никаких учетных записей электронной почты (или нет почтовых клиентов), вы получаете следующую ошибку:

Неподдерживаемое действие

Это действие в настоящее время не поддерживается.

Как показано ниже:

Unsupported action: That action is not currently supported. [/g6]

It оказывается, что эмуляторы разрешают намерение к активности под названием com.android.fallback.Fallback , которая отображает указанное выше сообщение. По-видимому, это по дизайну.

Если вы хотите, чтобы ваше приложение обходилось, чтобы оно также корректно работало на официальных эмуляторах, вы можете проверить его, прежде чем пытаться отправить электронное письмо:

private void sendEmail() {
    Intent intent = new Intent(Intent.ACTION_SENDTO)
        .setData(new Uri.Builder().scheme("mailto").build())
        .putExtra(Intent.EXTRA_EMAIL, new String[]{ "John Smith <johnsmith@yourdomain.com>" })
        .putExtra(Intent.EXTRA_SUBJECT, "Email subject")
        .putExtra(Intent.EXTRA_TEXT, "Email body")
    ;

    ComponentName emailApp = intent.resolveActivity(getPackageManager());
    ComponentName unsupportedAction = ComponentName.unflattenFromString("com.android.fallback/.Fallback");
    if (emailApp != null && !emailApp.equals(unsupportedAction))
        try {
            // Needed to customise the chooser dialog title since it might default to "Share with"
            // Note that the chooser will still be skipped if only one app is matched
            Intent chooser = Intent.createChooser(intent, "Send email with");
            startActivity(chooser);
            return;
        }
        catch (ActivityNotFoundException ignored) {
        }

    Toast
        .makeText(this, "Couldn't find an email app and account", Toast.LENGTH_LONG)
        .show();
}

Найти дополнительную информацию в документации разработчика .

18
ответ дан Sam 1 September 2018 в 05:24
поделиться

Эта функция сначала направляет gmail для непосредственного намерения для отправки электронной почты, если gmail не найден, а затем продвигает выбор намерения. Я использовал эту функцию во многих коммерческих приложениях, и она работает нормально. Надеюсь, это вам поможет:

public static void sentEmail(Context mContext, String[] addresses, String subject, String body) {

    try {
        Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW);
        sendIntentGmail.setType("plain/text");
        sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses)));
        sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
        sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses);
        if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject);
        if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body);
        mContext.startActivity(sendIntentGmail);
    } catch (Exception e) {
        //When Gmail App is not installed or disable
        Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND);
        sendIntentIfGmailFail.setType("*/*");
        sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses);
        if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject);
        if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body);
        if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) {
            mContext.startActivity(sendIntentIfGmailFail);
        }
    }
}
2
ответ дан Shohan Ahmed Sijan 1 September 2018 в 05:24
поделиться

Другим решением может быть

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("plain/text");
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"someone@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);

Предполагая, что на большинстве Android-устройств уже установлено приложение GMail.

2
ответ дан silentsudo 1 September 2018 в 05:24
поделиться

Я использовал что-то в соответствии с принятым в настоящее время ответом, чтобы отправлять электронные письма с прикрепленным двоичным файлом журнала ошибок. GMail и K-9 отправляют его просто отлично, и он также отлично подходит для моего почтового сервера. Единственной проблемой был мой почтовый клиент по выбору Thunderbird, у которого были проблемы с открытием / сохранением прикрепленного файла журнала. Фактически, он просто не сохранил файл вообще, не жалуясь.

Я взглянул на один из этих исходных кодов почты и заметил, что в файле файла журнала (по понятным причинам) был тип mime message/rfc822 , Конечно, это приложение не является прикрепленным письмом. Но Thunderbird не может справиться с этой крошечной ошибкой изящно.

После небольшого исследования и экспериментов я придумал следующее решение:

    public Intent createEmailOnlyChooserIntent(Intent source,
        CharSequence chooserTitle) {
        Stack<Intent> intents = new Stack<Intent>();
        Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
                "info@domain.com", null));
        List<ResolveInfo> activities = getPackageManager()
                .queryIntentActivities(i, 0);

        for(ResolveInfo ri : activities) {
            Intent target = new Intent(source);
            target.setPackage(ri.activityInfo.packageName);
            intents.add(target);
        }

        if(!intents.isEmpty()) {
            Intent chooserIntent = Intent.createChooser(intents.remove(0),
                    chooserTitle);
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
                    intents.toArray(new Parcelable[intents.size()]));

            return chooserIntent;
        } else {
            return Intent.createChooser(source, chooserTitle);
        }
    }

Его можно использовать следующим образом:

        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("*/*");
        i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile));
        i.putExtra(Intent.EXTRA_EMAIL, new String[] {
            ANDROID_SUPPORT_EMAIL
        });
        i.putExtra(Intent.EXTRA_SUBJECT, "Crash report");
        i.putExtra(Intent.EXTRA_TEXT, "Some crash report details");

        startActivity(createEmailOnlyChooserIntent(i, "Send via email"));

Как вы можете видеть, метод createEmailOnlyChooserIntent может быть легко загружен с правильным намерением и правильным типом mime.

Затем он просматривает список доступных действий, которые отвечают на ACTION_SENDTO mailto (только для почтовых приложений) и создает выбор на основе этого списка действий и оригинального намерения ACTION_SEND с правильным типом mime.

Еще одно преимущество заключается в том, что Skype больше не указан ( который реагирует на тип mime rfc822).

48
ответ дан tiguchi 1 September 2018 в 05:24
поделиться

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

Построение и отправка более сложной электронной почты без взаимодействия с пользователем влечет за собой создание собственного клиента. Первое, что Sun Java API для электронной почты недоступно. У меня был успех, используя библиотеку Apache Mime4j для создания электронной почты. Все на основе документов в nilvec .

12
ответ дан Tom van Enckevort 1 September 2018 в 05:24
поделиться

Чтобы ПРОСТО ПОЛУЧИТЬ EMAIL APPS, чтобы решить ваше намерение, вам необходимо указать ACTION_SENDTO как Action и mailto как Data.

private void sendEmail(){

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
    emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com")); 
    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email's subject");
    emailIntent.putExtra(Intent.EXTRA_TEXT, "My email's body");

    try {
        startActivity(Intent.createChooser(emailIntent, "Send email using..."));
    } catch (android.content.ActivityNotFoundException ex) {
        Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
    }

}
32
ответ дан wildzic 1 September 2018 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: