Обмен изображениями и ссылками через Intent для WhatsApp, Telegram и т. Д. - PullRequest
3 голосов
/ 09 июля 2019

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

Я попробовал этот работающий код, показывая пользователю панель выбора приложения..

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "My subject");
intent.putExtra(Intent.EXTRA_TITLE, "My subject");
intent.putExtra(Intent.EXTRA_TEXT, "https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID);
startActivity(Intent.createChooser(intent, "Share App"));

Какую информацию я должен включить в Намерение, чтобы правильно отображать сообщение, когда пользователь решает поделиться им с WhatsApp, Telegram, SMS, электронной почтой и т. Д .?

Например, этот код будет отображать предварительный просмотр в Telegram (с выделенной ссылкой и изображением предварительного просмотра), но не в WhatsApp (он показывает только простой текст для отправки в качестве сообщения): почему?

Я также пыталсяэтот код, но он работает для telegram, но не для WhatsApp (он отправляет сообщение только с вложением, которое невозможно открыть с текстом «без заголовка»):

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TITLE, "title test");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "subject test");
String shareMessage= "message test\n\n";
shareMessage = shareMessage + "https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID +"\n\n";
shareIntent.putExtra(Intent.EXTRA_TEXT, shareMessage);
shareIntent.putExtra(Intent.EXTRA_HTML_TEXT, "HTML " + shareMessage);
Uri imageUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
        + res.getResourcePackageName(R.drawable.testjpg) + '/'
        + res.getResourceTypeName(R.drawable.testjpg) + '/'
        + res.getResourceEntryName(R.drawable.testjpg));
Toast.makeText(this, imageUri.toString(), Toast.LENGTH_LONG).show();
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
shareIntent.setType("image/jpg");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));

Как заставить это работать для WhatsApp, Telegram,FB, электронная почта и другие текстовые сообщения, такие как SMS?

Ответы [ 3 ]

4 голосов
/ 15 июля 2019

Какую информацию я должен включить в Намерение, чтобы правильно отобразить сообщение, когда пользователь решит поделиться им с WhatsApp, Telegram, SMS, электронной почтой и т. Д .?

Определение «правильно» зависит от разработчиков других приложений, а не от вас.То, что они делают с статистами на вашем Intent, зависит от них, а не от васЧто они делают с этими дополнениями, будет зависеть от приложения, версии приложения и, возможно, характеристик устройства / ОС.Вы не можете контролировать все это.Вы просто предоставляете данные и позволяете разработчикам других приложений делать с ними то, что они хотят.

этот код будет отображать предварительный просмотр в Telegram (с выделенной ссылкой и изображением предварительного просмотра), но не вWhatsApp (он показывает только простой текст для отправки в виде сообщения): почему?

Потому что именно это решили сделать разработчики Telegram и WhatsApp.

Я пыталсятакже этот код, но он работает для телеграммы, но не для whatsapp

В этом коде есть различные ошибки:

  • Вы предоставляете что-то, что не является HTML вEXTRA_HTML_TEXT

  • image/jpg не является допустимым типом MIME (это image/jpeg)

  • Ваш Uri имеет *Схема 1034 *, а не схема content

Изменит ли исправление этих ошибок поведение WhatsApp, зависит от разработчиков WhatsApp, и это поведение может измениться семь раз в течение следующегочас, все, что вы знаете.Поэтому, хотя я рекомендую исправить эти ошибки, не думайте, что какое-либо приложение обязательно будет вести себя по-другому или каким-то образом, как вам нужно.

0 голосов
/ 22 июля 2019

Для меня следующий рабочий код: FileProvider (проверено на реальном устройстве с Android 6.1).

При использовании FileProvider я могу разрешитьдругие приложения для чтения моего изображения.

AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="app.example.com">
    <application
        ...>
        <activity
            ...></activity>
        <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="app.example.com"
            android:exported="false"
            android:grantUriPermissions="true"
            android:readPermission="app.example.com.fileprovider.READ">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
    </application>
</manifest>

provider_paths.xml :

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="files" path="/" />
</paths>

Activity.java :

String nomeApp = getString(R.string.app_name);
String titoloApp = getString(R.string.titolo_app);
String shareMessage = "Text message\n\n";
shareMessage = shareMessage + "https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID +"\n\n";

// use the dedicated external directory so the App doesn't need to ask for permission in manifest
File dirSaveFile = getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES);

// create needed dirs for file path
File imagePath = new File(dirSaveFile, "external_files");
imagePath.mkdir();

// create empty file
File imageFile = new File(imagePath.getPath(), "test.jpg");

// get the Bitmap of the drawable to show
final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.testjpg);

// write in the file the drawable image
try {
    FileOutputStream fos = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
    fos.flush();
    fos.close();
} catch (Exception e) {
    e.printStackTrace();
}

// create the uri
Uri uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, imageFile);

// create the Intent
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_TITLE, "Title test");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject test");
shareIntent.putExtra(Intent.EXTRA_TEXT, shareMessage);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("text/plain");

startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));

Примечание : как @CommonsWare говорит в своем ответе:

Что они делают сдополнения к вашему намерению - их, а не вы.

Так что в будущем этот код может больше не работать.

0 голосов
/ 15 июля 2019

Вот возможный ответ -

Intent waIntent = new Intent(Intent.ACTION_SEND);
waIntent.setType("text/plain");
String text = "Sorry For Interruption,I'm Just Trying Something";
waIntent.setPackage("com.whatsapp");

if (waIntent != null) {
    waIntent.putExtra(Intent.EXTRA_TEXT, text);
    waIntent.putExtra(Intent.EXTRA_SUBJECT, "My subject");
    waIntent.putExtra(Intent.EXTRA_TITLE, "My subject");
    waIntent.putExtra(Intent.EXTRA_TEXT, "https://play.google.com/store/apps/details?id=" + BuildConfig.APPLICATION_ID);
    waIntent.putExtra(Intent.EXTRA_STREAM, attachment);
    startActivity(Intent.createChooser(waIntent,"Share with"));

Надеюсь, это поможет !!

Источник - Отправка сообщения через WhatsApp По намерению

И

https://developer.android.com/guide/components/intents-common#java

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