Как отправить URL-адрес изображения в WhatsApp на Android?

Мне нужно поделиться изображением с WhatsApp в моем приложении. У меня есть URL-адрес изображения. Для отправки в WhatsApp я использую следующий код.

String image_url = "http://images.cartradeexchange.com//img//800//vehicle//Honda_Brio_562672_5995_6_1438153637072.jpg";

URI uri = null;
try {
    uri = new URI(image_url.toString());
} catch (URISyntaxException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
Log.e("uri=", "" + uri);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/jpg");

// Target whatsapp:
shareIntent.setPackage("com.whatsapp");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

try {
    startActivity(shareIntent);
} catch (android.content.ActivityNotFoundException ex) {
    Toast.makeText(InventoryManageOnlineActivity.this,
            "Whatsapp have not been installed.",
            Toast.LENGTH_SHORT).show();
}

Но это не сработало. Я получаю следующую ошибку.

08-26 11:57:34.674: W/Bundle(19447): Key android.intent.extra.STREAM expected Parcelable but value was a java.net.URI.  The default value <null> was returned.
08-26 11:57:34.738: W/Bundle(19447): Attempt to cast generated internal exception:
08-26 11:57:34.738: W/Bundle(19447): java.lang.ClassCastException: java.net.URI cannot be cast to android.os.Parcelable
08-26 11:57:34.738: W/Bundle(19447):    at android.os.Bundle.getParcelable(Bundle.java:810)
08-26 11:57:34.738: W/Bundle(19447):    at android.content.Intent.getParcelableExtra(Intent.java:4850)
08-26 11:57:34.738: W/Bundle(19447):    at android.content.Intent.migrateExtraStreamToClipData(Intent.java:7548)
08-26 11:57:34.738: W/Bundle(19447):    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1545)
08-26 11:57:34.738: W/Bundle(19447):    at android.app.Activity.startActivityForResult(Activity.java:3746)
08-26 11:57:34.738: W/Bundle(19447):    at android.app.Activity.startActivityForResult(Activity.java:3707)
08-26 11:57:34.738: W/Bundle(19447):    at android.app.Activity.startActivity(Activity.java:4027)
08-26 11:57:34.738: W/Bundle(19447):    at android.app.Activity.startActivity(Activity.java:3989)
08-26 11:57:34.738: W/Bundle(19447):    at com.cartradrexchange.inventory.InventoryManageOnlineActivity$ManageOnlineAdapter.onClick(InventoryManageOnlineActivity.java:441)
08-26 11:57:34.738: W/Bundle(19447):    at android.view.View.performClick(View.java:4761)
08-26 11:57:34.738: W/Bundle(19447):    at android.view.View$PerformClick.run(View.java:19767)
08-26 11:57:34.738: W/Bundle(19447):    at android.os.Handler.handleCallback(Handler.java:739)
08-26 11:57:34.738: W/Bundle(19447):    at android.os.Handler.dispatchMessage(Handler.java:95)
08-26 11:57:34.738: W/Bundle(19447):    at android.os.Looper.loop(Looper.java:135)
08-26 11:57:34.738: W/Bundle(19447):    at android.app.ActivityThread.main(ActivityThread.java:5312)
08-26 11:57:34.738: W/Bundle(19447):    at java.lang.reflect.Method.invoke(Native Method)
08-26 11:57:34.738: W/Bundle(19447):    at java.lang.reflect.Method.invoke(Method.java:372)
08-26 11:57:34.738: W/Bundle(19447):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
08-26 11:57:34.738: W/Bundle(19447):    at com.android.internal.os.ZygoteInit.main(Zygote

Для этого я много искал в Google и перешел по указанному ниже URL-адресу.

Обмен изображениями Android не работает.

Но мне это не полезно. Пожалуйста, покажите мне, как обмениваться URL-адресами изображений.


person rams    schedule 26.08.2015    source источник


Ответы (5)


Проверьте этот ответ

Как поделиться изображением в приложении Whats, которое установлено в ImageView в Android.

Кстати, я не понимаю, почему ты делаешь image_url.toString()? Это уже в строке, верно?

И попробуйте этот код также.

String image_url = "http://images.cartradeexchange.com//img//800//vehicle//Honda_Brio_562672_5995_6_1438153637072.jpg";

        Intent shareIntent = new Intent();
        shareIntent.setType("image/*");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        shareIntent.setAction(Intent.ACTION_SEND);
        //without the below line intent will show error
        shareIntent.setType("text/plain");
        shareIntent.putExtra(Intent.EXTRA_TEXT, image_url);
                // Target whatsapp:
        shareIntent.setPackage("com.whatsapp");
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

                try {
                    startActivity(shareIntent);
                } catch (android.content.ActivityNotFoundException ex) {
                    Toast.makeText(InventoryManageOnlineActivity.this,
                            "Whatsapp have not been installed.",
                            Toast.LENGTH_SHORT).show();
                }
person penta    schedule 26.08.2015
comment
Привет пента, обмен сообщениями работает нормально. но URL-адрес изображения не работает. Если вы работали над этим, поделитесь этим кодом обмена изображениями. - person rams; 26.08.2015
comment
Вы хотели бы напрямую поделиться изображением вместо того, чтобы делиться URL-адресом изображения? - person penta; 26.08.2015
comment
проверьте сейчас, используйте код прямо из ответа, если это не сработает, перейдите по ссылке - person penta; 26.08.2015
comment
извините, я использовал uri в ответе, я удалил его, используйте код сейчас - person penta; 26.08.2015
comment
привет .. мне нужно поделиться изображением через WhatsApp, для этого у меня есть URL изображения - person rams; 26.08.2015
comment
Давайте продолжим обсуждение в чате. - person rams; 26.08.2015
comment
код не работает для меня я получил этот обмен не удалось повторить попытку позже. - person nirav kalola; 31.03.2017

Попробуйте изменить эту строку

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, url);

этим

sharingIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(image_url )); 
// Use direct image url instead of uri

дайте мне знать, если это работает для вас.

person Lavekush Agrawal    schedule 26.08.2015
comment
Привет, лавекуш, в этой строке метод Uri.fromFile() принимает файл, а не URL-адрес изображения - person rams; 26.08.2015
comment
я не копирую с вашего. /questions/19306417/ .... но вы пишете быстрее ... в любом случае я удаляю свой ответ - person sasikumar; 26.08.2015

С помощью этого вы можете текст и URL на WhatsApp.

sendIntent.setPackage("com.whatsapp");

Используйте только сообщения общего доступа в WhatsApp, где вы можете выбрать контакты, которым вы хотите поделиться.

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "http://images.cartradeexchange.com//img//800//vehicle//Honda_Brio_562672_5995_6_1438153637072.jpg");
 sendIntent.setType("text/plain");
 sendIntent.setPackage("com.whatsapp");
 startActivity(sendIntent);

Добавить разрешение на доступ в Интернет в манифест также

<uses-permission android:name="android.permission.INTERNET" />
person Deepak Gupta    schedule 01.09.2015

Используйте приведенный ниже код: -

   whatsapp.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent1 = c.getPackageManager().getLaunchIntentForPackage("com.whatsapp");
                    if(intent1!=null)
                    {
                        Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
                        whatsappIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        whatsappIntent.setType("image/*");
                        whatsappIntent.setPackage("com.whatsapp");
                        String url = Spacecraft.new_image_array.get(position);
                        new Download_GIF(url).execute();
                        Uri imageUri = Uri.parse("file:///storage/emulated/0/downloadedFile.gif");
                        whatsappIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
                        c.startActivity(whatsappIntent);
                    }

Класс Download_GIF.

public class Download_GIF extends AsyncTask<String, Void, String> {
    static String url_image=null;

    public Download_GIF(String url) {
        this.url_image = url;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {

        String filepath = null;
        try {
            //set the download URL, a url that points to a file on the internet
            //this is the file to be downloaded
            URL url = new URL(url_image);
            //create the new connection
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

            //set up some things on the connection
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoOutput(true);
            //and connect!
            urlConnection.connect();
            //set the path where we want to save the file
            //in this case, going to save it on the root directory of the
            //sd card.
            File SDCardRoot = Environment.getExternalStorageDirectory();
            //create a new file, specifying the path, and the filename
            //which we want to save the file as.

            String filename = "downloadedFile.gif";   // you can download to any type of file ex:.jpeg (image) ,.txt(text file),.mp3 (audio file)
            Log.i("Local filename:", "" + filename);
            File file;
            file = new File(SDCardRoot, filename);
            if (file.createNewFile()) {
                file.createNewFile();
            }

            //this will be used to write the downloaded data into the file we created
            FileOutputStream fileOutput = new FileOutputStream(file);

            //this will be used in reading the data from the internet
            InputStream inputStream = urlConnection.getInputStream();

            //this is the total size of the file
            int totalSize = urlConnection.getContentLength();
            //variable to store total downloaded bytes
            int downloadedSize = 0;

            //create a buffer...
            byte[] buffer = new byte[1024];
            int bufferLength = 0; //used to store a temporary size of the buffer

            //now, read through the input buffer and write the contents to the file
            while ((bufferLength = inputStream.read(buffer)) > 0) {
                //add the data in the buffer to the file in the file output stream (the file on the sd card
                fileOutput.write(buffer, 0, bufferLength);
                //add up the size so we know how much is downloaded
                downloadedSize += bufferLength;
                //this is where you would do something to report the prgress, like this maybe
                Log.i("Progress:", "downloadedSize:" + downloadedSize + "totalSize:" + totalSize);

            }
            //close the output stream when done
            fileOutput.close();
            if (downloadedSize == totalSize) filepath = file.getPath();

            //catch some possible errors...
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            filepath = null;
            e.printStackTrace();
        }
        Log.i("filepath:", " " + filepath);

        return filepath;


    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}
person Vinesh Chauhan    schedule 08.08.2017
comment
Пожалуйста, не пишите только код. Дайте также объяснение. Узнайте, как ответить. - person Sumanth Shastry; 08.08.2017

Сначала вам нужно загрузить изображение в glide, после чего вы сможете поделиться им где угодно.

Код для загрузки изображения из glide (изображение сохраняется в хранилище, вы можете удалить его позже)

Glide.with(getApplicationContext())
                    .load(imagelink)   \\link of your image file (url)
                    .asBitmap().skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
                    .into(new SimpleTarget<Bitmap>(250, 250) {@Override
                     public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {


                    Intent intent = new Intent(Intent.ACTION_SEND);
                    intent.putExtra(Intent.EXTRA_TEXT, "Hey view/download this image");
                    String path = MediaStore.Images.Media.insertImage(getContentResolver(), resource, "", null);
                    Log.i("quoteswahttodo", "is onresoursereddy" + path);
                    Uri screenshotUri = Uri.parse(path);
                    Log.i("quoteswahttodo", "is onresoursereddy" + screenshotUri);
                    intent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
                    intent.setType("image/*");
                    startActivity(Intent.createChooser(intent, "Share image via..."));  // if you want to share with whatsapp only replace with below code 
                }
                @Override public void onLoadFailed(Exception e, Drawable errorDrawable) {
                            Toast.makeText(getApplicationContext(), "Something went wrong", Toast.LENGTH_SHORT).show();


                            super.onLoadFailed(e, errorDrawable);
                        }

                @Override public void onLoadStarted(Drawable placeholder) {
                            Toast.makeText(getApplicationContext(), "Starting", Toast.LENGTH_SHORT).show();
                            super.onLoadStarted(placeholder);
               }
});

Здесь заменить на WhatsApp:

 sendd.setPackage("com.whatsapp");
 try {
         startActivity(sendd);
 } catch (Exception e) {
         Toast.makeText(FinishedDoing.this, "It seem like Whatsapp is not been installed", Toast.LENGTH_SHORT).show();
                e.printStackTrace();
 }  
person ashad    schedule 17.10.2018