URLの画像を共有するアプリがあります。最後のAndroid更新、Instagramフィードで画像を共有したいときに、Instagramから「画像を読み込めません」というメッセージが表示されました。
ただし、イメージストーリー、ダイレクトメッセージなど、どこでも共有できます...この問題が発生するのは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;
}
uRIは「content://packagename/xxx.jpg」です。「content:// media/external/images/media/...」である必要があります。それは動作します。
さて、私は検索して解決策を見つけました。これが正しい方法かどうかはわかりませんが、問題は解決しました。
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
Facebookには既にこの問題のバグがあるようです: https://developers.facebook.com/support/bugs/1326888287510350/
一時的な回避策として、メディアをMediaStoreに保存できます。これは、Instagram共有のURIを格納して返すために使用するメソッドです。
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
}