有没有办法使用Intent.ACTION_SEND
分享屏幕截图而不需要android.permission.WRITE_EXTERNAL_STORAGE
?
这是分享部分:
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/jpeg");
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
Intent chooserIntent = Intent.createChooser(shareIntent, shareTitle);
startActivity(chooserIntent);
当uri指向getExternalFilesDir()
中的文件时,共享正常,但我更喜欢不需要WRITE_EXTERNAL_STORAGE
权限的隐私相关用户的解决方案。
我尝试了3种不同的方法:
文件提供商:
uri = FileProvider.getUriForFile(context, authority, imageFile);
这适用于某些共享方式(Gmail),但不适用于其他方式(Google +)。
上传到网络服务器:
uri = Uri.parse("http://my-image-host.com/screenshot.jpg");
这在任何地方都失败了,一些人(Google +)崩溃了。
(我怀疑如果我使用每个社交网络API而不是chooserIntent
实现共享逻辑,可以工作
注入Media Store:
uri = MediaStore.Images.Media.insertImage(contentResolver, bitmap, name, description);
抛出SecurityException,解释它需要WRITE_EXTERNAL_STORAGE。
我还缺少其他方法吗?
答案 0 :(得分:3)
基于work by Stefan Rusek,我创建了LegacyCompatCursorWrapper
,旨在帮助提高FileProvider
(和其他ContentProvider
实施)与正在寻找{{1}的客户端应用的兼容性列而不是找到它们。 _DATA
模式最初由_DATA
使用,但尝试引用该列的应用从来都不是一个好主意。
要与MediaStore
结合使用,请添加my CWAC-Provider library作为依赖项,然后创建自己的FileProvider
子类,例如:{/ p>
FileProvider
所有这一切都将/***
Copyright (c) 2015 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
http://commonsware.com/Android
*/
package com.commonsware.android.cp.v4file;
import android.database.Cursor;
import android.net.Uri;
import android.support.v4.content.FileProvider;
import com.commonsware.cwac.provider.LegacyCompatCursorWrapper;
public class LegacyCompatFileProvider extends FileProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return(new LegacyCompatCursorWrapper(super.query(uri, projection, selection, selectionArgs, sortOrder)));
}
}
FileProvider
结果打包在query()
中。除了您的LegacyCompatCursorWrapper
元素的FileProvider
属性指向你自己的班级。您可以在this sample app中看到这一点。