Как использовать «Поделиться изображением с помощью» намерения поделиться изображениями в Android?

80

У меня есть приложение для галереи изображений в этом приложении. Я поместил все изображения в папку drawable-hdpi. и я назвал изображения в своей деятельности следующим образом:

private Integer[] imageIDs = {
        R.drawable.wall1, R.drawable.wall2,
        R.drawable.wall3, R.drawable.wall4,
        R.drawable.wall5, R.drawable.wall6,
        R.drawable.wall7, R.drawable.wall8,
        R.drawable.wall9, R.drawable.wall10
};

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

     Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {
       
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse(Images.Media.EXTERNAL_CONTENT_URI + "/" + imageIDs);

        sharingIntent.setType("image/jpeg");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, "Share image using"));  
    
         }
    });

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

Редактировать :

Я пробовал использовать приведенный ниже код. Но это не работает.

Button shareButton = (Button) findViewById(R.id.share_button);
     shareButton.setOnClickListener(new View.OnClickListener() {
     public void onClick(View v) {

        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        Uri screenshotUri = Uri.parse("android.resource://com.android.test/*");
        try {
            InputStream stream = getContentResolver().openInputStream(screenshotUri);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        sharingIntent.setType("image/jpeg");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
        startActivity(Intent.createChooser(sharingIntent, "Share image using"));  

         }
    });

Если не возражаете, кто-нибудь, пожалуйста, исправьте мой приведенный выше код ИЛИ дайте мне правильный пример, пожалуйста, Как поделиться своими изображениями из папки drawable-hdpi

Абхиджит
источник
вы передаете весь массив в метод анализа URI
Pratik
Вы устанавливаете неправильный URI. Вот почему возникает эта проблема. Снова вы пытаетесь поделиться несколькими изображениями, поэтому вы должны использовать stackoverflow.com/questions/2264622/… .. А для настройки правильного URI вы должны попробовать stackoverflow.com/questions/6602417/…
Kartik Domadiya
помогите мне здесь stackoverflow.com/questions/31826494/…
Адитья

Ответы:

114
Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
icon.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
File f = new File(Environment.getExternalStorageDirectory() + File.separator + "temporary_file.jpg");
try {
    f.createNewFile();
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());
} catch (IOException e) {                       
        e.printStackTrace();
}
share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///sdcard/temporary_file.jpg"));
startActivity(Intent.createChooser(share, "Share Image"));
superM
источник
3
Есть ли причина против использования File f = File.createTempFile("sharedImage", suffix, getExternalCacheDir());и использования share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));?
cimnine
15
Да, если вы используете createTempFile, то файл создается в каталоге, который является частным для вашего приложения. Таким образом, другие приложения (т. Е. Те, с которыми вы делитесь) не смогут получить изображение.
aleph_null
7
Также вы должны закрыть выходной поток.
Maarten
2
@superM может помочь мне, как я могу поделиться из папки с возможностью
переноса
7
1.) Не забудьте закрыть свой FileOutputStream. 2.) Не запрограммировать жестко "/ sdcard /"; вместо этого используйте Environment.getExternalStorageDirectory (). getPath ()
linuxjava
41

Решение, предложенное от superM, у меня работало долгое время, но последнее время я тестировал его на 4.2 (HTC One) и там оно перестало работать. Я знаю, что это обходной путь, но он был единственным, который работал у меня со всеми устройствами и версиями.

Согласно документации, разработчикам предлагается «использовать систему MediaStore» для отправки двоичного контента. Однако это имеет (недостаток) преимущество в том, что мультимедийный контент будет постоянно сохраняться на устройстве.

Если это вариант для вас, вы можете предоставить разрешение WRITE_EXTERNAL_STORAGEи использовать общесистемный MediaStore.

Bitmap icon = mBitmap;
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");

ContentValues values = new ContentValues();
values.put(Images.Media.TITLE, "title");
values.put(Images.Media.MIME_TYPE, "image/jpeg");
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI,
        values);


OutputStream outstream;
try {
    outstream = getContentResolver().openOutputStream(uri);
    icon.compress(Bitmap.CompressFormat.JPEG, 100, outstream);
    outstream.close();
} catch (Exception e) {
    System.err.println(e.toString());
}

share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share Image"));
Себастьян Ходжас
источник
3
Это единственное решение, которым я смог поделиться в Facebook! Благодарю.
Моти Бартов
9
Это создает новый образ. Как мне удалить новое изображение?
BlueMango
2
@BlueMango вы нашли решение?
aks
Отличный ответ! Работает в любом приложении!
dianakarenms
26

Сначала добавьте разрешение

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

использование Bitmap из ресурсов

Bitmap b =BitmapFactory.decodeResource(getResources(),R.drawable.userimage);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(getContentResolver(), b, "Title", null);
Uri imageUri =  Uri.parse(path);
share.putExtra(Intent.EXTRA_STREAM, imageUri);
startActivity(Intent.createChooser(share, "Select"));

Протестировано через bluetooth и другие мессенджеры

Хемант Шори
источник
как отправить изображение с URL-адреса, например, какое приложение и все такое
Харша
если вы хотите поделиться изображением с URL-адреса в другом приложении. Вам необходимо загрузить изображение в Bitmap stackoverflow.com/questions/18210700/…, а затем использовать намерение общего доступа.
Hemant Shori
а затем после прикрепленного изображения и поделился, как закрыть это приложение и перейти к нашему приложению android
Харша
1
@ Харша лол. К вашему сведению, вы не можете справиться с этим, если кто-то каким-то образом покинет ваше приложение. он / она должен перейти к недавнему и возобновить приложение ur. Никакого другого пути. как вы можете взять под контроль чужое приложение ?.
Hemant Shori
20

Я обнаружил, что самый простой способ сделать это - использовать MediaStore для временного хранения изображения, которым вы хотите поделиться:

Drawable mDrawable = mImageView.getDrawable();
Bitmap mBitmap = ((BitmapDrawable) mDrawable).getBitmap();

String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Image Description", null);
Uri uri = Uri.parse(path);

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Share Image"));

От: Совместное использование контента с намерениями

Кукивон
источник
В canvasпеременной нет необходимости , она нигде не используется.
Fernando M. Pinheiro
2
не забудьте добавить разрешение в manifest.xml: <uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Хамид
13

Как программно поделиться изображением в Android. Иногда вы хотите сделать снимок своего представления, а затем хотите поделиться им, поэтому выполните следующие действия: 1. Добавьте разрешение в файл mainfest

<uses-permission    
   android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.Очень сначала сделайте снимок экрана вашего представления, например, это Imageview, Textview, Framelayout, LinearLayout и т. Д.

Например, у вас есть изображение, чтобы сделать снимок экрана, вызовите этот метод в oncreate ()

 ImageView image= (ImageView)findViewById(R.id.iv_answer_circle);
     ///take a creenshot
    screenShot(image);

после того, как
вы сделаете снимок экрана, вызовите метод обмена изображением либо при нажатии кнопки, либо там, где вы хотите

shareBitmap(screenShot(image),"myimage");

После создания метода определите эти два метода ##

    public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

//////// this method share your image
private void shareBitmap (Bitmap bitmap,String fileName) {
    try {
        File file = new File(getContext().getCacheDir(), fileName + ".png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(     android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/png");
        startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
    }

}
Наджаф Али
источник
Что такое ".setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);" используется для целей, указанных вами выше?
AJW
12

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

 String image_path;
            File file = new File(image_path);
            Uri uri = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent .setType("image/*");
            intent .putExtra(Intent.EXTRA_STREAM, uri);
            context.startActivity(intent );
САНДЖАЙ ГУПТА
источник
Простой и мощный, нет необходимости сохранять изображение или что-то еще, все вышеперечисленные ответы не сработали для меня, но это простое решение помогает ... Большое спасибо .... Кстати, я тестировал этот код на своем телефон с oreo версией android
Parsania Hardik
10

Вот решение, которое сработало для меня. Одна проблема заключается в том, что вам нужно хранить изображения в общем или не частном месте приложения ( http://developer.android.com/guide/topics/data/data-storage.html#InternalCache )

Многие предложения говорят о хранении в Apps"частном" месте кэша, но это, конечно, недоступно через другие внешние приложения, включая общее намерение общего доступа к файлу, которое используется. Когда вы попробуете это сделать, он запустится, но, например, dropbox сообщит вам, что файл больше не доступен.

/ * ШАГ 1 - Сохранить файл растрового изображения локально, используя функцию сохранения файла ниже. * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/ * ШАГ 2 - Совместное использование неприкосновенного абсолютного пути к файлу намерения общего доступа * /

if (localAbsoluteFilePath!=null && localAbsoluteFilePath!="") {

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    Uri phototUri = Uri.parse(localAbsoluteFilePath);

    File file = new File(phototUri.getPath());

    Log.d(TAG, "file path: " +file.getPath());

    if(file.exists()) {
        // file create success

    } else {
        // file create fail
    }
    shareIntent.setData(phototUri);
    shareIntent.setType("image/png");
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
    activity.startActivityForResult(Intent.createChooser(shareIntent, "Share Via"), Navigator.REQUEST_SHARE_ACTION);
}   

/ * ФУНКЦИЯ СОХРАНЕНИЯ ИЗОБРАЖЕНИЯ * /

    private String saveImageLocally(Bitmap _bitmap) {

        File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS);
        File outputFile = null;
        try {
            outputFile = File.createTempFile("tmp", ".png", outputDir);
        } catch (IOException e1) {
            // handle exception
        }

        try {
            FileOutputStream out = new FileOutputStream(outputFile);
            _bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            out.close();

        } catch (Exception e) {
            // handle exception
        }

        return outputFile.getAbsolutePath();
    }

/ * ШАГ 3 - Обработка результата намерения общего доступа к файлу. Необходимо удалить временный файл и т. Д. * /

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

            // deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents
        if (requestCode== Navigator.REQUEST_SHARE_ACTION) {
            // delete temp file
            File file = new File (localAbsoluteFilePath);
            file.delete();

            Toaster toast = new Toaster(activity);
            toast.popBurntToast("Successfully shared");
        }


    }   

Надеюсь, это кому-то поможет.

проводной00
источник
1
вы используете Log.d наоборот. Сначала это тег, затем сообщение.
over_optimistic
2
исправлено, я вообще не использую log.d, у меня есть функция-оболочка. Я должен был сделать опечатку, когда изменил пример, чтобы сделать его подходящим для SO. Ура
wired00
8

Я устал искать разные варианты для совместного использования представления или изображения из моего приложения в другое приложение. И наконец я получил решение.

Шаг 1. Блок обработки общего намерения. Появится всплывающее окно со списком приложений в вашем телефоне.

public void share_bitMap_to_Apps() {

    Intent i = new Intent(Intent.ACTION_SEND);

    i.setType("image/*");
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    /*compress(Bitmap.CompressFormat.PNG, 100, stream);
    byte[] bytes = stream.toByteArray();*/


    i.putExtra(Intent.EXTRA_STREAM, getImageUri(mContext, getBitmapFromView(relative_me_other)));
    try {
        startActivity(Intent.createChooser(i, "My Profile ..."));
    } catch (android.content.ActivityNotFoundException ex) {

        ex.printStackTrace();
    }


}

Шаг 2: преобразование вашего представления в BItmap

public static Bitmap getBitmapFromView(View view) {
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(),      view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    //Get the view's background
    Drawable bgDrawable = view.getBackground();
    if (bgDrawable != null)
        //has background drawable, then draw it on the canvas
        bgDrawable.draw(canvas);
    else
        //does not have background drawable, then draw white background on the canvas
        canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}

Шаг 3 :

Чтобы получить URI из растрового изображения

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}
АшисПараджули
источник
4

У меня была такая же проблема.
Вот ответ, который не использует явную запись файла в вашем основном коде (позволяя api позаботиться об этом за вас).

Drawable mDrawable = myImageView1.getDrawable();
Bitmap mBitmap = ((BitmapDrawable)mDrawable).getBitmap();
String path = MediaStore.Images.Media.insertImage(getContentResolver(), mBitmap, "Image I want to share", null);
Uri uri = Uri.parse(path);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share Image"));

Это путь ... вам просто нужно добавить идентификаторы изображений в объект Drawable. В моем случае (код выше) чертеж был извлечен из ImageView.

vianna77
источник
3

Ответ SuperM работал у меня, но с Uri.fromFile () вместо Uri.parse ().

С Uri.parse () он работал только с Whatsapp.

Это мой код:

sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mFile));

Вывод Uri.parse ():
/storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

Вывод Uri.fromFile:
file: ///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

cgr
источник
3

попробуй это,

Uri imageUri = Uri.parse("android.resource://your.package/drawable/fileName");
      Intent intent = new Intent(Intent.ACTION_SEND);
      intent.setType("image/png");

      intent.putExtra(Intent.EXTRA_STREAM, imageUri);
      startActivity(Intent.createChooser(intent , "Share"));
Ганпат Калия
источник
3

ссылка: - http://developer.android.com/training/sharing/send.html#send-multiple-content

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, "Share images to.."));
Бикеш М
источник
2

Идеальное решение для обмена текстом и изображением через Intent:

На кнопке «Поделиться» нажмите:

Bitmap image;
shareimagebutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            URL url = null;
            try {
                url = new URL("https://firebasestorage.googleapis.com/v0/b/fir-notificationdemo-dbefb.appspot.com/o/abc_text_select_handle_middle_mtrl_light.png?alt=media&token=c624ab1b-f840-479e-9e0d-6fe8142478e8");
                image = BitmapFactory.decodeStream(url.openConnection().getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
            shareBitmap(image);
        }
    });

Затем создайте метод shareBitmap (image).

private void shareBitmap(Bitmap bitmap) {

    final String shareText = getString(R.string.share_text) + " "
            + getString(R.string.app_name) + " developed by "
            + "https://play.google.com/store/apps/details?id=" + getPackageName() + ": \n\n";

    try {
        File file = new File(this.getExternalCacheDir(), "share.png");
        FileOutputStream fOut = new FileOutputStream(file);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        fOut.flush();
        fOut.close();
        file.setReadable(true, false);
        final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra(Intent.EXTRA_TEXT, shareText);
        intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
        intent.setType("image/png");
        startActivity(Intent.createChooser(intent, "Share image via"));

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

}

А потом просто проверьте это .. !!

Деванги
источник
2

Все вышеперечисленное решение не работает для меня Android Api 26 & 27 (Oreo), получалось Error: exposed beyond app through ClipData.Item.getUri. Решение, которое подходит для моей ситуации, было

  1. получить путь uri, используя FileProvider.getUriForFile(Context,packagename,File)как
void shareImage() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,getPackageName(),deleteFilePath));
        startActivity(Intent.createChooser(intent,"Share with..."));
    }
  1. Определите <provider>в своем Manifest.xmlкак
<provider
     android:name="android.support.v4.content.FileProvider"
     android:authorities="com.example.stickerapplication"
      android:exported="false"
      android:grantUriPermissions="true">
      <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/file_paths">
       </meta-data>
</provider>
  1. И последний шаг - определить resourceфайл для ваших каталогов.
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="." />
</paths>
*Note this solution is for `external storage` `uri`
Али Тамур
источник
2

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

Шаг 1

Добавьте следующий код в файл манифеста:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_provider_paths" />
</provider>

Шаг: 2 Создайте файл XML в res> xml

Создайте файл file_provider_paths внутри xml.

Обратите внимание, что это файл, который мы включили в ресурс android: на предыдущем шаге.

Напишите следующие коды внутри file_provider_paths:

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

Шаг 3

После этого перейдите к своей кнопке. Нажмите:

Button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

       Bitmap bit = BitmapFactory.decodeResource(context.getResources(),  R.drawable.filename);
        File filesDir = context.getApplicationContext().getFilesDir();
        File imageFile = new File(filesDir, "birds.png");
        OutputStream os;
        try {
            os = new FileOutputStream(imageFile);
            bit.compress(Bitmap.CompressFormat.PNG, 100, os); 
            os.flush();
            os.close();
        } catch (Exception e) {
            Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
        }

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_SEND);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        Uri imageUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, imageFile);

        intent.putExtra(Intent.EXTRA_STREAM, imageUri);
        intent.setType("image/*");
        context.startActivity(intent);
    }
});

Для более подробного объяснения посетите https://droidlytics.wordpress.com/2020/08/04/use-fileprovider-to-share-image-from-recyclerview/

Прити Кишор
источник
1

При реализации более строгих политик безопасности раскрытие uri вне приложения вызывает ошибку и сбой приложения.

Ответ @Ali Tamoor объясняет использование поставщиков файлов, это рекомендуемый способ.

Подробнее см. - https://developer.android.com/training/secure-file-sharing/setup-sharing.

Также вам необходимо включить в свой проект базовую библиотеку androidx.

implementation "androidx.core:core:1.2.0"

Конечно, это немного громоздкая библиотека, и она нужна только для обмена файлами - если есть способ лучше, дайте мне знать.

майанк1513
источник
0
Strring temp="facebook",temp="whatsapp",temp="instagram",temp="googleplus",temp="share";

    if(temp.equals("facebook"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage("com.facebook.katana");
        if (intent != null) {

            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
            shareIntent.setType("image/png");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/folder name/abc.png"));
            shareIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            shareIntent.setPackage("com.facebook.katana");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, "Facebook require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("whatsapp"))
    {

        try {
            File filePath = new File("/sdcard/folder name/abc.png");
            final ComponentName name = new ComponentName("com.whatsapp", "com.whatsapp.ContactPicker");
            Intent oShareIntent = new Intent();
            oShareIntent.setComponent(name);
            oShareIntent.setType("text/plain");
            oShareIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Website : www.google.com");
            oShareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));
            oShareIntent.setType("image/jpeg");
            oShareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            MainActivity.this.startActivity(oShareIntent);


        } catch (Exception e) {
            Toast.makeText(MainActivity.this, "WhatsApp require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("instagram"))
    {
        Intent intent = getPackageManager().getLaunchIntentForPackage("com.instagram.android");
        if (intent != null)
        {
            File filePath =new File("/sdcard/folder name/"abc.png");
            Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
            shareIntent.setType("image");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/Chitranagari/abc.png"));
            shareIntent.setPackage("com.instagram.android");
            startActivity(shareIntent);

        }
        else
        {
            Toast.makeText(MainActivity.this, "Instagram require..!!", Toast.LENGTH_SHORT).show();

        }
    }
    if(temp.equals("googleplus"))
    {

        try
        {

            Calendar c = Calendar.getInstance();
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss");
            String strDate = sdf.format(c.getTime());
            Intent shareIntent = ShareCompat.IntentBuilder.from(MainActivity.this).getIntent();
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, "Website : www.google.com");
            shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/folder name/abc.png"));
            shareIntent.setPackage("com.google.android.apps.plus");
            shareIntent.setAction(Intent.ACTION_SEND);
            startActivity(shareIntent);
        }catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(MainActivity.this, "Googleplus require..!!", Toast.LENGTH_SHORT).show();
        }
    }
    if(temp.equals("share")) {

        File filePath =new File("/sdcard/folder name/abc.png");  //optional //internal storage
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "Website : www.google.com");
        shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(filePath));  //optional//use this when you want to send an image
        shareIntent.setType("image/jpeg");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        startActivity(Intent.createChooser(shareIntent, "send"));

    }
Hardip
источник
0
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        Log.d(TAG, "Permission granted");
    } else {
        ActivityCompat.requestPermissions(getActivity(),
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                100);
    }

    fab.setOnClickListener(v -> {
        Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.refer_pic);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("image/*");
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        String path = MediaStore.Images.Media.insertImage(requireActivity().getContentResolver(),
                b, "Title", null);
        Uri imageUri = Uri.parse(path);
        share.putExtra(Intent.EXTRA_STREAM, imageUri);
        share.putExtra(Intent.EXTRA_TEXT, "Here is text");
        startActivity(Intent.createChooser(share, "Share via"));
    });
Субхаджит Рой
источник
Привет и добро пожаловать в SO! Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа. Пожалуйста , прочитайте тур , и Как написать хороший ответ? Вы можете добавить информацию, почему этот ответ лучше других ответов на этот вопрос.
Томер Шетах