не удалось поделиться, повторите попытку (только в WhatsApp)

когда я делюсь контентом в WhatsApp, он возвращается на страницу общего доступа со всплывающим уведомлением «Не удалось поделиться, повторите попытку».

мой код

if (url.startsWith("share://")) {
            Uri requestUrl = Uri.parse(url);
            String pContent = requestUrl.toString().split("share://")[1];
            Toast toast=Toast.makeText(getApplicationContext(),pContent, Toast.LENGTH_LONG);
            toast.setMargin(50,50);
            toast.show();
            StringBuilder sb = new StringBuilder();
            String [] parts = pContent.split("<br />");
            for (int i = 0; i < parts.length; i++) {
                String part = parts[i];
                sb.append(part);
                sb.append('\n');
            }
            Intent share = new Intent();
            share.setAction(Intent.ACTION_SEND);
            share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            share.putExtra(android.content.Intent.EXTRA_TEXT, (Serializable) sb);
            share.setType("*/*");
            try {
            startActivity(Intent.createChooser(share, "Share On"));
            } catch (android.content.ActivityNotFoundException ex) {
                toast = Toast.makeText(getApplicationContext(), "whatsapp not installed", Toast.LENGTH_LONG);
                toast.setMargin(50,50);
                toast.show();
            }
            return true;

и мой логкэт

08-01 14:37:42.081 1472-1514/com.example.myactivity I/MaliEGL: [Mali]window_type=1, is_framebuffer=0, errnum = 0
08-01 14:37:42.081 1472-1514/com.example.myactivity I/MaliEGL: [Mali]surface->num_buffers=4, surface->num_frames=3, win_min_undequeued=1
08-01 14:37:42.081 1472-1514/com.example.myactivity I/MaliEGL: [Mali]max_allowed_dequeued_buffers=3

person Shubham    schedule 01.08.2016    source источник
comment
за исключением WhatsApp, он работает для других приложений, таких как видеовстреча, почта, поход, текст и т. д., мой SDK для компиляции и целевой SDK - 23, я тестирую на физическом устройстве android one   -  person Shubham    schedule 01.08.2016
comment
Привет, Гарри, какое-нибудь решение на данный момент?   -  person Rishabh Bhatia    schedule 28.10.2016
comment
привет @RishabhBhatia, у меня есть решение, и оно сработало для меня, просто перейдите по этой ссылке stackoverflow.com/a/38697846/5753575   -  person Shubham    schedule 02.11.2016
comment
В моем случае я использовал НЕПРАВИЛЬНЫЙ пример кода намерения.setType(plain/text); вместо этого намерение.setType(текст/обычный); [см. также] (faq.whatsapp.com/en/android/28000012)   -  person Style-7    schedule 01.02.2019


Ответы (4)


Была та же проблема - решение заключалось в определении типа MIME: при попытке поделиться намерением с текстом и прикрепленным изображением параметр sharingIntent.setType("*/*") работал нормально, но не работал при обмене только текстом, как описано выше.

Решение: если вы делитесь ТОЛЬКО текстом, установите sharingIntent.setType("text/plain")

public void sendShareToWhatsAppIntent() {

    //setup intent:
    Intent sharingIntent = new Intent(Intent.ACTION_SEND);

    //setup image extra, if exists:
    Bitmap picBitmap = getMyBitmap();
    if (picBitmap != null) {
        String url = MediaStore.Images.Media.insertImage(context.getContentResolver(), picBitmap, "", "");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url));
        sharingIntent.setType("*/*");
    } else {
    //if no picture, just text set - this MIME
        sharingIntent.setType("text/plain");
    }

    //setup sharing message
    String message = "My Message - hey whatsapp!"

    sharingIntent.putExtra(Intent.EXTRA_TEXT, message.toString());

   //target WhatsApp:
   sharingIntent.setPackage("com.whatsapp");


    if (sharingIntent.resolveActivity(context.getPackageManager()) != null) {
        startActivity(sharingIntent);
    } else {
        Log.w(TAG, "sendShareIntent: cant resolve intent");
        Toast.makeText(context, "whatsapp not installed", Toast.LENGTH_SHORT).show();
    }

}
person Mardann    schedule 16.02.2017

share.setType("text/plain"); и повторите попытку

person Nikul Vaghani    schedule 13.05.2018
comment
Хотя это ответ, он поможет объяснить, почему вы считаете, что это решение проблемы. - person Gert Arnold; 13.05.2018
comment
потому что я столкнулся с той же проблемой, которая решается простым добавлением settype(text/plain) - person Nikul Vaghani; 29.08.2018

Есть мой подход.

private fun openShareDialog(iC: Context, //
                            iPath: String)
{
    MediaScannerConnection.scanFile( //
            iC.applicationContext, //
            arrayOf(iPath), null //
    ) { _, iUri ->
        var shareIntent = Intent(Intent.ACTION_SEND).apply {
            putExtra(Intent.EXTRA_STREAM, iUri)
            type = "image/*"
            addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            putExtra(Intent.EXTRA_TEXT, iC.getString(R.string.screenshot_sharing_text))
        }

        shareIntent = Intent.createChooser(shareIntent, iC.resources.getText(R.string.send_to)) //
                .apply {
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                }

        iC.startActivity(shareIntent)
    }
}

Это применимо для обмена изображениями, а также для обмена видео (только не забудьте изменить type на (например) video/*.

Если вам нужно использовать общий доступ как Pending Intent (например, как кнопку действия в уведомлении), вы можете использовать этот класс

Это применимо

class ShareScreenshotService : IntentService(SHARE_VIDEO_RECORD_SERVICE)
{
    override fun onCreate()
    {
        super.onCreate()
        startService(Intent(this, ShareScreenshotService::class.java))
    }

    override fun onHandleIntent(intent: Intent?)
    {
        if (intent != //
            null && intent.hasExtra(EXTRA_SHARE_VIDEO_RECORD_PATH))
        {
            val path = intent.getStringExtra(EXTRA_SHARE_VIDEO_RECORD_PATH)
            Logger.log(Log.ERROR, TAG, path!!)

            openShareDialog(this, path)

            PushNotificationManager.getInstance(this).getVideoRecordingNotificator(this).closeNotification()
        }
    }

    private fun openShareDialog(iC: Context, //
                                iPath: String)
    {
        MediaScannerConnection.scanFile( //
                iC.applicationContext, //
                arrayOf(iPath), null //
        ) { _, iUri ->
            var shareIntent = Intent(Intent.ACTION_SEND).apply {
                putExtra(Intent.EXTRA_STREAM, iUri)
                type = "image/*"
                addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                putExtra(Intent.EXTRA_TEXT, iC.getString(R.string._screenshot_sharing_text))
            }

            shareIntent = Intent.createChooser(shareIntent, iC.resources.getText(R.string._send_to)) //
                    .apply {
                        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    }

            iC.startActivity(shareIntent)
        }
    }

    companion object
    {
        private val TAG = ShareScreenshotService::class.java.simpleName
        private const val SHARE_VIDEO_RECORD_SERVICE_REQUEST_CODE = 3

        const val EXTRA_SHARE_VIDEO_RECORD_PATH = "_extra_share_video_record_path"
        const val SHARE_VIDEO_RECORD_SERVICE = "_share_video_record_service"

        @JvmStatic
        fun pendingIntent(context: Context, //
                          iPath: String): PendingIntent
        {
            val intent = Intent(context, ShareScreenshotService::class.java)
            intent.putExtra(EXTRA_SHARE_VIDEO_RECORD_PATH, iPath)

            return PendingIntent.getService( //
                    context, //
                    SHARE_VIDEO_RECORD_SERVICE_REQUEST_CODE, //
                    intent, //
                    PendingIntent.FLAG_UPDATE_CURRENT //
            )
        }
    }
}

Применение

NotificatonBuilder.addAction(R.drawable.ic_share, iC.getString(R.string.share), ShareScreenshotService.pendingIntent(iC, iImagePath))

Также не забудьте добавить Service к Manifest file

person Aleksey Timoshchenko    schedule 01.09.2019

На моей стороне он отлично работает на устройствах Android 6.0 ниже. Я столкнулся с этой проблемой на Android 6.0. И проблема была просто «Разрешение на внешнее хранилище не было предоставлено пользователем». Теперь проверьте разрешение на внешнее хранилище, прежде чем инициировать намерение совместного использования ...

person Ali Sabir    schedule 19.01.2017