Android отправляет изображение с клавиатуры

Я пытаюсь реализовать приложение Keyboard, которое должно быть способно отправлять изображения в текущую активность (Whatsapp, приложение для обмена сообщениями и т. Д.).

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

Пробовал использовать StringBuilder с ImageSpan, но не смог заставить его работать. Мне было интересно, есть ли лучший способ. Возможно, с помощью намерений?

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

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

Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); sendIntent.setPackage(getCurrentAppPackage(context, editorInfo)); return sendIntent; 

Где getCurrentAppPackage(...) – это метод, который возвращает деятельность переднего плана с учетом Context и EditorInfo , которые вы можете получить из своей реализации IME при привязке к полю ввода.

 public String getCurrentAppPackage(Context context, EditorInfo info) { if(info != null && info.packageName != null) { return info.packageName; } final PackageManager pm = context.getPackageManager(); //Get the Activity Manager Object ActivityManager aManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); //Get the list of running Applications List<ActivityManager.RunningAppProcessInfo> rapInfoList = aManager.getRunningAppProcesses(); //Iterate all running apps to get their details for (ActivityManager.RunningAppProcessInfo rapInfo : rapInfoList) { //error getting package name for this process so move on if (rapInfo.pkgList.length == 0) { Log.i("DISCARDED PACKAGE", rapInfo.processName); continue; } try { PackageInfo pkgInfo = pm.getPackageInfo(rapInfo.pkgList[0], PackageManager.GET_ACTIVITIES); return pkgInfo.packageName; } catch (PackageManager.NameNotFoundException e) { // Keep iterating } } return null; } 

Обновление : API-интерфейс Commit Content был добавлен на уровне API 25 (а поддержка библиотеки делает его работу с API 13). Подробнее здесь: https://developer.android.com/preview/image-keyboard.html До тех пор, пока приложения не начнут внедрять его, приведенный выше метод можно использовать как резерв.