昨天晚上搞了一下,不是闪退就是提示文件资源获取失败
心想着,代码没多大的问题啊,直到发现了一片文章:https://www.jianshu.com/p/796c28011dc2
我摘一下主要的信息
有些应用对于FileProvider生成的Uri无法识别,需要转化成MediaStore 的 content://。
微信就是其中之一
这是原文中的函数:不用管函数命名,这只是将路径文件转换为(MediaStore 的 content://)Uri的函数
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
Uri uri = null;
if (cursor != null) {
if (cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
uri = Uri.withAppendedPath(baseUri, "" + id);
}
cursor.close();
}
if (uri == null) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
return uri;
}
我原先分享是这样写的,结果证明这样不行
uri = FileProvider.getUriForFile(mContext, mContext.getApplicationContext().getPackageName() + ".fileprovider", picFile);
需要改成这样
uri = getImageContentUri(mContext, new File(Environment.getExternalStorageDirectory() + File.separator + "OwlDatabase" + File.separator + Filename));
File.separator ---------你就当成跨平台的反斜杠,linux和windows路径的分隔符不同
1.清单文件添加如下( 和activity server 并排不是相互嵌入)
external_files----对应的是虚拟目录—/storage/emulated/0/
我后面加OwlDatabase/ 意味着我调用
Environment.getExternalStorageDirectory() + File.separator +
“OwlDatabase” + File.separator+“test.txt”
指向的就是;/storage/emulated/0/OwlDatabase/test.txt
就这么理解吧~
activity中的函数,我动态申请了一下权限,获取
FileUrl--------------路径+文件名,例如:/storage/emulated/0/OwlDatabase/test.txt
filename------------文件名,例如:test.txt
private void judgePermission(String FileUrl,String filename) {
/**
* 先检查权限是否打开,打开了就可以直接访问,未打开则先申请一波权限
*/
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!=
PackageManager.PERMISSION_GRANTED||(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
makeAnExtraRequest();
}
}else{
File f = new File(FileUrl);
ShareUtils.shareWechatFriend(MainActivity.this,f,filename);
}
}
@RequiresApi(api = Build.VERSION_CODES.M)
private void makeAnExtraRequest() {
int code = 100;
String[] permissions = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
for (String string : permissions) {
if (this.checkSelfPermission(string) != PackageManager.PERMISSION_GRANTED) {
this.requestPermissions(permissions, code);
code++;
return;
}
}
}
ShareUtils,我用的一个博主的:地址:https://blog.csdn.net/wei8023hzp/article/details/98965398