我打算分享图像的意图。这适用于大多数提供商,但适用于Google+。 Google+会在没有图片的情况下打开帖子活动并显示祝词“您只能发布存储在设备上的照片”。在同一时间。
File f = storeImage(image); // f = /data/data/com.myapp/files/1333070776978.jpg
Uri uri = Uri.fromFile(f);
Intent share = new Intent(Intent.ACTION_SEND);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
share.setType("image/jpeg");
share.putExtra(Intent.EXTRA_STREAM, uri);
share.putExtra(Intent.EXTRA_TITLE,"Share that title");
share.putExtra(Intent.EXTRA_SUBJECT,"Share that subject");
share.putExtra(Intent.EXTRA_TEXT,"Check that out...");
share.putExtra("sms_body", "sms body");
startActivity(Intent.createChooser(share, "Share Image"));
我用
保存图像 Context.openFileOutput(fileName, Context.MODE_WORLD_READABLE);
我的理解是,通过设置FLAG_GRANT_READ_URI_PERMISSION,我授予Google+特定访问权限。
当我将图像存储到MediaStore时,它可以工作,但我实际上并不想弄乱用户图像库。
ContentValues values = new ContentValues(2);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, f.getAbsolutePath());
Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
任何建议表示赞赏
西蒙
答案 0 :(得分:6)
Google+无法从其他应用的私人文件夹访问file://
Uris。并且FLAG_GRANT_READ_URI_PERMISSION
在这种情况下不起作用,因为它仅适用于Intent的“数据”部分中的Uris,但不适用于额外内容。
一个常见的解决方法是将其添加到图库(通过MediaStore
),但没有必要这样做。在这种情况下,正确的解决方案是使用FileProvider
:
FileProvider是ContentProvider的一个特殊子类,便于使用 通过创建一个安全共享与应用程序关联的文件
content://
Uri代表文件而不是file:///
Uri。
首先将以下内容放入AndroidManifest.xml
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.myapp.testshare.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
然后这个文件在res\xml\filepaths.xml
:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_images" path="shared_images/" />
</paths>
然后,要共享图像文件,请确保它位于上面指定的路径中(即shared_images
下的getFilesDir()
)并按如下方式构建意图:
File file = getImageFileToShare();
Uri fileUri = FileProvider.getUriForFile(this, "com.myapp.testshare.fileprovider", file);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, fileUri);
intent.setType("image/png");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
(确保getUriForFile()
方法中指定的权限与清单中的权限匹配。
这会产生一个content://
Uri(例如content://com.myapp.testshare.fileprovider/shared_images/img1.png
,以便Google+应用可以访问,因此会包含在帖子中)。
答案 1 :(得分:2)
西蒙,
设置uri后似乎可以设置权限。
share.putExtra(Intent.EXTRA_STREAM, uri);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
答案 2 :(得分:1)
尝试这个,我也遇到问题,因为如果我插入的话,它会出现在Gallery中。
//这里是一个文件实例
String uriString = MediaStore.Images.Media.insertImage(getContentResolver(),
out.getAbsolutePath(),null,null);
intent.putExtra(Intent.EXTRA_STREAM,Uri.parse(uriString));
答案 3 :(得分:1)
如果您使用的是自定义ContentProvider,则必须检查图像的MIME类型是否正确。 jpeg的正确MIME是&#34; image / jpeg&#34;。如果你回来&#34; image / jpg&#34;在重写的getType(Uri uri)中;方法然后Google+无法附加它们。大多数其他工作,例如消息和电子邮件。 &#34;图像/ JPG&#34;不是有效的IANA MIME类型:
http://www.iana.org/assignments/media-types/image
getType的规范很清楚,但很容易错过(我做过)。解决了这个问题后,我想确保其他人发现这一点,因为它非常不合时宜。
答案 4 :(得分:0)
您可以使用:
Drawable drawable;
File file;
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
drawable = getResources().getDrawable(imgResId);
} else {
drawable = getResources().getDrawable(imgResId, null);
}
if (drawable != null) {
Bitmap bm = ((BitmapDrawable) drawable).getBitmap();
String path = Environment.getExternalStorageDirectory()
.toString();
OutputStream fOut = null;
file = new File(path, "pic.jpg"); // the File to save to
try {
file.createNewFile();
fOut = new FileOutputStream(file);
// obtaining the Bitmap
bm.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
return file;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}