我正在尝试从我的应用程序上传文档。
一切正常,但当我选择文件从驱动器。
data=Intent { act=android.intent.action.VIEW dat=content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4
(has extras) }}有谁知道如何处理这个文件吗。
我已经处理了所有的文件和图像,只面临问题与谷歌驱动器文件。
我在意向数据Uri中获得了这个content://com.google.android.apps.docs.storage.legacy/enc=ckpgt5KcEEF_JYniJQafRV_5pEnu_D5UAI1WF-Lu6h2Z_Vw4。
发布于 2018-12-13 12:44:33
当通过文件选择器选择时,处理由Google文件接收的Uri。
如前所述,它接收虚拟文件Uri。
我发现这个示例代码简单易懂。给出的代码示例适用于我-- .hope --它适用于您的情况。
1.检测该Uri是由google驱动器接收的。
public static File getFileFromUri(final Context context, final Uri uri) throws Exception {
if (isGoogleDrive(uri)) // check if file selected from google drive
{
return saveFileIntoExternalStorageByUri(context, uri);
}else
// do your other calculation for the other files and return that file
return null;
}
public static boolean isGoogleDrive(Uri uri)
{
return "com.google.android.apps.docs.storage.legacy".equals(uri.getAuthority());
}2.如果是,uri将存储到外部路径(在这里,它的根目录u可以根据您的需要更改它),并创建带有uri的文件。
public static File saveFileIntoExternalStorageByUri(Context context, Uri uri) throws
Exception {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
int originalSize = inputStream.available();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
String fileName = getFileName(context, uri);
File file = makeEmptyFileIntoExternalStorageWithTitle(fileName);
bis = new BufferedInputStream(inputStream);
bos = new BufferedOutputStream(new FileOutputStream(
file, false));
byte[] buf = new byte[originalSize];
bis.read(buf);
do {
bos.write(buf);
} while (bis.read(buf) != -1);
bos.flush();
bos.close();
bis.close();
return file;
}
public static String getFileName(Context context, Uri uri)
{
String result = null;
if (uri.getScheme().equals("content")) {
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
try {
if (cursor != null && cursor.moveToFirst()) {
result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME));
}
} finally {
cursor.close();
}
}
if (result == null) {
result = uri.getPath();
int cut = result.lastIndexOf('/');
if (cut != -1) {
result = result.substring(cut + 1);
}
}
return result;
}
public static File makeEmptyFileIntoExternalStorageWithTitle(String title) {
String root = Environment.getExternalStorageDirectory().getAbsolutePath();
return new File(root, title);
}注意:在这里,虚拟文件是从意图getData() context.getContentResolver().openInputStream(intent.getData())**,中检索的,并在context.getContentResolver().openInputStream(intent.getData())**,中使用,这将返回一个** InputStream**.从google驱动器获取选定文件的句柄。**
发布于 2018-12-10 14:04:56
我想你是从google驱动器上得到Virtual File Uri的
阅读更多关于虚拟文件的信息
来自DOCS
虚拟文件
DocumentsProvider返回可以与ACTION_VIEW意图一起使用的文档URIs,即使它们没有直接的bytecode表示。Android7.0还允许您为用户文件提供替代格式,无论是虚拟的还是其他的现在的问题是如何检查
Uri是否为VirtualFile
首先检查Uri是否为VirtualFile
private boolean isVirtualFile(Uri uri) {
if (!DocumentsContract.isDocumentUri(this, uri)) {
return false;
}
Cursor cursor = getContentResolver().query(
uri,
new String[] { DocumentsContract.Document.COLUMN_FLAGS },
null, null, null);
int flags = 0;
if (cursor.moveToFirst()) {
flags = cursor.getInt(0);
}
cursor.close();
return (flags & DocumentsContract.Document.FLAG_VIRTUAL_DOCUMENT) != 0;
}下面的代码片段演示如何检查虚拟文件是否可以表示为图像,如果可以,则从虚拟文件中获取输入流。
private InputStream getInputStreamForVirtualFile(Uri uri, String mimeTypeFilter)
throws IOException {
ContentResolver resolver = getContentResolver();
String[] openableMimeTypes = resolver.getStreamTypes(uri, mimeTypeFilter);
if (openableMimeTypes == null ||
openableMimeTypes.length < 1) {
throw new FileNotFoundException();
}
return resolver
.openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null)
.createInputStream();
}有关虚拟文件的更多信息,请阅读以下文章
https://stackoverflow.com/questions/53670406
复制相似问题