Chia sẻ vấn đề về ý định trong nguồn cấp dữ liệu Instagram


8

Tôi có một ứng dụng chia sẻ hình ảnh từ url. Cập nhật Android lần trước, tôi nhận được tin nhắn từ instagram "Không thể tải hình ảnh" khi tôi muốn chia sẻ một hình ảnh trong nguồn cấp dữ liệu instagram.

Nhưng tôi có thể chia sẻ câu chuyện hình ảnh, tin nhắn trực tiếp và ở mọi nơi ... Tôi chỉ gặp vấn đề này với nguồn cấp dữ liệu 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;
}

thử cái này: share.setType ("image / jpeg");
Ali có

@AliHas tôi có ("hình ảnh / *)
jancooth

Có cùng một vấn đề, bất kỳ tin tức?
mauriblint

Câu trả lời:



3

Cập nhật: Sự cố này đã được khắc phục trong phiên bản Instagram được phát hành vào đầu tuần này. Cách giải quyết không còn cần thiết.


Không có giải pháp nào được đề cập ở trên có hiệu quả với tôi, vì dường như việc chia sẻ trực tiếp thông qua ContentProviderhoặc phái sinh của nó FileProviderđã bị phá vỡ bởi một thay đổi được thực hiện trong ứng dụng Instagram.

Tôi đã nhận thấy rằng việc chia sẻ MediaStorenội dung mà Uri vẫn hoạt động, vì các ứng dụng khác như Google Photos viết lên MediaStore trước khi chia sẻ vẫn có thể chia sẻ hình ảnh để cung cấp.

Bạn có thể chèn một hình ảnh Filevào MediaStorenhư sau:

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

Sau đó Uri, bạn sẽ được trả lại, chia sẻ qua Ý định như sau:

    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
    }

Mặc dù nó không lý tưởng, vì hình ảnh sau đó được ghi vào MediaStore, có thể không phải là hành vi mong muốn trong nhiều trường hợp, nó cho phép khả năng chia sẻ trong trung hạn trong khi Instagram khắc phục sự cố của họ.


1
Tôi sẽ chờ cập nhật Instagram.
jancooth

1
Cảm ơn @MattMatt, tôi sẽ cố gắng làm tương tự với Java, bạn có biết nếu có thể không? Tôi không phải là nhà phát triển Android / java há
mauriblint

1
Bạn được chào đón @mauriblint. Chắc chắn có thể thực hiện điều này trong Java, trên thực tế, trình biên dịch Kotlin tạo mã byte Java trong thời gian xây dựng dưới mui xe! Gist này có thể hữu ích cho bạn: gist.github.com/benny-shotvibe/1e0d745b7bc68a9c3256
MattMatt

1
Cảm ơn rất nhiều, @MattMatt! Tôi có thể viết giải pháp bằng Java theo mã Kotlin của bạn, thực sự đánh giá cao, tôi đã xử lý vấn đề này trong gần 7 ngày
mauriblint

1
này @MattMatt những gì về chia sẻ video? Có bất kỳ giá trị quan trọng nào chúng ta cần thay đổi?
Choletski

1

uri của bạn là "content: //packagename/xxx.jpg", nó cần phải là "content: // media / bên ngoài / hình ảnh / media / ..."; nó sẽ được làm việc



0

Ok, tôi đã tìm kiếm và tìm thấy một giải pháp. Tôi không biết đây là cách đúng nhưng đã giải quyết được vấn đề của mình ..

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

Tìm thấy giải pháp trong câu trả lời này.


Tôi đã gặp lỗi tương tự ngay cả khi sử dụng điều này, vui lòng xác nhận nếu vẫn hoạt động cho bạn
Choletski

@Choletski, đây không phải là chế độ phát hành. Chỉ dành cho chế độ gỡ lỗi.
jancooth

@jancooth Nó không hoạt động đối với tôi ngay cả trong chế độ gỡ lỗi. Bạn đã tìm thấy bất kỳ giải pháp cho chế độ phát hành?
Gurgen Gevondov

@GurgenGevondov tôi vẫn đang tìm kiếm t. Nếu bạn tìm thấy bất kỳ giải pháp, xin vui lòng cập nhật cho tôi.
jancooth

1
@jancooth Đây có vẻ là một vấn đề của Instagram, vì với các phiên bản cũ hơn của apk Instagram, mọi thứ đều hoạt động tốt
Gurgen Gevondov

0

Có vẻ như Facebook đã có lỗi cho vấn đề này: https://developers.facebook.com/support/bugs/1326888287510350/

Như một giải pháp tạm thời, bạn có thể lưu phương tiện vào MediaStore. Đây là phương pháp chúng tôi sử dụng để lưu trữ và sau đó trả lại uri để chia sẻ trên 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
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.