Compartilhar problema de intenção no feed do Instagram

8

Eu tenho um aplicativo que compartilha imagens do URL. Última atualização do Android, recebi a mensagem do instagram "Não é possível carregar a imagem" quando quero compartilhar uma imagem no feed do instagram.

Mas posso compartilhar histórias de imagens, mensagens diretas e todos os lugares ... Estou tendo esse problema apenas no 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
fonte
tente isso: share.setType ("image / jpeg");
Ali tem
@AliHas i have ("image / *)
jancooth em 22/03
Tendo o mesmo problema, alguma notícia?
mauriblint 24/03

Respostas:

3

Atualização: esse problema foi corrigido na versão do Instagram lançada no início desta semana. Soluções alternativas não são mais necessárias.


Nenhuma das soluções mencionadas acima funcionou para mim, pois parece que o compartilhamento direto via ContentProviderou seu derivado FileProviderfoi interrompido por uma alteração feita no aplicativo Instagram.

MediaStoreNotei que o compartilhamento de um conteúdo Uri ainda funciona, pois outros aplicativos, como o Google Fotos, que gravam no MediaStore antes do compartilhamento, ainda podiam compartilhar imagens para alimentar.

Você pode inserir uma imagem Fileda MediaStoreseguinte maneira:

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

Depois disso Uri, compartilhe via Intent da seguinte maneira:

    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
    }

Embora não seja o ideal, como a imagem é gravada no MediaStore, o que pode não ser o comportamento desejado em muitos casos, ela reativa a capacidade de compartilhar a médio prazo enquanto o Instagram corrige o seu grito.

MattMatt
fonte
1
vou esperar pela atualização do Instagram.
jancooth
1
Obrigado @MattMatt, vou tentar fazer o mesmo com Java, você sabe se é possível? Eu não sou desenvolvedor android / java há
mauriblint 26/03
1
De nada @mauriblint. Definitivamente, é possível fazer isso em Java; de fato, o compilador Kotlin cria código de bytes Java em tempo de construção, de qualquer maneira! Este Gist pode ser útil para você: gist.github.com/benny-shotvibe/1e0d745b7bc68a9c3256
MattMatt
1
Muito obrigado, @MattMatt! Eu poderia escrever a solução em Java seguindo o seu código Kotlin, muito apreciado. Estou lidando com esse problema há quase 7 dias
mauriblint
1
hey @MattMatt e o compartilhamento de vídeo? É necessário alterar algum valor-chave?
Choletski 29/03
1

seu uri é "content: //packagename/xxx.jpg", ele precisa ser "content: // media / external / images / media / ..."; será trabalhado.

lost000117
fonte
0

Ok, procurei e encontrei uma solução. Não sei se esse é o caminho certo, mas resolvi o meu problema ..

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

Solução encontrada nesta resposta.

jancooth
fonte
Eu tenho o mesmo erro, mesmo usando isso, confirme se ainda está trabalhando para você
Choletski
@Holetski, este não é o modo de liberação. Apenas para o modo de depuração.
jancooth 25/03
@jancooth Não está funcionando para mim, nem no modo de depuração. Você encontrou alguma solução para o modo de lançamento?
Gurgen Gevondov 25/03
@GurgenGevondov eu ainda estou procurando por t. Se você encontrou alguma solução, atualize-me.
jancooth 25/03
1
@jancooth Parece ser um problema do Instagram, porque nas versões mais antigas do Instagram apk tudo funciona bem
Gurgen Gevondov 25/03
0

Parece que o Facebook já possui o bug para esse problema: https://developers.facebook.com/support/bugs/1326888287510350/

Como solução temporária, você pode salvar a mídia no MediaStore. Esse é o método que usamos para armazenar e retornar a uri para o compartilhamento do 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
}
DaddyM
fonte