Как отправить изображение из приложения через мессенджер?

Я хочу отправить изображение из своего приложения через мессенджер. Я искал Stack Overflow и нашел ответ, который работает для WhatsApp. Когда я попытался изменить «com.whatsapp» на «com.facebook.orca», он перестал работать. Вот мой код:

public void shareImageMessenger() {
            Bitmap adv = BitmapFactory.decodeResource(getResources(), R.drawable.koza);
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("image/jpeg");
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            adv.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
            File f = new File(Environment.getExternalStorageDirectory()
                    + File.separator + "temporary_file_1.jpg");
            try {
                f.createNewFile();
                new FileOutputStream(f).write(bytes.toByteArray());
            } catch (IOException e) {
                e.printStackTrace();
            }
            share.putExtra(Intent.EXTRA_STREAM,
                    Uri.parse( Environment.getExternalStorageDirectory()+ File.separator+"temporary_file_1.jpg"));
            share.setPackage("com.facebook.orca");
            startActivity(Intent.createChooser(share, "Share Image"));
        }

person Andrija Randjelovic    schedule 28.10.2018    source источник
comment
В чем ошибка   -  person Arahasya    schedule 28.10.2018
comment
Что-то пошло не так! Пожалуйста, повторите попытку позже! Или просто загружается и ничего не происходит.   -  person Andrija Randjelovic    schedule 28.10.2018
comment
Проверьте logcat, когда он выйдет из строя.. или попробуйте создать исключение, чтобы мы могли узнать, в чем проблема, а затем решить ее.   -  person Arahasya    schedule 28.10.2018
comment
У вас установлен мессенджер на устройстве, на котором вы это делаете?   -  person Arahasya    schedule 28.10.2018
comment
Да, у меня есть. Я сделаю это как можно скорее, спасибо.   -  person Andrija Randjelovic    schedule 28.10.2018
comment
Я не могу найти в logcat ничего, кроме этого: 018-10-28 15:16:47.909 752-752/? E/wificond: Не удалось получить NL80211_RATE_INFO_NOISE 2018-10-28 15:16:47.909 752-752/? E/wificond: Не удалось получить NL80211_RATE_INFO_SNR 2018-10-28 15:16:47.909 752-752/? E/wificond: не удалось получить NL80211_STA_INFO_CNAHLOAD   -  person Andrija Randjelovic    schedule 28.10.2018
comment
Хотите общий код? где вы можете выбрать любое приложение, которым вы хотите поделиться?   -  person Arahasya    schedule 28.10.2018
comment
Все, что работает, было бы хорошо...   -  person Andrija Randjelovic    schedule 28.10.2018
comment
изображение всегда будет доступно для рисования?   -  person Arahasya    schedule 28.10.2018
comment
Да, изображение всегда будет доступно для рисования.   -  person Andrija Randjelovic    schedule 28.10.2018
comment
проверьте мой ответ. Я попробовал это, и это работает   -  person Arahasya    schedule 28.10.2018


Ответы (2)


Потратив на это много времени:

Проверьте, предоставлены ли разрешения. Затем:

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

ImageView imageView = findViewById(R.id.image);
Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();

//save the image now:
saveImage(bitmap);
//share it
send();

Шаг 2. Сохраните изображение во внутренней папке:

private static void saveImage(Bitmap finalBitmap) {

    String root = Environment.getExternalStorageDirectory().getAbsolutePath();
    File myDir = new File(root + "/saved_images");
    Log.i("Directory", "==" + myDir);
    myDir.mkdirs();

    String fname = "Image-test" + ".jpg";
    File file = new File(myDir, fname);
    if (file.exists()) file.delete();
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Шаг 3. Отправьте сохраненное изображение:

public void send() {
    try {
        File myFile = new File("/storage/emulated/0/saved_images/Image-test.jpg");
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        String ext = myFile.getName().substring(myFile.getName().lastIndexOf(".") + 1);
        String type = mime.getMimeTypeFromExtension(ext);
        Intent sharingIntent = new Intent("android.intent.action.SEND");
        sharingIntent.setType(type);
        sharingIntent.putExtra("android.intent.extra.STREAM", Uri.fromFile(myFile));
        startActivity(Intent.createChooser(sharingIntent, "Share using"));
    } catch (Exception e) {
        Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

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

person Arahasya    schedule 28.10.2018
comment
Он показывает мне сообщение Toast с текстом: pathname(file:////storage/emulated/0/saved_images/Image-test.jpg) для файла, доступного за пределами приложения через ClipData.Item.getUri()... - person Andrija Randjelovic; 28.10.2018
comment
Вы используете просмотр изображений? Добавьте его в активность xml - person Arahasya; 28.10.2018
comment
РЕДАКТИРОВАТЬ: я решил указанную выше проблему, вставив StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); - person Andrija Randjelovic; 28.10.2018
comment
Работает во всех соцсетях, кроме мессенджера... Думаю, что тут какой-то баг или что-то в этом роде. Спасибо, Арахася. - person Andrija Randjelovic; 28.10.2018
comment
Это работает и для мессенджера. Я проверил это. Попробуйте переустановить мессенджер и авторизоваться - person Arahasya; 28.10.2018

Ссылаясь на связанный пост, вы можете изменить намерение поделиться.

 Intent share = new Intent(Intent.ACTION_SEND);
 share.setType("image/*");
 share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///assets/epic/adv.png"));
 this.startActivity(Intent.createChooser(share, "share_via"));

Намерение запускает приложения, которые обрабатывают Intent.ACTION_SEND. Если вы хотите, чтобы конкретное приложение отвечало, убедитесь, что вы знаете имя пакета, и вам нужно установить имя пакета share.setPackage("");

person Ramesh Yankati    schedule 28.10.2018