当前位置: 首页 > 知识库问答 >
问题:

Instagram feed中的共享意图问题

麹浩瀚
2023-03-14

我有一个分享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;
}

共有3个答案

左丘曦
2023-03-14

你的uri是“content://packagename/xxx.jpg“,它必须是”content://media/external/images/media/...“它会成功的。”。

袁秦迟
2023-03-14

Facebook正在处理这个bug,我们等等!订阅以接收此错误报告的更新通知。https://developers.facebook.com/support/bugs/1326888287510350/

农建弼
2023-03-14

更新:本周早些时候发布的Instagram版本修复了这个问题。解决办法不再必要。

上面提到的所有解决方案都不适用于我,因为Instagram应用程序中的一项更改似乎打破了通过ContentProvider或其衍生产品FileProvider直接共享的局面。

我确实注意到共享MediaStore内容Uri仍然有效,因为在共享之前写入MediaStore的其他应用程序(如Google Photos)仍然能够共享要馈送的图像。

您可以将图像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修复了他们的狂欢。

 类似资料:
  • 在这里,我共享图像意图。图像在一个可绘制的文件夹中。给出这个: 代码:

  • 我使用这个代码,但它不能正常工作。 当我使用text类型时,它可以正常工作。 但是我想共享一个文本和一个图像。 而共享的意图在Facebook中不起作用。

  • 如何与ShareActionProvider共享drawable文件夹中的图像?我已经证明了很多事情,但它不起作用。 本例中的uri是什么?Uri=Uri。解析(“android。resource://com.android.example/“R.drawable.photo);不起作用。 非常感谢。

  • 问题内容: 这是我的代码,但这是针对单个文件的解决方案。 我可以像下面的单个文件一样共享多个文件和上载吗? 问题答案: 是的,但是您需要使用而不是。 这绝对可以简化,但我在其中保留了一些内容,以便您可以分解所需的每个步骤。 更新 :从API 24开始,共享文件URI将导致FileUriExposedException。为了解决这个问题,您可以将compileSdkVersion切换为23或更低版本

  • 我正在尝试分享音频(.mp3)从第三个应用程序到我的android应用程序。当我接收到音频并获得意图信息(Uri soundUri=(Uri)intent.GetParcelableExtra(intent.Extra_Stream))时,Uri有错误的数据。路径正确,但文件名已用数字(例如5348)重命名,没有扩展名,实际文件名为Audio-6151616.mp3 因此,完整路径是/storag

  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)