Instagramフィードで意図の問題を共有する


8

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

これを試してください:share.setType( "image / jpeg");
アリは

@AliHas i have( "image / *)
jancooth

同じ問題、何かニュースがありますか?
mauriblint

回答:



3

更新: この問題は、今週初めにリリースされたInstagramのバージョンで修正されました。回避策は不要になりました。


上記の解決策はどれも私にとってはうまくContentProviderいきませんFileProviderでした。Instagramアプリ内で行われた変更によって、直接の共有またはその派生物が壊れたようです。

共有するMediaStore前にMediaStoreに書き込むGoogleフォトなどの他のアプリでも画像を共有してフィードに送信できるため、コンテンツUriの共有は引き続き機能することに気付きました。

次のように画像Fileをに挿入できMediaStoreます。

@SuppressLint("InlinedApi")
fun insertImageToMediaStore(file: File, relativePath: String): Uri? {

    val values = ContentValues().apply {
        put(MediaStore.Images.Media.DISPLAY_NAME, file.name)

        val mimeType = when (file.extension) {
            "jpg", "jpeg" -> "jpeg"
            "png" -> "png"
            else -> return null
        }

        put(MediaStore.Images.Media.MIME_TYPE, "image/$mimeType")

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            put(MediaStore.MediaColumns.RELATIVE_PATH, relativePath)
            put(MediaStore.MediaColumns.IS_PENDING, 1)
        }
    }

    val collection = when (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        true -> MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL)
        false -> MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    }

    val uri = contentResolver.insert(collection, values)

    uri?.let {
        contentResolver.openOutputStream(uri)?.use { outputStream ->
            try {
                outputStream.write(file.readBytes())
                outputStream.close()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }


        values.clear()

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            values.put(MediaStore.Images.Media.IS_PENDING, 0)
            contentResolver.update(uri, values, null, null)
        }

    } ?: throw RuntimeException("MediaStore failed for some reason")

    return uri
}

次に、Uri返されたものを使用して、次のようにIntentで共有します。

    val filePath = "/data/data/io.jammy.withintent/files/IMG-20200321_093350_2020-122758.jpg" // this is an example path from an app-internal image file

    val context: Context? = this
    val intent = Intent(Intent.ACTION_SEND)
    intent.type = "image/*"

    insertImageToMediaStore(File(filePath), "Pictures/Your Subdirectory")?.let { uri ->

        val clipData = ClipData.newRawUri("Image", uri)

        intent.clipData = clipData
        intent.putExtra(Intent.EXTRA_STREAM, uri)

        val target = Intent.createChooser(intent, "Share Image")
        target?.let { context?.startActivity(it) }

    } ?: run {
        Log.e(TAG, "Unsupported image file")
        return
    }

これは理想的ではMediaStoreありませんが、画像はに書き込まれるため、多くの場合望ましい動作ではない可能性がありますが、Instagramが中途半端に共有する機能を再び有効にする一方で、Instagramはうわさを修正します。


1
Instagramの更新を待ちます。
jancooth

1
@MattMattに感謝します。Javaでも同じことをしようとしますが、可能かどうか知っていますか?私はandroid / java開発者ではありません
mauriblint

1
@mauriblintをご利用いただけます。これをJavaで行うことは間違いなく可能です。実際、Kotlinコンパイラはビルド時に内部的にJavaバイトコードを作成します。このGistが役立つかもしれません:gist.github.com/benny-shotvibe/1e0d745b7bc68a9c3256
MattMatt

1
@MattMatt、ありがとうございました!私はあなたのKotlinコードに従ってJavaでソリューションを書くことができました。本当に感謝しています。この問題にほぼ7日間
取り組んできました

1
ね@ @MattMattビデオ共有はどう?変更する必要がある重要な値はありますか?
Choletski

1

URIは「content://packagename/xxx.jpg」です。「content:// media / external / images / media / ...」である必要があります。動作します。



0

さて、私は検索して解決策を見つけました。これが正しい方法かわかりませんが、問題は解決しました。

StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());

この回答で解決策が見つかりました。


これを使用しても同じエラーが発生します。まだ機能するかどうか確認してください
Choletski

@Choletski、これはリリースモード用ではありません。デバッグモード専用です。
jancooth

@jancoothデバッグモードでも動作しません。リリースモードの解決策はありましたか?
Gurgen Gevondov

@GurgenGevondov私はまだtを探しています。解決策を見つけた場合は、更新してください。
jancooth

1
@jancooth古いバージョンのInstagram
APKでは

0

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.