Android 如何获取Google drive文档的文件名和实际路径?
我使用以下代码在文件管理器中获取文件名和路径。但是,它不会返回Google驱动器文件的路径。知道如何获得实际路径吗 我的代码-Android 如何获取Google drive文档的文件名和实际路径?,android,google-drive-api,Android,Google Drive Api,我使用以下代码在文件管理器中获取文件名和路径。但是,它不会返回Google驱动器文件的路径。知道如何获得实际路径吗 我的代码- public String getFilePath() { if (uri.getScheme().equalsIgnoreCase("file")) { return uri.getLastPathSegment(); } cursorLoader.setUri(uri); cursorLoader.setProjec
public String getFilePath() {
if (uri.getScheme().equalsIgnoreCase("file")) {
return uri.getLastPathSegment();
}
cursorLoader.setUri(uri);
cursorLoader.setProjection(projections);
Cursor cursor = cursorLoader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
cursor.moveToFirst();
String realPath = cursor.getString(column_index);
cursor.close();
if (realPath == null || realPath.isEmpty()) {
return null;
}
return null;
}
您必须使用URI。通过URI,您可以
getContentResolver.query(您拥有的URI,null,null,null,null)
。现在有了光标,可以检查列名等
对于Google drive,有一个列名\u display\u name
。这将为您提供文件名
现在您想要访问该文件吗?您可以通过
getContentResolver()打开一个到URI的InputStream
。openInputStream(您拥有的URI)
通过以下步骤非常轻松地从Google Drive URI获取文件名和实际路径:
公共类Utils{
私有静态Uri contentUri=null;
@SuppressLint(“新API”)
公共静态字符串getPath(最终上下文,最终Uri){
//点击此处查看KITKAT或新版本
最终布尔值isKitKat=Build.VERSION.SDK\u INT>=Build.VERSION\u CODES.KITKAT;
//文档提供者
if(isKitKat&&DocumentsContract.isDocumentUri(context,uri))
{
//媒体提供商
if(isMediaDocument(uri)){
如果(iGoogle驱动uri(uri)){
返回getDriveFilePath(uri,上下文);
}
}
}
私有静态布尔值isGoogleDriveUri(Uri){
返回“com.google.android.apps.docs.storage”.equals(uri.getAuthority())| |“com.google.android.apps.docs.storage.legacy”.equals(uri.getAuthority());
}
私有静态字符串getDriveFilePath(Uri,上下文){
urireturnuri=Uri;
Cursor returnCursor=context.getContentResolver().query(returnUri,null,null,null);
/*
*获取游标中数据的列索引,
**移动到光标的第一行,获取数据,
**并显示它。
* */
int nameIndex=returnCursor.getColumnIndex(OpenableColumns.DISPLAY\u NAME);
int-sizeIndex=returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
字符串名称=(returnCursor.getString(nameIndex));
字符串大小=(Long.toString(returnCursor.getLong(sizeIndex));
File File=新文件(context.getCacheDir(),名称);
试一试{
InputStream InputStream=context.getContentResolver().openInputStream(uri);
FileOutputStream outputStream=新的FileOutputStream(文件);
int read=0;
int maxBufferSize=1*1024*1024;
int bytesavable=inputStream.available();
//int bufferSize=1024;
int bufferSize=Math.min(字节可用,maxBufferSize);
最终字节[]缓冲区=新字节[bufferSize];
而((读取=输入流。读取(缓冲区))!=-1){
写入(缓冲区,0,读取);
}
Log.e(“文件大小”、“大小”+文件长度());
inputStream.close();
outputStream.close();
Log.e(“文件路径”,“路径”+文件.getPath());
}捕获(例外e){
Log.e(“异常”,e.getMessage());
}
返回文件.getPath();
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
if ((data != null) && (data.getData() != null)) {
Uri selectedFile = data.getData();
if (selectedFile.getLastPathSegment() != null) {
//Here you will get File Path
String strPath = FileUtils.getPath(this, selectedFile);
}
}
}
}
如果不深入了解细节,我的怀疑是,这些文件实际上不是设备文件系统上的文字“文件”,而是引用了一些可能用于获取内容的信息共享方案。你有任何确凿证据证明它们确实是本地文件吗?同意。不一定有“实际路径”对于任何
Uri
。您正在使用的代码片段最多只能用于由MediaStore
索引的文件。欢迎像Google Drive这样的应用程序通过ACTION\u GET\u content
、ACTION\u PICK
、存储访问框架等提供文件内容。但是,这些文件不必您可以独立访问它们的任何位置,例如将它们放在内部存储器上。但它确实有一个内容uri-content://com.google.android.apps.docs.files/exposed_content/GzbCGuP7Bbpim%2FVz6FkjsA%3D%3D%0A%3BIaCw8dNKdKh2%2FIRHBzfQih86IT2FRnSTdSN6MS2d1L2UKC%2FuQyTlxUCOb%2Fu%2F0%2BlC%0A 这难道不意味着它就在地球上的某个地方吗设备?“这不是意味着它位于设备上的某个位置吗?”--不一定。它可能是您无权访问的文件(例如,驱动器应用程序的内部存储)。ContentProvider
可以动态解密加密文件并将其流式传输回客户端。ContentProvider
可以将其从互联网上流式传输。等等。从来没有要求Uri
映射到文件,这就是为什么您的MediaStore
黑客攻击对所有人来说都是不可靠的Android版本。更少的Uri
值将映射到Android 4.4+上具有存储访问框架的文件。因此,获取Google驱动器文件并存储路径是一条死胡同?有解决方法吗?这里有相同的问题:)你能提供完整的示例,说明如何准确地从该路径获取文件吗?上面的代码运行良好。我们可以获得easil使用文件提供程序和上述步骤从google drive访问文件路径。您是否对google drive的google电子表格进行了测试?代码属于例外。如果您有任何解决方案,请提供帮助。提前感谢。