无法将图像发送到其他应用程序,尝试远足、Messenger 和 Whatsapp

Posted

技术标签:

【中文标题】无法将图像发送到其他应用程序,尝试远足、Messenger 和 Whatsapp【英文标题】:Unable to send images to other apps, tried hike, Messenger and Whatsapp 【发布时间】:2016-03-18 09:23:33 【问题描述】:

我正在尝试将图像从我的应用程序共享到其他应用程序(Hike、Facebook、Messenger 等),但每次我都遇到不同的错误。几乎每一个问答都进行了,但问题还没有解决。

这是我的代码

                       filepath = Environment.getExternalStorageDirectory();
                       cacheDir = new File(filepath.getAbsolutePath()
                       + "/LikeIT/");
                       cacheDir.mkdirs();
                       Intent intent = new Intent();
                       intent.setType("image/jpeg");
                       intent.setAction(Intent.ACTION_SEND);

                       intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(cacheDir
                                       .getAbsolutePath())));
                       intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

                       activity.startActivity(intent);

我已多次更改以下行,但没有得到解决方案:

    intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(cacheDir
                                       .getAbsolutePath())));       

我已将其更改为

  1.  intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse(str1));
  2.  intent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.fromFile(file1);

但没有得到所需。而且,当我将图像发送到 Whatsapp 时,它没有显示图像,发送后它正在显示。

【问题讨论】:

您遇到什么问题?您尝试过我的回答吗? 【参考方案1】:

试试下面在我的应用中运行良好的代码

public void onShareItem(View v) 
        // Get access to bitmap image from view

        // Get access to the URI for the bitmap
        Uri bmpUri = getLocalBitmapUri(descpic);
        if (bmpUri != null) 
            // Construct a ShareIntent with link to image
            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.putExtra(Intent.EXTRA_STREAM, bmpUri);
            shareIntent.putExtra(Intent.EXTRA_TEXT, desc.getText().toString());
            shareIntent.setType("image/*");
            // Launch sharing dialog for image
            startActivity(Intent.createChooser(shareIntent, "Share Image"));
         else 
            // ...sharing failed, handle error
            Log.e("check for intent", "Couldn't get anything");
        
    

    // Returns the URI path to the Bitmap displayed in specified ImageView
    public Uri getLocalBitmapUri(ImageView imageView) 
        imageView.buildDrawingCache();
        Bitmap bm = imageView.getDrawingCache();

        OutputStream fOut = null;
        Uri outputFileUri=null;
        try 
            File root = new File(Environment.getExternalStorageDirectory()
                    + File.separator + "folder_name" + File.separator);
            root.mkdirs();
            File imageFile = new File(root, "myPicName.jpg");
            outputFileUri = Uri.fromFile(imageFile);
            fOut = new FileOutputStream(imageFile);
         catch (Exception e) 
            Toast.makeText(this, "Error occured. Please try again later.", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        

        try 
            bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);
            fOut.flush();
            fOut.close();
            return outputFileUri;
         catch (Exception e) 
            e.printStackTrace();
        
        return null;
    

【讨论】:

这里的“descpic”和“desc”是什么?在我的代码中实现这个之后变红了 descpic 是 imageview 和 desc textview,用你的文字改变它【参考方案2】:

TL;DR ::: 您需要为 WhatsAPP(或任何其他 APP)启用读/写权限才能使用图像。创建一个临时文件 --- 或者 --- 让您的 APP 将文件保存到外部存储。

本教程帮助了我:Saving the bitmap to the external storage 这个 android 开发者链接,向我解释了为什么我必须走 getExternalStorageDirectory() 路线: Develop > Training > Getting > Started > Saving Data

这正是发生在我和我的应用身上的事情。折腾了一天,终于解决了。

无论如何,这行代码都不起作用(或与修改 Uri 对象有关的任何事情): intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

以下来自FileOutputStream fos = context.openFileOutput("desiredFilename.png", Context.MODE_PRIVATE); 然后将 Context.MODE_PRIVATE 更改为 Context.MODE_WORLD_READABLE ... API-14 后已弃用

这部分没什么问题:

 filepath = Environment.getExternalStorageDirectory();
                       cacheDir = new File(filepath.getAbsolutePath()
                       + "/LikeIT/");
                       cacheDir.mkdirs();
                       Intent intent = new Intent();
                       intent.setType("image/jpeg");
                       intent.setAction(Intent.ACTION_SEND);

                       intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(cacheDir
                                       .getAbsolutePath())));

该部分运行良好,因为它启动了 WhatsApp 进程 --- 并等待您添加标题。通过添加intent.putExtra(Intent.EXTRA_TEXT, text_string);,它将获取text_string 中的任何字符串值并将其添加为图片标题。不幸的是,intent.putExtra() 被 WhatsAPP 接收/理解,只有一张带有一个标题的图片……我不知道如何使它成为带有多个标题的多张图片……

另一个提示:如果错误输出显示File(s) Directory doesn't exist,可能是因为mkdirs() 行不起作用。本教程使用两个选定的目录APP_PATH_SD_CARDAPP_THUMBNAIL_PATH_SD_CARD --- 并要求mkdirs() 同时创建它们......出于某种原因,mkdirs() 不喜欢这样做。 所以我要求mkdirs() 一次创建一个:

   File dir = new File( Environment.getExternalStorageDirectory().getAbsolutePath() + APP_PATH_SD_CARD );
   if (!dir.exists())  dir.mkdirs();

  File dirHoldingImages = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + APP_PATH_SD_CARD + APP_THUMBNAIL_PATH_SD_CARD);
    if (!dirHoldingImages.exists())  dirHoldingImages.mkdirs(); 

// carry-on with the rest of the saveFileToExternalStorage code

希望这些链接可以帮助遇到相同问题的其他人。 :)

【讨论】:

以上是关于无法将图像发送到其他应用程序,尝试远足、Messenger 和 Whatsapp的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 java 套接字将图像从 android studio 发送到 pc,filePath 返回 null

为啥我无法正确获取图像数据或无法将数据发送到服务器?

无法使用文件路径将通用 base64 图像发送到 API

使用命名管道将图像从 C++ 发送到 C# 应用程序

如何将浮点值从一个蓝牙模块发送到其他模块(HC 05)

如何将单个字符串发送到 Apple Watch