Jak korzystać z zamiaru udostępniania „Udostępnij obraz za pomocą”, aby udostępniać obrazy w systemie Android?


80

Mam aplikację graficzną w tej aplikacji. Umieściłem wszystkie obrazy w folderze drawable-hdpi. i nazwałem obrazy w mojej działalności w ten sposób:

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
};

Więc teraz chcę wiedzieć, jak udostępnić te obrazy za pomocą zamiaru udostępniania, który umieściłem kod udostępniania w następujący sposób:

     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"));  
    
         }
    });

I mam przycisk udostępniania również po kliknięciu przycisku udostępniania Okno udostępniania otwiera się Ale kiedy kliknąłem jakąkolwiek usługę, głównie jej awarię lub niektóre usługi mówią: nie można otworzyć obrazu Więc jak mogę to naprawić lub czy istnieje inny kod formatu do udostępniania obrazów ????

Edytować :

Próbowałem użyć poniższego kodu. Ale to nie działa.

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"));  

         }
    });

Jeśli nie masz nic przeciwko, proszę, popraw mój powyższy kod LUB daj mi odpowiedni przykład plz Jak mogę udostępniać moje obrazy z folderu drawable-hdpi


przekazujesz całą tablicę do metody analizy URI
Pratik

Konfigurujesz zły identyfikator URI. Dlatego pojawia się ten problem. Ponownie próbujesz udostępnić wiele obrazów, więc musisz użyć stackoverflow.com/questions/2264622/… .. A do skonfigurowania prawidłowego URI powinieneś spróbować stackoverflow.com/questions/6602417/…
Kartik Domadiya


sprawdź ten samouczek udostępnij obraz z folderu do
rysowania

Odpowiedzi:


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"));

3
Czy jest jakiś powód przeciwko używaniu File f = File.createTempFile("sharedImage", suffix, getExternalCacheDir());i używaniu share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));?
cimnine

15
Tak, jeśli używasz createTempFile, plik jest tworzony w katalogu, który jest prywatny dla Twojej aplikacji. W związku z tym inne aplikacje (tj. Te, którym udostępniasz) nie będą mogły pobrać obrazu.
aleph_null

7
Powinieneś także zamknąć strumień wyjściowy.
Maarten

2
@superM, czy możesz mi pomóc, jak mogę udostępniać z folderu do
rysowania

7
1.) Nie zapomnij zamknąć FileOutputStream. 2.) Nie koduj na stałe „/ sdcard /”; zamiast tego użyj Environment.getExternalStorageDirectory (). getPath ()
linuxjava

41

Rozwiązanie proponowane od superM długo działało u mnie, ale ostatnio testowałem je na 4.2 (HTC One) i tam przestało działać. Zdaję sobie sprawę, że jest to obejście, ale było to jedyne, które działało dla mnie ze wszystkimi urządzeniami i wersjami.

Zgodnie z dokumentacją programiści proszeni są o „korzystanie z systemu MediaStore” do przesyłania treści binarnych. Ma to jednak (wady) tę zaletę, że treści multimedialne zostaną trwale zapisane na urządzeniu.

Jeśli to opcja dla Ciebie, możesz przyznać uprawnienia WRITE_EXTERNAL_STORAGEi korzystać z ogólnosystemowego magazynu 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
To jedyne rozwiązanie, które zadziałało, aby udostępnić na Facebooku! Dzięki.
Moti Bartov

9
Tworzy to nowy obraz. Jak usunąć nowy obraz?
BlueMango

2
@BlueMango znalazłeś rozwiązanie?
aks

Doskonała odpowiedź! Działa w każdej aplikacji!
dianakarenms

26

Najpierw dodaj uprawnienia

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

używając Bitmap z zasobów

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"));

Przetestowano przez Bluetooth i inne komunikatory


jak wysłać obraz z adresu URL, takiego jak aplikacja i wszystko
Harsha

jeśli chcesz udostępnić obraz z adresu URL do innej aplikacji. Musisz pobrać obraz do Bitmap stackoverflow.com/questions/18210700/ ..., a następnie użyć zamiaru udostępniania.
Hemant Shori,

a potem po załączonym obrazku i udostępnieniu, jak zamknąć tę aplikację i przejść do naszej aplikacji na Androida
Harsha

1
@Harsha lol. FYI, nie możesz sobie z tym poradzić, jeśli ktoś opuści Twoją aplikację w jakiś sposób. on / ona musi przejść do ostatniej i wznowić swoją aplikację. w żaden inny sposób. jak możesz przejąć kontrolę nad aplikacją innej osoby?
Hemant Shori,


20

Najłatwiej to zrobić, używając MediaStore do tymczasowego przechowywania obrazu, który chcesz udostępnić:

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"));

Od: Udostępnianie treści z intencjami


Nie ma potrzeby do canvaszmiennej, nie jest stosowany wszędzie.
Fernando M. Pinheiro

2
nie zapomnij dodać ermission do manifest.xml: <uses-Permissions android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Hamid

13

Jak progresywnie udostępniać obraz w systemie Android, czasami chcesz zrobić migawkę swojego widoku, a następnie chcesz go udostępnić, wykonaj następujące kroki: 1. Dodaj uprawnienia do pliku mainfest

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

2.Bardzo Najpierw zrób zrzut ekranu swojego widoku, na przykład jest to Imageview, Textview, Framelayout, LinearLayout itp.

Na przykład masz widok obrazu, aby zrobić zrzut ekranu, wywołaj tę metodę w oncreate ()

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

po zrobieniu zrzutu ekranu metodą udostępniania obrazu po kliknięciu
przycisku lub w dowolnym miejscu

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

Po utworzeniu metody zdefiniuj te dwie metody ##

    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();
    }

}

Co to jest „.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);” używany w celu, który ustaliłeś powyżej?
AJW

12

Prosty i najłatwiejszy kod, którego możesz użyć do udostępnienia obrazu z galerii.

 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 );

Prosty i potężny, nie ma potrzeby zapisywania obrazu ani tak dalej, wszystkie powyższe odpowiedzi nie zadziałały, ale to proste rozwiązanie załatwia sprawę ... Dziękuję bardzo ... Przy okazji przetestowałem ten kod na moim telefon z Androidem w wersji
oreo

10

Oto rozwiązanie, które zadziałało dla mnie. Jedna trudność polega na tym, że musisz przechowywać obrazy w udostępnionej lokalizacji prywatnej lub innej niż prywatna aplikacja ( http://developer.android.com/guide/topics/data/data-storage.html#InternalCache )

Wiele sugestii mówi, aby przechowywać w Apps „prywatnej” lokalizacji pamięci podręcznej, ale oczywiście nie jest ona dostępna za pośrednictwem innych aplikacji zewnętrznych, w tym ogólnej intencji Udostępnij plik, która jest używana. Kiedy spróbujesz, zadziała, ale na przykład Dropbox poinformuje Cię, że plik nie jest już dostępny.

/ * KROK 1 - Zapisz plik mapy bitowej lokalnie, korzystając z poniższej funkcji zapisywania plików. * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/ * KROK 2 - Udostępnij nieprywatną ścieżkę pliku Absolute do zamiaru udziału pliku * /

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);
}   

/ * FUNKCJA ZAPISZ OBRAZ * /

    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();
    }

/ * KROK 3 - Obsługa wyniku zamiaru udostępniania pliku. Potrzebujesz zdalnego pliku tymczasowego itp. * /

    @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");
        }


    }   

Mam nadzieję, że to komuś pomoże.


1
korzystanie z Log.d jest wstecz. Najpierw jest tag, a potem wiadomość.
over_optimistic

2
naprawiono, właściwie nie używam log.d, mam funkcję opakowania. Musiałem popełnić literówkę, gdy zmieniłem przykład, aby był odpowiedni dla SO. Pozdrawiam
telegram 00


8

Byłem zmęczony szukaniem różnych opcji udostępniania widoku lub obrazu z mojej aplikacji do innej aplikacji. I wreszcie znalazłem rozwiązanie.

Krok 1: Udostępnij blok obsługi zamiarów. Spowoduje to wyświetlenie okna z listą aplikacji w telefonie

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();
    }


}

Krok 2: Konwersja widoku do 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;
}

Krok 3 :

Aby uzyskać identyfikator URI z obrazu bitmapowego

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

Po prostu miałem ten sam problem.
Oto odpowiedź, która nie używa żadnego jawnego zapisu plików w głównym kodzie (pozwalając api zająć się tym za Ciebie).

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"));

To jest ścieżka ... wystarczy dodać identyfikatory obrazu do obiektu do rysowania. W moim przypadku (kod powyżej) drawable został wyodrębniony z ImageView.


3

Odpowiedź SuperM działała dla mnie, ale z Uri.fromFile () zamiast Uri.parse ().

Z Uri.parse () działało tylko z Whatsapp.

To jest mój kod:

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

Dane wyjściowe Uri.parse ():
/storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

Wyjście Uri.fromFile:
file: ///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg


3

Spróbuj tego,

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

ref: - 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

Idealnym rozwiązaniem do udostępniania tekstu i obrazu za pośrednictwem intencji jest:

Kliknij przycisk udostępniania:

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);
        }
    });

Następnie utwórz metodę shareBitmap (obraz).

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();
    }

}

A potem po prostu to przetestuj .. !!


2

Wszystkie powyższe rozwiązanie nie działa dla mnie Android Api 26 & 27 (Oreo), otrzymywałem Error: exposed beyond app through ClipData.Item.getUri. Rozwiązaniem pasującym do mojej sytuacji było

  1. pobierz ścieżkę uri używając FileProvider.getUriForFile(Context,packagename,File)as
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. Zdefiniuj <provider>w swoim Manifest.xmlas
<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. Ostatnim krokiem jest zdefiniowanie resourcepliku dla twoich katalogów
<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

Dzięki wszystkim, wypróbowałem kilka podanych opcji, ale wydaje się, że nie działają one w najnowszych wydaniach Androida, więc dodałem zmodyfikowane kroki, które działają w najnowszych wersjach Androida. są one oparte na kilku z powyższych odpowiedzi, ale z modyfikacjami, a rozwiązanie opiera się na wykorzystaniu dostawcy plików:

Krok 1

Dodaj następujący kod w pliku manifestu:

<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>

krok: 2 Utwórz plik XML w res> xml

Utwórz plik file_provider_paths wewnątrz xml.

Zauważ, że jest to plik, który zawarliśmy w android: resource w poprzednim kroku.

Wpisz następujące kody wewnątrz file_provider_paths:

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

Krok 3

Następnie przejdź do przycisku Kliknij:

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);
    }
});

Aby uzyskać bardziej szczegółowe wyjaśnienia, odwiedź https://droidlytics.wordpress.com/2020/08/04/use-fileprovider-to-share-image-from-recyclerview/


1

Dzięki wdrożeniu bardziej rygorystycznych zasad zabezpieczeń ujawnienie identyfikatora URI poza aplikacją generuje błąd i powoduje awarie aplikacji.

Odpowiedź @Ali Tamoor wyjaśnia użycie dostawców plików, jest to zalecany sposób.

Aby uzyskać więcej informacji, zobacz - https://developer.android.com/training/secure-file-sharing/setup-sharing

Musisz również dołączyć do projektu bibliotekę rdzenia Androidax.

implementation "androidx.core:core:1.2.0"

Oczywiście jest to trochę obszerna biblioteka i potrzebuję jej tylko do udostępniania plików - jeśli istnieje lepszy sposób, daj mi znać.


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"));

    }

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"));
    });

Witam i witam w SO! Chociaż ten kod może odpowiedzieć na pytanie, dostarczenie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi. Przeczytaj prezentację i jak napisać dobrą odpowiedź? Możesz dodać informacje, dlaczego ta odpowiedź jest lepsza niż inne odpowiedzi na to pytanie.
Tomer Shetah
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.