我尝试过多种从google驱动器URI获取文件对象的方法,但大多数会导致以下错误:
java.lang.SecurityException: Permission Denial: reading com.google.android.apps.docs.storagebackend.StorageBackendContentProvider uri content://com.google.android.apps.docs.storage/document/acc=1;doc=4235 from pid=32140, uid=10149 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
所以我添加了android.permission.MANAGE_DOCUMENTS并且它没有用,所以我尝试使用grantUriPermission()并得到以下错误:
java.lang.SecurityException: Uid 10151 does not have permission to uri 0 @ content://com.google.android.apps.docs.storage/document/acc=1;doc=4235
这个文件插件可以从几乎任何地方获取文件,除了谷歌驱动器:aFileChooser。
所以我采取了堆栈溢出的答案:
Open a Google Drive File Content URI after using KitKat Storage Access Framework
Android KitKat securityException when trying to read from MediaStore
Getting Permission Denial Exception
No permission for UID to access URI error on Android Application
并且还有大约15人,但没有人帮助
我正在使用Cordova所以这是一个跨平台的应用程序,所以它限制了我一点。以下是我获取URI的方法,我在webview应用程序中按下按钮,然后加载新页面,允许我从手机上的某个位置选择我的视频,然后选择谷歌驱动器,然后选择一个视频,然后选择一个URI被发送回我的webview,然后我将URI发送到java文件以尝试下载该文件。这是我尝试下载文件的不同方法:
String filePath = null;
Log.d(TAG,"URI = "+ uri);
if (uri != null && "content".equals(uri.getScheme())) {
Log.d(TAG, "got inside if");
Cursor cursor = context.getContentResolver().query(uri, new String[] { android.provider.MediaStore.Files.FileColumns.DATA }, null, null, null);
cursor.moveToFirst();
filePath = cursor.getString(0);
cursor.close();
} else {
Log.d(TAG, "got inside else");
filePath = uri.getPath();
}
Log.d("","Chosen path = "+ filePath);
此方法类似,但失败方式相同:
String mimeType = context.getContentResolver().getType(uri);
Log.d(TAG,mimeType);
Cursor returnCursor = getContentResolver().query(returnUri, null, null, null, null);
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
Log.d(TAG,returnCursor.getString(nameIndex));
Log.d(TAG,Long.toString(returnCursor.getLong(sizeIndex)));
此方法游戏与前一个游戏相同的错误
try{
InputStream input = context.getContentResolver().openInputStream(uri);
try {
File file = new File(context.getCacheDir(), "cacheFileAppeal.mp4");
OutputStream output = new FileOutputStream(file);
try {
try {
byte[] buffer = new byte[4 * 1024]; // or other buffer size
int read;
while ((read = input.read(buffer)) != -1) {
output.write(buffer, 0, read);
}
output.flush();
} finally {
output.close();
}
} catch (Exception e) {
e.printStackTrace(); // handle exception, define IOException and others
}
} finally {
input.close();
}
}
catch(Exception e){
e.printStackTrace();
}
所有三场比赛我
java.lang.SecurityException: Permission Denial: reading com.google.android.apps.docs.storagebackend.StorageBackendContentProvider uri content://com.google.android.apps.docs.storage/document/acc=1;doc=4235 from pid=32140, uid=10149 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
以下代码由于某种原因没有崩溃,但给了我mimeType:
String mimeType = context.getContentResolver().getType(uri);
我认为问题是我没有在原始意图中使用URI,其中从谷歌驱动器检索到URI,但我不确定。
有没有人知道如何从谷歌驱动器URI获取文件对象?