Wie verwende ich "Bild teilen mit"? Absicht, Bilder in Android zu teilen?

80

Ich habe eine Image Galley App in dieser App. Ich habe alle Bilder in den Ordner drawable-hdpi gelegt. und ich habe Bilder in meiner Aktivität so genannt:

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

Jetzt möchte ich wissen, wie ich diese Bilder mit Sharing Intent teilen kann. Ich habe den Freigabecode wie folgt geputtet:

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

Und ich habe die Freigabeschaltfläche auch, wenn ich auf die Freigabeschaltfläche klicke. Die Freigabebox öffnet sich. Wenn ich jedoch auf einen Dienst geklickt habe, stürzt er meistens ab oder einige Dienste sagen: Bild kann nicht geöffnet werden ????

Bearbeiten:

Ich habe versucht, den folgenden Code zu verwenden. Aber es funktioniert nicht.

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

         }
    });

Wenn es Ihnen nichts ausmacht, korrigieren Sie bitte meinen obigen Code ODER geben Sie mir ein geeignetes Beispiel. PLZ Wie teile ich meine Bilder aus dem Ordner drawable-hdpi?

Abhijeet
quelle
Sie übergeben das gesamte Array an die URI-
Analysemethode
Sie richten eine falsche URI ein. Deshalb tritt dieses Problem auf. Sie versuchen erneut, mehrere Bilder freizugeben, sodass Sie stackoverflow.com/questions/2264622/… verwenden müssen . Um die korrekte URI einzurichten,
Kartik Domadiya
Überprüfen Sie dieses Tutorial Bild aus Zeichnungsordner teilen
Vaishakh

Antworten:

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
quelle
3
Gibt es einen Grund gegen die Verwendung File f = File.createTempFile("sharedImage", suffix, getExternalCacheDir());und die Verwendung share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));?
Cimnine
15
Ja, wenn Sie createTempFile verwenden, wird die Datei in einem Verzeichnis erstellt, das für Ihre App privat ist. Daher können andere Apps (dh diejenigen, mit denen Sie teilen) das Bild nicht abrufen.
Aleph_Null
7
Außerdem sollten Sie den Ausgabestream schließen.
Maarten
2
@ SuperM können Sie mir helfen, wie kann ich aus zeichnbaren Ordner teilen
Erum
7
1.) Vergessen Sie nicht, Ihren FileOutputStream zu schließen. 2.) Hardcode "/ sdcard /" nicht; Verwenden Sie stattdessen Environment.getExternalStorageDirectory (). getPath ()
linuxjava
41

Die von superM vorgeschlagene Lösung hat lange für mich funktioniert, aber kürzlich habe ich sie auf 4.2 (HTC One) getestet und sie hat dort nicht mehr funktioniert. Ich bin mir bewusst, dass dies eine Problemumgehung ist, aber es war die einzige, die für mich mit allen Geräten und Versionen funktioniert hat.

Gemäß der Dokumentation werden Entwickler gebeten, "den System MediaStore zu verwenden" , um binäre Inhalte zu senden. Dies hat jedoch den (Nachteil), dass der Medieninhalt dauerhaft auf dem Gerät gespeichert wird.

Wenn dies eine Option für Sie ist, möchten Sie möglicherweise die Berechtigung erteilen WRITE_EXTERNAL_STORAGEund den systemweiten MediaStore verwenden.

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"));
Sebastian Hojas
quelle
3
Dies ist die einzige Lösung, die für mich funktioniert hat, um sie auf Facebook zu teilen! Vielen Dank.
Moti Bartov
9
Dadurch wird ein neues Bild erstellt. Wie lösche ich das neue Bild?
BlueMango
2
@BlueMango hast du eine Lösung gefunden?
Aks
Perfekte Antwort! Funktioniert in jeder App!
Dianakarenms
26

Fügen Sie zuerst die Berechtigung hinzu

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

Verwenden von Bitmap aus Ressourcen

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

Getestet über Bluetooth und andere Messenger

Hemant Shori
quelle
Wie man ein Bild von einer URL wie Whats App und allem sendet
Harsha
Wenn Sie ein Bild von einer URL für eine andere App freigeben möchten, müssen Sie das Bild auf Bitmap stackoverflow.com/questions/18210700/… herunterladen und dann die Freigabeabsicht verwenden.
Hemant Shori
und dann nach angehängtem Bild und geteilt, wie man diese App schließt und zu unserer App Android geht
Harsha
1
@ Harsha lol. Zu Ihrer Information, Sie können damit nicht umgehen, wenn jemand Ihre App wie verlässt. er / sie muss zu kürzlich gehen und deine App wieder aufnehmen. Wie kannst du die Kontrolle über die App eines anderen übernehmen?
Hemant Shori
20

Ich fand, dass der einfachste Weg, dies zu tun, darin besteht, den MediaStore zu verwenden, um das Bild, das Sie freigeben möchten, vorübergehend zu speichern:

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

Von: Inhalte mit Absichten teilen

Kukiwon
quelle
Die canvasVariable wird nicht benötigt , sie wird nirgendwo verwendet.
Fernando M. Pinheiro
2
Vergessen Sie nicht, ermission zu manifest.xml hinzuzufügen: <used-erlaubnis android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Hamid
13

So teilen Sie Bilder in Android progamatisch. Manchmal möchten Sie einen Schnappschuss Ihrer Ansicht machen und diese dann gerne freigeben. Gehen Sie also folgendermaßen vor: 1. Fügen Sie der Mainfest-Datei die Berechtigung hinzu

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

2.Sehr Machen Sie zuerst einen Screenshot Ihrer Ansicht, zum Beispiel Bildansicht, Textansicht, Framelayout, LinearLayout usw.

Zum Beispiel haben Sie eine Bildansicht, um einen Screenshot zu machen. Rufen Sie diese Methode in oncreate () auf.

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

Nach dem Aufnehmen eines Screenshots rufen Sie die Bildmethode entweder beim
Klicken auf die Schaltfläche oder an der gewünschten Stelle auf

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

Nach dem Erstellen der Methode definieren Sie diese beiden Methoden ##

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

}
Nadschaf Ali
quelle
Was ist die ".setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);" verwendet in der Absicht, die Sie oben eingerichtet haben?
AJW
12

Einfachster und einfachster Code, mit dem Sie Bilder aus der Galerie freigeben können.

 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 );
SANJAY GUPTA
quelle
Einfach und leistungsstark, keine Notwendigkeit, ein Bild zu speichern oder was auch immer, alle oben genannten Antworten haben bei mir nicht funktioniert, aber diese einfache Lösung macht den Trick ... Vielen Dank ... Übrigens, ich habe diesen Code auf meinem getestet Telefon mit Oreo-Version von Android
Parsania Hardik
10

Hier ist eine Lösung, die für mich funktioniert hat. Ein Problem ist, dass Sie die Bilder an einem freigegebenen oder nicht App-privaten Speicherort speichern müssen ( http://developer.android.com/guide/topics/data/data-storage.html#InternalCache ).

Viele Vorschläge besagen, dass im Apps"privaten" Cache-Speicherort gespeichert werden soll, aber dies ist natürlich nicht über andere externe Anwendungen zugänglich, einschließlich der generischen Absicht "Share File", die verwendet wird. Wenn Sie dies versuchen, wird es ausgeführt, aber Dropbox zeigt Ihnen beispielsweise an, dass die Datei nicht mehr verfügbar ist.

/ * SCHRITT 1 - Speichern Sie die Bitmap-Datei lokal mit der folgenden Funktion zum Speichern von Dateien. * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/ * SCHRITT 2 - Geben Sie den nicht privaten absoluten Dateipfad für die Absicht der Freigabedatei frei * /

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

/ * BILDFUNKTION SPEICHERN * /

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

/ * SCHRITT 3 - Ergebnis der Absicht der Freigabedatei verarbeiten. Temporäre Datei usw. remote entfernen müssen. * /

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


    }   

Ich hoffe das hilft jemandem.

wired00
quelle
1
Ihre Verwendung von Log.d ist rückwärts. Es ist Tag, dann Nachricht.
over_optimistic
2
behoben, ich benutze eigentlich nicht log.d, ich habe eine Wrapper-Funktion. Ich muss einen Tippfehler machen, als ich das Beispiel geändert habe, um es für SO geeignet zu machen. Prost
wired00
8

Ich war es leid, nach verschiedenen Optionen zu suchen, um Ansichten oder Bilder von meiner Anwendung für andere Anwendungen freizugeben. Und schließlich habe ich die Lösung.

Schritt 1: Intent Handling Block teilen. Daraufhin wird Ihr Fenster mit einer Liste der Anwendungen in Ihrem Telefon geöffnet

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


}

Schritt 2: Konvertieren Sie Ihre Ansicht in 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;
}

Schritt 3 :

So rufen Sie den URI von Bitmap Image ab

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);
}
AshisParajuli
quelle
4

Ich hatte gerade das gleiche Problem.
Hier ist eine Antwort, bei der in Ihrem Hauptcode keine explizite Datei geschrieben wird (die API kümmert sich für Sie darum).

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

Dies ist der Pfad ... Sie müssen nur Ihre Bild-IDs in ein Drawable-Objekt einfügen. In meinem Fall (Code oben) wurde das Drawable aus einer ImageView extrahiert.

vianna77
quelle
3

Die SuperM-Antwort hat bei mir funktioniert, aber mit Uri.fromFile () anstelle von Uri.parse ().

Mit Uri.parse () funktionierte es nur mit WhatsApp.

Das ist mein Code:

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

Ausgabe von Uri.parse ():
/storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

Ausgabe von Uri.fromFile:
file: ///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg

cgr
quelle
3

Versuche dies,

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"));
Ganpat Kaliya
quelle
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.."));
Bikesh M.
quelle
2

Eine perfekte Lösung für das Teilen von Text und Bild über Intent ist:

Klicken Sie auf der Schaltfläche "Teilen" auf:

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

Erstellen Sie dann die Methode shareBitmap (Bild).

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

}

Und dann einfach testen .. !!

Devangi
quelle
2

Die gesamte oben genannte Lösung funktioniert bei mir Android Api 26 & 27 (Oreo)nicht Error: exposed beyond app through ClipData.Item.getUri. Die Lösung, die in meine Situation passt, war

  1. Holen Sie sich Pfad uri mit FileProvider.getUriForFile(Context,packagename,File)als
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. Definieren Sie ein <provider>in Ihrem Manifest.xmlals
<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. Und der letzte Schritt besteht darin, eine resourceDatei für Ihre Direktoren zu definieren
<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`
Ali Tamoor
quelle
2

Vielen Dank an alle, ich habe die wenigen angegebenen Optionen ausprobiert, aber diese scheinen für die neuesten Android-Versionen nicht zu funktionieren. Fügen Sie daher die geänderten Schritte hinzu, die für die neuesten Android-Versionen funktionieren. Diese basieren auf einigen der obigen Antworten, jedoch mit Änderungen. Die Lösung basiert auf der Verwendung des Dateianbieters:

Schritt 1

Fügen Sie folgenden Code in die Manifest-Datei ein:

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

Schritt: 2 Erstellen Sie eine XML-Datei in res> xml

Erstellen Sie die Datei file_provider_paths in XML.

Beachten Sie, dass dies die Datei ist, die wir im vorherigen Schritt in die android: resource aufgenommen haben.

Schreiben Sie folgende Codes in die file_provider_paths:

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

Schritt 3

Gehen Sie danach zu Ihrer Schaltfläche. Klicken Sie auf:

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

Weitere Informationen finden Sie unter https://droidlytics.wordpress.com/2020/08/04/use-fileprovider-to-share-image-from-recyclerview/

Preethi Kishore
quelle
1

Bei der Implementierung strengerer Sicherheitsrichtlinien führt das Offenlegen von uri außerhalb der App zu einem Fehler und zum Absturz der Anwendung.

In der Antwort von @Ali Tamoor wird die Verwendung von Dateianbietern erläutert. Dies ist der empfohlene Weg.

Weitere Informationen finden Sie unter https://developer.android.com/training/secure-file-sharing/setup-sharing

Außerdem müssen Sie die Androidx-Kernbibliothek in Ihr Projekt aufnehmen.

implementation "androidx.core:core:1.2.0"

Natürlich ist diese Bibliothek etwas sperrig und wird nur zum Teilen von Dateien benötigt. Wenn es einen besseren Weg gibt, lassen Sie es mich bitte wissen.

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