¿Cómo usar "Compartir imagen usando" compartir Intención para compartir imágenes en Android?

80

Tengo una aplicación de galería de imágenes en esa aplicación. Coloqué todas las imágenes en la carpeta drawable-hdpi. y llamé imágenes en mi actividad de esta manera:

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

Así que ahora quiero saber cómo comparto estas imágenes usando la intención de compartir, puse un código para compartir como este:

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

Y también tengo un botón para compartir cuando hago clic en el botón para compartir Se abre el cuadro de compartir Pero cuando hice clic en cualquier servicio, la mayoría de los servicios se bloquean o algunos servicios dicen: no se puede abrir la imagen Entonces, ¿cómo puedo solucionar esto o hay algún otro código de formato para compartir imágenes? ????

Editar:

Intenté usar el siguiente código. Pero no funciona.

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

         }
    });

Si no le importa que alguien corrija mi código anterior O deme un ejemplo adecuado, por favor ¿Cómo puedo compartir mis imágenes de la carpeta drawable-hdpi?

Abhijeet
fuente
está pasando una matriz completa al método de análisis URI
Pratik
Está configurando un URI incorrecto. Por eso surge este problema. Nuevamente, está intentando compartir varias imágenes, por lo que debe usar stackoverflow.com/questions/2264622/… .. Y para configurar el URI correcto, debe probar stackoverflow.com/questions/6602417/…
Kartik Domadiya
consulte este tutorial compartir imagen de la carpeta
dibujable

Respuestas:

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
fuente
3
¿Hay alguna razón en contra del uso File f = File.createTempFile("sharedImage", suffix, getExternalCacheDir());y el uso share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(f));?
cimnine
15
Sí, si usa createTempFile, entonces el archivo se crea en un directorio que es privado para su aplicación. Por lo tanto, otras aplicaciones (es decir, con las que está compartiendo) no podrán recuperar la imagen.
aleph_null
7
También debe cerrar el flujo de salida.
Maarten
2
@superM ¿puedes ayudarme cómo puedo compartir desde la carpeta
dibujable?
7
1.) No olvide cerrar su FileOutputStream. 2.) No codifique "/ sdcard /"; use Environment.getExternalStorageDirectory (). getPath () en su lugar
linuxjava
41

La solución propuesta por superM me funcionó durante mucho tiempo, pero últimamente la probé en 4.2 (HTC One) y dejó de funcionar allí. Soy consciente de que esta es una solución alternativa, pero fue la única que funcionó para mí con todos los dispositivos y versiones.

Según la documentación, se pide a los desarrolladores que "utilicen el sistema MediaStore" para enviar contenido binario. Sin embargo, esto tiene la (desventaja) ventaja de que el contenido multimedia se guardará permanentemente en el dispositivo.

Si esta es una opción para usted, es posible que desee otorgar permiso WRITE_EXTERNAL_STORAGEy utilizar MediaStore en todo el sistema.

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"));
Sebastián Hojas
fuente
3
¡Esta es la única solución que me funcionó para compartir en Facebook! Gracias.
Moti Bartov
9
Esto crea una nueva imagen. ¿Cómo elimino la nueva imagen?
BlueMango
2
@BlueMango, ¿encontraste una solución?
aks
¡Respuesta perfecta! ¡Funciona en todas las aplicaciones!
dianakarenms
26

Primero agregue permiso

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

usando mapa de bits de recursos

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

Probado a través de bluetooth y otros mensajeros

Hemant Shori
fuente
cómo enviar una imagen desde una url como cuál es la aplicación y todo
Harsha
si desea compartir la imagen de la URL a otra aplicación, debe descargar la imagen en Bitmap stackoverflow.com/questions/18210700/… y luego usar la intención de compartir.
Hemant Shori
y luego después de la imagen adjunta y compartió cómo cerrar esa aplicación e ir a nuestra aplicación para Android
Harsha
1
@Harsha lol. FYI, no puedes manejar eso si alguien deja tu aplicación de alguna manera. él / ella tiene que ir a reciente y reanudar su aplicación. de ninguna otra manera. ¿Cómo puedes tomar el control de la aplicación de otra persona?
Hemant Shori
20

Encontré que la forma más fácil de hacer esto es usar MediaStore para almacenar temporalmente la imagen que desea compartir:

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

De: Compartir contenido con intenciones

Kukiwon
fuente
No hay necesidad de la canvasvariable, no se usa en ningún lado.
Fernando M. Pinheiro
2
no olvide agregar ermission a manifest.xml: <uses-allow android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />
Hamid
13

Cómo compartir imágenes en Android de forma programada, a veces desea tomar una instantánea de su vista y luego desea compartirla, así que siga estos pasos: 1.Agregue permiso al archivo mainfest

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

2.En primer lugar, tome una captura de pantalla de su vista, por ejemplo, Imageview, Textview, Framelayout, LinearLayout, etc.

Por ejemplo, tiene una vista de imagen para tomar una captura de pantalla, llame a este método en oncreate ()

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

después de tomar la captura de pantalla, llamar al método de compartir imagen, ya sea al
hacer clic en el botón o donde desee

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

Después de crear el método, defina estos dos métodos ##

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

}
Najaf Ali
fuente
¿Qué es el ".setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);" utilizado para la intención que configuró anteriormente?
AJW
12

El código más simple y fácil que puede usar para compartir imágenes de la galería.

 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
fuente
Simple y poderoso, no es necesario guardar la imagen o lo que sea, todas las respuestas anteriores no funcionaron para mí, pero esta solución simple funciona ... Muchas gracias ... Por cierto, he probado este código en mi teléfono con versión oreo de android
Parsania Hardik
10

Aquí hay una solución que funcionó para mí. Un problema es que necesita almacenar las imágenes en una ubicación privada compartida o sin aplicación ( http://developer.android.com/guide/topics/data/data-storage.html#InternalCache )

Muchas sugerencias dicen almacenar en el Apps ubicación de la caché "privada", pero esto, por supuesto, no es accesible a través de otras aplicaciones externas, incluida la intención genérica de Compartir archivo que se está utilizando. Cuando intente esto, se ejecutará pero, por ejemplo, Dropbox le dirá que el archivo ya no está disponible.

/ * PASO 1 - Guarde el archivo de mapa de bits localmente usando la función de guardar archivo a continuación. * /

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/ * PASO 2: comparta la ruta del archivo Absolute no privado con la intención del archivo compartido * /

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

/ * FUNCIÓN GUARDAR IMAGEN * /

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

/ * PASO 3: Manejar el resultado de Intención de archivo compartido. Necesita un archivo temporal remoto, etc. * /

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


    }   

Espero que ayude a alguien.

wired00
fuente
1
su uso de Log.d está al revés. Primero es la etiqueta y luego el mensaje.
over_optimistic
2
fijo, en realidad no uso log.d, tengo una función de contenedor. Debo cometer un error tipográfico cuando cambié el ejemplo para que sea apropiado para SO. Cheers
wired00
8

Estaba cansado de buscar diferentes opciones para compartir vistas o imágenes de mi aplicación a otra aplicación. Y finalmente obtuve la solución.

Paso 1: Bloque de manejo de intención de compartir. Esto abrirá su ventana con la lista de aplicaciones en su teléfono

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


}

Paso 2: conversión de su vista a 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;
}

Paso 3 :

Para obtener el URI de la imagen de mapa de bits

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

Acabo de tener el mismo problema.
Aquí hay una respuesta que no usa ningún archivo explícito escrito en su código principal (dejando que la api se encargue de ello por usted).

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

Esta es la ruta ... solo necesita agregar sus ID de imagen en un objeto Drawable. En mi caso (código anterior), el elemento de diseño se extrajo de un ImageView.

vianna77
fuente
3

La respuesta de SuperM funcionó para mí pero con Uri.fromFile () en lugar de Uri.parse ().

Con Uri.parse (), funcionó solo con Whatsapp.

Este es mi codigo:

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

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

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

cgr
fuente
3

prueba esto,

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

Una solución perfecta para compartir texto e imágenes a través de Intent es:

En su botón de compartir, haga clic en:

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

Luego, cree el método shareBitmap (imagen).

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

}

¡¡Y luego pruébalo .. !!

Devangi
fuente
2

Toda la solución anterior no funciona para mí Android Api 26 & 27 (Oreo), se estaba poniendo Error: exposed beyond app through ClipData.Item.getUri. La solución que encaja en mi situación fue

  1. obtener ruta uri usando FileProvider.getUriForFile(Context,packagename,File)como
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. Defina un <provider>en su 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. Y el último paso es definir el resourcearchivo para sus directores.
<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
fuente
2

Gracias a todos, probé algunas de las opciones dadas, pero parece que no funcionan para las últimas versiones de Android, por lo que agregué los pasos modificados que funcionan para las últimas versiones de Android. estos se basan en algunas de las respuestas anteriores, pero con modificaciones y la solución se basa en el uso de File Provider:

Paso 1

Agregue el siguiente código en el archivo de manifiesto:

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

paso: 2 Cree un archivo XML en res> xml

Cree el archivo file_provider_paths dentro de xml.

Tenga en cuenta que este es el archivo que incluimos en el recurso android: en el paso anterior.

Escriba los siguientes códigos dentro de file_provider_paths:

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

Paso 3

Después de eso, vaya a su botón Haga clic en:

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

Para obtener una explicación más detallada, visite https://droidlytics.wordpress.com/2020/08/04/use-fileprovider-to-share-image-from-recyclerview/

Preethi Kishore
fuente
1

Con la implementación de políticas de seguridad más estrictas, exponer uri fuera de la aplicación genera un error y la aplicación se bloquea.

La respuesta de @Ali Tamoor explica el uso de proveedores de archivos, esta es la forma recomendada.

Para obtener más detalles, consulte: https://developer.android.com/training/secure-file-sharing/setup-sharing

También debe incluir la biblioteca principal de androidx en su proyecto.

implementation "androidx.core:core:1.2.0"

Por supuesto, esta es una biblioteca un poco voluminosa y la necesita solo para compartir archivos; si hay una manera mejor, hágamelo saber.

mayank1513
fuente
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
fuente
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"));
    });
Subhajit Roy
fuente
¡Hola y bienvenido a SO! Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre cómo y / o por qué resuelve el problema mejoraría el valor de la respuesta a largo plazo. Por favor lea el recorrido y ¿Cómo puedo escribir una buena respuesta? Puede agregar información sobre por qué esa respuesta es mejor que otras respuestas a esta pregunta.
Tomer Shetah