J'ai une application d'images dans cette application, j'ai placé toutes les images dans le dossier drawable-hdpi ..__ et j'ai appelé les images de mon activité comme suit:
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
};
Alors maintenant, je veux savoir comment puis-je partager ces images à l'aide du partage d'intention que j'ai mis le code de partage comme ceci:
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"));
}
});
Et j'ai le bouton de partage aussi quand je clique sur le bouton de partage La boîte de partage est ouverte Mais quand je cliquai sur n'importe quel service, la plupart de ses crashs ou certains services disent: impossible d'ouvrir l'imageAlors comment je peux résoudre ce problème ou y en a-t-il autre code de format pour partager des images ????
Modifier :
J'ai essayé d'utiliser le code ci-dessous. Mais ça ne marche pas.
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 cela ne vous dérange pas, s'il vous plaît, corrigez mon code ci-dessus OR et donnez-moi un exemple correct. Comment partager mes images à partir du dossier drawable-hdpi
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"));
La solution proposée par superM a fonctionné longtemps pour moi, mais récemment, je l’ai testée sur la version 4.2 (HTC One) et elle n’a plus fonctionné là-bas. Je suis conscient que c'est une solution de contournement, mais c'est le seul qui a fonctionné pour moi avec tous les appareils et toutes les versions.
Selon la documentation, les développeurs sont invités à "utiliser le système MediaStore" pour envoyer du contenu binaire. Cela a toutefois l’avantage (ou moins) que le contenu multimédia sera sauvegardé de manière permanente sur le périphérique.
S'il s'agit d'une option pour vous, vous voudrez peut-être accorder l'autorisation WRITE_EXTERNAL_STORAGE
et utiliser le MediaStore à l'échelle du système.
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"));
Ajouter d'abord la permission
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
utiliser Bitmap de res
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"));
Testé via Bluetooth et d'autres messagers
Fonctionne comme un charme.
Pour ce faire, le moyen le plus simple consiste à utiliser le MediaStore pour stocker temporairement l'image que vous souhaitez partager:
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"));
Comment partager une image dans Android par programme, Parfois, vous souhaitez prendre un instantané de votre vue puis le partager alors suivez ces étapes: 1.Ajouter la permission au fichier mainfest
<uses-permission
Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
2.Tout d'abord, prenez une capture d'écran de votre vue, par exemple, il s'agit de ImageView, Textview, Framelayout, LinearLayout, etc.
Par exemple, vous avez une vue d'image pour prendre une capture d'écran appeler cette méthode dans oncreate ()
ImageView image= (ImageView)findViewById(R.id.iv_answer_circle);
///take a creenshot
screenShot(image);
après avoir pris la méthode de partage d'image de la capture d'écran d'appel soit sur le bouton
cliquez ou où vous voulez
shareBitmap(screenShot(image),"myimage");
Après la méthode create, définissez ces deux méthodes ##
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();
}
}
Le code simple et le plus simple que vous pouvez utiliser pour partager des images de la galerie.
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 );
Voici une solution qui a fonctionné pour moi. Un des pièges est que vous devez stocker les images dans un emplacement privé partagé ou non de l'application ( http://developer.Android.com/guide/topics/data/data-storage.html#InternalCache )
De nombreuses suggestions suggèrent de stocker dans l'emplacement de cache "privé" Apps
, mais ceci n'est bien sûr pas accessible via d'autres applications externes, y compris l'intention de fichier de partage générique utilisée. Lorsque vous essayez ceci, il s’exécutera, mais par exemple, Dropbox vous indiquera que le fichier n’est plus disponible.
/ * ÉTAPE 1 - Enregistrez le fichier bitmap localement à l’aide de la fonction de sauvegarde de fichier ci-dessous. * /
localAbsoluteFilePath = saveImageLocally(bitmapImage);
/ * ÉTAPE 2 - Partager le chemin de fichier absolu non privé avec l'intention de partage du fichier * /
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);
}
/ * ENREGISTRER FONCTION IMAGE * /
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();
}
/ * ÉTAPE 3 - Gestion du résultat de l’intention de fichier partagé. Besoin de fichier temporaire à distance, 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");
}
}
J'espère que cela aide quelqu'un.
J'étais fatigué de chercher différentes options pour partager une vue ou une image de mon application avec d'autres applications. Et finalement j'ai la solution.
Étape 1: Blocage de la gestion des intentions de partage. Cela fera apparaître votre fenêtre avec la liste des applications dans votre téléphone
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();
}
}
Étape 2: Conversion de votre vue en 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;
}
Étape 3 :
Pour obtenir l'URI à partir d'une image bitmap
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);
}
Je viens d'avoir le même problème.
Voici une réponse qui n’utilise pas de fichier explicite écrit dans votre code principal (laissant l’API la prendre en charge pour vous).
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"));
C’est le chemin ... il vous suffit d’ajouter vos identifiants d’image dans un objet Drawable . Dans mon cas (code ci-dessus), le dessin était extrait d’un ImageView.
La réponse SuperM a fonctionné pour moi mais avec Uri.fromFile () au lieu de Uri.parse ().
Avec Uri.parse (), cela ne fonctionnait qu'avec Whatsapp.
Ceci est mon code:
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mFile));
Sortie de Uri.parse ():
/storage/émulated/0/Android/data/package_application/Files/17072015_0927.jpg
Sortie de Uri.fromFile:
file: ///storage/emulated/0/Android/data/application_package/Files/17072015_0927.jpg
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.."));
essaye ça,
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"));
Une solution parfaite pour partager du texte et des images via Intent est:
Sur votre bouton de partage, cliquez sur:
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);
}
});
Ensuite, créez la méthode 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();
}
}
Et puis juste le tester .. !!
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"));
}
Toute la solution ci-dessus ne fonctionne pas pour moi dans Android Api 26 & 27 (Oreo)
, obtenait Error: exposed beyond app through ClipData.Item.getUri
. La solution qui correspond à ma situation était
FileProvider.getUriForFile(Context,packagename,File)
comme 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..."));
}
<provider>
dans votre Manifest.xml
comme<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>
resource
pour vos répertoires<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`
Tout d'abord , vous devez déclarer ce fournisseur de fichiers dans votre fichier AndroidManifest.xml
dans la balise <application>
:
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="com.appsuite.fileprovider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/fileprovider" />
</provider>
Deuxièmement , créez un fichier XML fileprovider.xml
dans le répertoire xml
:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path name="images" path="Pictures" />
</paths>
Enfin, codez par programme et partagez Uri avec votre application cible:
// -------------------------- Share Image -----------------------
private void shareImage() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, getShareUri());
startActivity(Intent.createChooser(intent, "Share image using"));
}
private Uri getShareUri(){
try {
File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "share_image_" + System.currentTimeMillis() + ".png");
if (file.createNewFile()) {
FileChannel source = new FileInputStream(currentFile).getChannel(); // currentFile After edit image current sate
FileChannel destination = new FileOutputStream(file).getChannel();
destination.transferFrom(source, 0, source.size());
source.close();
destination.close();
}
sharedFileUri = FileProvider.getUriForFile(this, "com.appsuite.fileprovider", file);
return sharedFileUri;
}catch (Exception e){
Log.e(TAG, "shareImage: error - " + e.getMessage(), e);
return null;
}
}
J'ai testé cela et ça fonctionne parfaitement d'API 19 à 28.