Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Отправить текст и скриншот в разные сервисы на Android

#java #android #android_sdk #android_intent


Есть dialogFragment в котором выводится результат теста. В нём есть кнопка Поделиться.
Как добавить возможность по нажатию на эту кнопку отправлять в разные сервисы (соцсети,
Вайбер и т.п.) сам скриншот этого dialogFragment, сопроводительный текст и ссылку на
приложение в Google Play?
    


Ответы

Ответ 1



Делать скриншот с к-л View можно так: public static Bitmap loadBitmapFromView(View v, int width, int height) { Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); v.draw(c); return b; } Далее полученный Bitmap можно запихнуть в Intent, запускающий системный диалог шаринга один из этих способов (не вникал, но они, похоже, предлагают полученный Bitmap сначала записать в файл). Способ раз: String url = Images.Media.insertImage(context.getContentResolver(), image, "title", null); Способ два: File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File imageFile = new File(path, getCurrentTime()+ ".png"); FileOutputStream fileOutPutStream = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.PNG, 80, fileOutPutStream); fileOutPutStream.flush(); fileOutPutStream.close(); String url = "file://" + imageFile.getAbsolutePath(); Теперь формируем и запускаем Intent шаринга: final Intent intent = new Intent( android.content.Intent.ACTION_SEND); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url)); intent.putExtra(Intent.EXTRA_TEXT, "ТУТ_КАКОЙ_ТО_ТЕКСТ"); intent.setType("image/png"); startActivity(Intent.createChooser(intent, "Share with Friends")); P.S. Возможно нельзя вот так просто передать и изображение и текст для всех сервисов. Отдельно текст и изображение так, можно передать. Но вот всякие твиттеры врятли будут принимать изображения. Для корректной работы с шарингом в к-л конкретный сервсис лучше всего юзать их SDK

Ответ 2



Столкнулся с той же необходимостью - отправить фото(точнее несколько) и описание к нему с приложения. И возникла та же проблема что и у Максима Фомичёва. Как с этим боролся. Способ отправки выбрал через intent, без использования API соцсетей, почтовиков и мессенджеров (назову их просто мессенджерами). Тоесть, передаю данные через Intent и вызываю список приложений способных обрабатывать несколько типов данных (смотри ответ ЮрийСПб), в моем случае это изображения и текст. Далее дело за пользователем и его выбором мессенджера. Решил протестировать как отрабатывается отправка в разных мессенджерах. Мессенджеров с обработкой одновременно обоих типов данных, оказалось намного меньше нежели тех, которые могут работать с текстом и картинками но порознь друг от друга. Далее не все так красочно. Так как даже те мессенджеры, которые неявными интентами "заявляют", что имеют функционал для обработки одновременно нескольких типов данных, если и обрабатывают их то уж очень лихо по разному, и даже иногда никак. У некоторых, редакторы текста, которые появляются рядом с отправляемой картинкой - не принимают автоматически текст который мы передавали вместе с картинкой в intente, и разве что ручками его вводить каждый раз или копипастить(тоже ручками). Не с целью рекламы или антирекламы, а лишь из-за того что они бесплатны и установлены у меня на телефоне, возьму для примера всем известные Viber, Skype, Hangouts и Gmail. Они хороши каждый по своему, но подходят ли они для моих задач. Бэкэндная часть моих исследований: Несколько uri картинок заливал в ArrayList. ArrayList imageUris = new ArrayList(); Далее, естественно, получив все нужные permission, вызываю: private void openMultiDataSender() { String description = "some text"; Intent sendMultiData = new Intent(); sendMultiData.setAction(Intent.ACTION_SEND_MULTIPLE); sendMultiData.putExtra(Intent.EXTRA_STREAM, imageUris); sendMultiData.putExtra(Intent.EXTRA_TEXT, description); sendMultiData.setType("*/*"); startActivity(sendMultiData); } Использование какого либо конкретного MIME типа не привело к желаемому результату, ровно как и попытки их комбинировать. Потому передаю sendMultiData.setType("*/*");. Что имеем как результат передачи картинки и текста: Skype - открывает редактор с пустым полем для добавления комментария и прикрепленными картинками. Далее, если хотите - пишите ручками или вставляйте с буфера нужный вам текст, если вы его туда програмно добавили конечно. Viber - открывает редактор с пустым полем для добавления комментария и прикрепленными картинками. Если картинка к передаче ОДНА - то отправится и картинка и текст который мы передавали. Если картинок много - отправятся только картинки.(кстати, максимум 10 картинок). Коментарии к картинкам как и у скайпа - пишем ручками. Hangouts - открывает окно с кнопкой отправки и вложенными картинками. По нажатии на кнопку отправить - открывается окно чата и видим как картинки отправляются, и о чудо, неприметненько (если текста мало) в поле для ввода сообщения уже есть наш текст, нужно только нажать еще раз кнопку отправить. (Почему чудо, да потому что я его с 3-го раза его заметил, а перед этим просто закрывал чат и возвращался в начальное приложение). Но это все же лучше чем ничего. Gmail - открывается редактор с залитым нашим текстом и картинками во вложениях.(ограничение только по сумарному весу картинок). Осталось выбрать адресата и отправить. В процессе решения данной проблемы я рассматривал несколько вариантов выкрутиться с такой неудобной ситуации. Первый вариант. Вызывать интенты последовательно, сначала с текстом, потом с картинкой(или наоборот). Но в таком случае есть риск передать некомплектные данные. Причиной тому: 1) Сложность получения подтверждения, что первая операция была успешна, перед тем как начать вторую. К примеру, пользователь перейдет в какой-то мессенджер, который нам неподвластен, а там просто откажется передавать данные. 2) Предположим, что первое действие все же было произведено и наша картинка или текст(смотря что первое отправляем) благополучно улетел адресату. И тем не менее, остается риск того, что пользователь может не подтвердить 2-е действие (не каждому по нраву за два захода отправлять какую то информацию, попробуйте убедить кого то что нужно именно 2 раза идти на почту чтобы отправить одну посылку). В таком случае адресат рискует получить только первую часть того что мы собирались отправить. Значит нужно писать всплывающие сообщения или диалоговые окна с инструкциями пользователю как отправить нужный нам набор данных. Трудоемкий и запутанный может получится код. Второй вариант: Зная что картинки точно передаются, то можно сделать из нужного нам текста картинку и отправлять ее вместе с остальными картинками. Третий вариант: Большинство мессенджеров поддерживает передачу PDF файлов. Как вариант можно сделать из текста и картинки/картинок один PDF файл. Ну или Другой текстовый документ поддерживающий изображения в теле. Но это довольно трудоемко и вряд ли займет меньше времени на кодинг нежели первый вариант со всеми диалоговыми окнами и повторными отправками данных. Не могу пока предложить более оптимальных решений, к тому же предполагаю что есть уже какие то библиотеки готовые для отправки комбинированных данных, но мне они пока не известны, что хотел бы исправить.

Комментариев нет:

Отправить комментарий