Teilen Sie das Problem mit der Absicht im Instagram-Feed

8

Ich habe eine App, die Bilder von der URL teilt. Letztes Android-Update, ich habe die Nachricht von Instagram "Bild kann nicht geladen werden" erhalten, wenn ich ein Bild im Instagram-Feed freigeben möchte.

Aber ich kann Bildgeschichte, direkte Nachricht und überall teilen ... Ich habe dieses Problem nur Instagram-Feed.

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;
}
jancooth
quelle
Versuchen Sie Folgendes: share.setType ("image / jpeg");
Ali hat den
@AliHas ich habe ("image / *)
jancooth
Haben Sie das gleiche Problem, irgendwelche Neuigkeiten?
Mauriblint

Antworten:

3

Update: Dieses Problem wurde in der Version von Instagram behoben, die Anfang dieser Woche veröffentlicht wurde. Problemumgehungen sind nicht mehr erforderlich.


Keine der oben genannten Lösungen hat bei mir funktioniert, da das direkte Teilen über ContentProvideroder dessen Ableitung anscheinend FileProviderdurch eine Änderung in der Instagram-App unterbrochen wurde.

Ich habe festgestellt, dass das Teilen eines MediaStoreInhalts von Uri immer noch funktioniert, da andere Apps wie Google Fotos, die vor dem Teilen in den MediaStore schreiben, weiterhin Bilder für den Feed freigeben konnten.

Sie können ein Bild einfügen , Fileum das MediaStorewie folgt:

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

UriTeilen Sie dann mit dem, was Sie zurückgegeben haben, über Intent wie folgt:

    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
    }

Obwohl es nicht ideal ist, da das Bild dann in das geschrieben wird MediaStore, was in vielen Fällen möglicherweise nicht erwünscht ist, ermöglicht es die Möglichkeit, mittelfristig zu teilen, während Instagram ihren Whoopsie korrigiert.

MattMatt
quelle
1
Ich werde auf das Instagram-Update warten.
Jancooth
1
Danke @MattMatt, ich werde versuchen, dasselbe mit Java zu tun. Weißt du, ob es möglich ist? Ich bin kein Android / Java-Entwickler há
mauriblint
1
Gern geschehen @mauriblint. Es ist definitiv möglich, dies in Java zu tun. Tatsächlich erstellt der Kotlin-Compiler Java-Bytecode zum Zeitpunkt der Erstellung ohnehin unter der Haube! Dieser Gist könnte hilfreich sein für Sie: gist.github.com/benny-shotvibe/1e0d745b7bc68a9c3256
MattMatt
1
Vielen Dank, @MattMatt! Ich könnte die Lösung in Java nach Ihrem Kotlin-Code schreiben, sehr geschätzt, ich habe mich seit fast 7 Tagen mit diesem Problem befasst
mauriblint
1
hey @MattMatt was ist mit Video-Sharing? Gibt es Schlüsselwerte, die wir ändern müssen?
Choletski
1

Ihre URL lautet "content: //packagename/xxx.jpg". Sie muss "content: // media / external / images / media / ..." sein. es wird gearbeitet.

lost000117
quelle
0

Ok, ich habe gesucht und eine Lösung gefunden. Ich weiß nicht, ob dies der richtige Weg ist, aber ich habe mein Problem gelöst.

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

In dieser Antwort eine Lösung gefunden.

jancooth
quelle
Ich habe den gleichen Fehler auch bei dieser Funktion erhalten. Bitte bestätigen Sie, ob Sie noch für Sie arbeiten
Choletski
@Choletski, dies ist nicht für den Release-Modus. Nur für den Debug-Modus.
Jancooth
@jancooth Es funktioniert bei mir nicht einmal im Debug-Modus. Haben Sie eine Lösung für den Release-Modus gefunden?
Gurgen Gevondov
@GurgenGevondov Ich suche immer noch nach t. Wenn Sie eine Lösung gefunden haben, aktualisieren Sie mich bitte.
Januar
1
@jancooth Es scheint ein Instagram-Problem zu sein, denn mit älteren Versionen von Instagram apk funktioniert alles
einwandfrei
0

Facebook hat anscheinend bereits den Fehler für dieses Problem: https://developers.facebook.com/support/bugs/1326888287510350/

Als vorübergehende Problemumgehung können Sie Medien im MediaStore speichern. Dies ist die Methode, mit der wir die URL für die Instagram-Freigabe speichern und dann zurückgeben.

    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
}
DaddyM
quelle