我正在尝试从我的应用上传文档。
一切正常,但当我从驱动器中选择文件时。
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
。
最佳答案
处理通过文件选择器选择 Google 云端硬盘文件时收到的 Uri
。
如前所述,它接收虚拟文件 URI。
我发现这个示例代码简单易懂。 给定的代码示例对我有用。希望它适用于您的情况。
1.所以检测这个Uri是被google drive接收到的。
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存储到外部路径(这里是它的根目录,您可以根据需要更改它)并创建具有该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);
}
注意:这里的虚拟文件是从 Intent getData()
中获取的,并在 context.getContentResolver().openInputStream(intent.getData())
中使用,这将返回一个 InputStream
。它是从谷歌驱动器中获取选定文件的句柄。
关于android - 使用 Intent 从 Google Drive 获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53670406/