J'ai une application qui partage des images depuis l'URL. Last Android update, j'ai reçu un message d'Instagram "Impossible de charger l'image" lorsque je veux partager une image dans le flux instagram.
Mais je peux partager une histoire d'image, un message direct et partout ... Je n'ai ce problème que sur le flux instagram.
public void onShareItemOreo() {
// Get access to bitmap image from view
imageView = (ImageView) findViewById(R.id.thumbnail);
// Get access to the URI for the bitmap
Uri bmpUri = prepareShareIntent(imageView);
if (bmpUri != null) {
//outfile is the path of the image stored in the gallery
// Construct a ShareIntent with link to image
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
shareIntent.setData(bmpUri);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_TEXT,marketLink);
// Launch sharing dialog for image
startActivity(Intent.createChooser(shareIntent, "Share Image"));
} else {
//
}
}
public Uri prepareShareIntent(ImageView imageView) {
// Fetch Bitmap Uri locally
Drawable drawable = imageView.getDrawable();
Bitmap bmp = null;
if (drawable instanceof BitmapDrawable){
bmp = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
} else {
return null;
}
Uri bmpUri = getBitmapFromDrawable(bmp);// see previous remote images section and notes for API > 23
// Construct share intent as described above based on bitmap
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
shareIntent.setType("image/*");
return bmpUri;
}
votre uri est "content: //packagename/xxx.jpg", il doit être "content: // media/external/images/media/..."; cela fonctionnera.
Ok, j'ai cherché et trouvé une solution. Je ne sais pas que c'est la bonne manière mais a résolu mon problème ..
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
On dirait que Facebook a déjà le bogue pour ce problème: https://developers.facebook.com/support/bugs/1326888287510350/
En guise de solution temporaire, vous pouvez enregistrer le média sur MediaStore. C'est la méthode que nous utilisons pour stocker puis renvoyer l'URI pour le partage Instagram.
private fun insertImageToMediaStore(file: File): Uri? {
val fileUri = FileProvider.getUriForFile(
context,
"${context.applicationContext.packageName}.provider",
file
)
val mimeType = context.contentResolver.getType(fileUri) ?: "image/*"
val isImage = mimeType.contains("image")
val values = ContentValues().apply {
put(
if (isImage) {
MediaStore.Images.Media.DISPLAY_NAME
} else {
MediaStore.Video.Media.DISPLAY_NAME
},
file.name
)
put(
if (isImage) {
MediaStore.Images.Media.MIME_TYPE
} else {
MediaStore.Video.Media.MIME_TYPE
},
mimeType
)
}
val collection = if (isImage) {
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
} else {
MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}
val uri = context.contentResolver.insert(collection, values)
uri?.let {
context.contentResolver.openOutputStream(uri)?.use { outputStream ->
try {
outputStream.write(file.readBytes())
outputStream.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
values.clear()
} ?: throw RuntimeException("MediaStore failed for some reason")
return uri
}