与他人共享图像和文本应用程序

Posted

技术标签:

【中文标题】与他人共享图像和文本应用程序【英文标题】:Share image and text with others Application 【发布时间】:2020-02-14 06:47:40 【问题描述】:

为了与其他应用共享图像和文本,我这样做了:

File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES+"eVendeur");
              if (!path.exists())
                  path.mkdir();
              

              File root = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
              File cachePath = new File(root.getAbsolutePath()+"/eVendeur/"+id_produit+".jpg");

    try 
        cachePath.createNewFile();
        FileOutputStream outputStream = new FileOutputStream(cachePath);
        myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
        outputStream.close();

     catch (IOException e) 
        e.printStackTrace();
    

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("*/*");
    share.putExtra(Intent.EXTRA_TEXT, "my text");

    if(Build.VERSION.SDK_INT>=24)
                        try
                            Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
                            m.invoke(null);
                        catch(Exception e)
                            e.printStackTrace();
                        
                    

    share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(cachePath));
    view.getContext().startActivity(Intent.createChooser(share, "Share:"));

它可以工作,但在某些设备上,我得到了:

java.io.IOException: 没有这样的文件或目录....

我应该对代码进行哪些更改才能使其正常工作?

提前致谢

【问题讨论】:

您必须使用范围存储 Environment.getExternalStorageDirectory() deprecated in API level 29 java的可能重复 Uri.fromFile()android 7.0 以来已被禁止(或多或少),因为它会触发 FileUriExposedException。 “它在 API 29 上除外”——在此之前你会开始遇到问题。另外,您假设其他应用程序可以访问该位置,并且不需要其他应用程序具有READ_EXTERNAL_STORAGE。而且,EXTRA_STREAM 应该有一个 content Uri 无论如何。使用FileProvider 提供您的内容。 @CommonsWare 请问如何使用这一切 【参考方案1】:

使用 getExternalFilesDir 代替 getExternalStoragePublicDirectory

 File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES+"/eVendeur");

 if (!dossier.exists())
    dossier.mkdir();
 

 File root = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File cachePath = new
        File(root.getAbsolutePath()+"/eVendeur/"+"id_produit"+".jpg");

更多详情请访问Docs

【讨论】:

Environment.getExternalStorageDirectory() 已弃用 我得到 FileUriExposedException : file:///storage/emulated/0/Android/data/com.e_vendeur/files/Pictures/eVendeur/-LqzYHtp3h-1qbHU6PK_.jpg 通过 ClipData.Item 暴露在应用程序之外.getUri() 我现在更新我的问题,我得到 java.io.IOException: No such file or directory... 在 eVendeur 前面的第一行添加 /(File path = getExternalFilesDir(Environment.DIRECTORY_PICTURES+"/eVendeur"); ) 你有 id_produit.jpg 在 /storage/emulated/0/Android/data /com.example.myapplication/files/Pictures/eVendeur【参考方案2】:

如果你得到:

FileUriExposedException : file:///storage/emulated/0/Android/data/com.e_vendeur/files/Pictures/eVendeur/-LqzYHtp3h-1qbHU6PK_.jpg 通过 ClipData.Item.getUri() 暴露在应用之外

然后在调用意图之前添加:

   if(Build.VERSION.SDK_INT>=24)
                            try
                                Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
                                m.invoke(null);
                            catch(Exception e)
                                e.printStackTrace();
                            
                        

【讨论】:

我现在更新我的问题,我得到 java.io.IOException: No such file or directory... 这意味着首先您必须使用 mkdir 函数创建该目录。 目录已创建,但图片不在其中。我认为错误来自 cachePath.createNewFile ()

以上是关于与他人共享图像和文本应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Facebook SDK 与文本共享图像

在 iOS 中与文本共享图像

windows phone 8 共享图像以及预填充的文本

是否可以将文本、图像和文件共享到使用 Nativescript 编写的 Android 或 iOS 应用程序中?

iOS 上的图像共享表中缺少标题和内容文本

我如何与 Intent.ACTION_SEND 一起共享和保存图像和文本?