从Android7.0开始,安卓系统禁止应用间分享file开头的URI,并提供了FileProvider作为标准的应用间文件分享方式。
关于FileProvider有很多的文章都有讲解,主要说的是FileProvider用法,如何来替代Uri.fromFile(file)
。通过FileProvider分享的URI类似这样的content://com.armp.axplor.fileprovider/my_files/test.xls
,可以看到出了文件名外,我们没法获取文件的真实路径信息,通过uri.getPath()
是拿不到真正的路径的,那我们改如何读取FileProvider分享出来的URI呢?
读取FileProvider分享的URI由于无法获取真实路径,只能通过流的方式获取:
//获取文件名和大小
String fileName;
long size;
try {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE);
cursor.moveToFirst();
fileName = cursor.getString(nameIndex);
size = cursor.getLong(sizeIndex);
cursor.close();
} catch (Exception e) {
e.printStackTrace();
}
//获取文件输入流
ParcelFileDescriptor inputPFD = getContentResolver().openFileDescriptor(uri, "r");
FileDescriptor fileDescriptor = inputPFD.getFileDescriptor();
FileInputStream inputStream = new FileInputStream(fileDescriptor);