如何在安卓系统中将图片链接分享到 WhatsApp?

3
我需要在我的应用中分享一张图片到 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 sharing image doesn't work。但对我来说没有用。请告诉我如何共享图像URL。
6个回答

1

首先,您需要在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();
 }  

我该如何分享任何类型的文件而不是图片? - KJEjava48

1

看看这个答案:

如何在Android上共享设置为ImageView的图像的方法

顺便问一下,我不明白为什么要使用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();
                }

嗨penta,分享消息很好用。但是图片链接不起作用...如果您已经解决了这个问题,请分享一下图片分享代码。 - rams
你想直接分享图片而不是分享图片的URL吗? - penta
立即检查,直接使用答案中的代码,如果不起作用,请转到链接。 - penta
抱歉,我在回答中使用了URI,我已经将其删除,请现在使用代码。 - penta
嗨,我需要通过WhatsApp分享图片,为此我有图片URL。 - rams
显示剩余3条评论

0
尝试更改这一行。
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

请告诉我它是否对您有效。


嗨,lavekush,在那行代码中,Uri.fromFile() 方法需要传入文件而不是图片的 URL。 - rams
我并不是从你那里抄袭的,我是参考了这个链接:https://dev59.com/BHfZa4cB1Zd3GeqPWtmo。但你比我发的更快,无论如何,我已经删除了我的回答。 - sasikumar

0

使用以下代码:

   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);
                    }

下载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);
    }
}

1
请提供解释,不要仅仅写代码。请参考如何回答问题 - Sumanth Shastry
@Vinesh Chauhan 有没有可能将一个http url(即远程文件)发送到WhatsApp或任何可共享的媒体上? - KJEjava48
@KJEjava48,实际上,如果您在WhatsApp中分享URL,则只会共享URL。 如果您希望将远程文件发送到WhatsApp intent,则必须先下载该文件。 - Vinesh Chauhan

0

0

通过使用这个功能,您可以在WhatsApp上发送文本和URL链接。

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" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接