我无法将位于我的缓存中的图像文件附加到电子邮件Intent。
我的代码:
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(Intent.EXTRA_SUBJECT, DPLabelTV.getText());
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "" });
String image_key = mCache.getKey(Uri.parse(url));
File image_file = mCache.getFile(image_key);
Uri uri = Uri.fromFile(image_file);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
emailIntent.putExtra(Intent.EXTRA_TEXT, "Hello world");
startActivity(Intent.createChooser(emailIntent, "Send email..."));
uri的输出是:file:///data/data/com.mypackage/cache/cf3dd860d5e9562512f699c9cccb2d16a3cdaa8f.jpg
我已经尝试过了:
emailIntent.setType("application/image");
emailIntent.setType("image/jpeg");
清单权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我得到的错误信息是:
W/Gmail ( 4542): Error opening file to obtain size.
W/Gmail ( 4542): java.io.FileNotFoundException: Permission denied
I/Gmail ( 4542): Unable to get orientation of thumbnail file:///data/data/com.mypackage/cache/cf3dd860d5e9562512f699c9cccb2d16a3cdaa8f.jpg: class java.io.FileNotFoundException /data/data/com.mypackage/cache/cf3dd860d5e9562512f699c9cccb2d16a3cdaa8f.jpg: open failed: EACCES (Permission denied)
任何人都有线索?
2014年1月28日编辑
新代码:
// Grant permissions to all apps that can handle this intent
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(emailIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList)
{
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
startActivity(Intent.createChooser(emailIntent, "Send email..."));
清单:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mypackage"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
XML路径文件:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="cache" path="cache"/>
</paths>
仍然没有工作......
答案 0 :(得分:1)
您不能简单地传递位于应用程序文件夹中的文件的文件路径。该文件夹中的文件只能由您的应用访问。
您必须实施ContentProvider
才能允许外部应用访问您的文件。
这将帮助您入门:http://developer.android.com/guide/topics/providers/content-provider-basics.html
对于文件,您还可以使用FileProvider
:http://developer.android.com/reference/android/support/v4/content/FileProvider.html
答案 1 :(得分:1)
其他应用无法访问您应用中的数据。一个快速的解决方案是将文件复制到外部文件夹,一旦从电子邮件活动中获得结果,删除外部文件。
String oldPath = ...;
String newPath = getExternalCacheDir() + "/" + UUID.randomUUID();
// Copy the file from old path to new path
...
Uri uri = Uri.fromFile(image_file);
emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
emailIntent.putExtra(Intent.EXTRA_TEXT, "Hello world");
startActivity(Intent.createChooser(emailIntent, "Send email..."));
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
// Delete the newPath file
}
答案 2 :(得分:0)
经过多次意图,以下是对我有用的答案:Android attach image to email doesn't work
您只需将图像复制到外部存储设备,然后附加此新图像。
答案 3 :(得分:-1)
我知道它已被弃用,但仍然适用于v4.4.4。 只需将您的文件放入context.getFilesDir()并指定全局可读标志
即可FileOutputStream fos = context.openFileOutput(LOG_FILE_NAME, Context.MODE_WORLD_READABLE);
fos.write(...);
fos.close();
然后使用此位置附加文件
String attachment = context.getFileStreamPath(LOG_FILE_NAME).getAbsolutePath();
sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + attachment));