Android 如何获取Google drive文档的文件名和实际路径?

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

我使用以下代码在文件管理器中获取文件名和路径。但是,它不会返回Google驱动器文件的路径。知道如何获得实际路径吗

我的代码-

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获取文件名和实际路径:

  • 在Android清单文件中添加文件提供程序路径

    
    
  • 在res下创建xml文件夹并添加provider_path.xml

    
    
  • 用于从Google Drive访问数据的Utils类

    公共类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,上下文);
    }
    }
    }
    
  • IsGoogleDriveri方法

    私有静态布尔值isGoogleDriveUri(Uri){
    返回“com.google.android.apps.docs.storage”.equals(uri.getAuthority())| |“com.google.android.apps.docs.storage.legacy”.equals(uri.getAuthority());
    }
    
  • getDriveFilePath方法

    私有静态字符串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();
    }     
    }
    
  • 获取onActivityResult中的文件路径

    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电子表格进行了测试?代码属于例外。如果您有任何解决方案,请提供帮助。提前感谢。