与他人共享图像和文本应用程序
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 ()以上是关于与他人共享图像和文本应用程序的主要内容,如果未能解决你的问题,请参考以下文章