_data列在FileProvider uri上不可用

tib*_*bbi -1 android uri file path android-contentresolver

我正在使用FileProvider模式来为文件创建content:// uri,

FileProvider.getUriForFile(this, "com.myapp.provider", file) 
Run Code Online (Sandbox Code Playgroud)

功能。我有清单,provider_paths和所有设置的标准方式,它创建了一个uri content://com.myapp.provider/external_files/music/mysong.mp3

我的问题是,如果我尝试在另一个应用程序中获取真实文件路径,则由于该_data列不存在而无法正常工作(具体来说,日志中的错误是E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 0 columns.)。为了获取真实路径,我使用了非常标准的功能

final String column = MediaStore.Files.FileColumns.DATA;
final String[] projection = { column  };
try {
    cursor = context.getContentResolver().query(uri, projection, null, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        final int column_index = cursor.getColumnIndexOrThrow(column);
        return cursor.getString(column_index);
    }
} finally {
    if (cursor != null)
        cursor.close();
}
Run Code Online (Sandbox Code Playgroud)

如果我使用其他应用程序共享同一文件,则会生成一个类似uri的uri content://com.otherapp.provider/external_files/music/mysong.mp3,我已经可以从中检索真实的文件路径。有什么想法可以做,以确保我的应用正确地将给定的uri插入到ContentResolver中?contentResolver.insert(...)不允许使用手动功能。我尝试了不同版本的provider_paths.xml,并为给定的uri授予了所有可能的读/写权限,但是我永远无法检索真实路径。

由我生成的uri本身可以正常工作,因为我可以读取文件或播放歌曲,我的问题是我无法检索所需的真实文件路径。

谢谢

Com*_*are 5

我的问题是,如果我尝试在另一个应用程序中获取真实文件路径

另一个应用程序不应尝试执行此操作。

为了获取真实路径,我使用了非常标准的功能

这只适用于很少的Uri值。

如果我使用其他应用程序共享同一文件,则它会生成一个类似content://com.otherapp.provider/external_files/music/mysong.mp3的uri,我已经可以从中获取真实的文件路径。

不能保证。

有什么想法可以做,以确保我的应用正确地将给定的uri插入ContentResolver?

你不知道 您修复了客户端应用程序,该应用程序不应尝试从中获取“真实文件路径” Uri

我的问题是我无法检索所需的真实文件路径。

相反,对于Uri带有content方案的:

步骤#1:ContentResolver通过调用getContentResolver()某些方法Context(例如,一项活动)来获得,

第2步:调用openInputStream()ContentResolver,传递你的Uri,得到一个InputStream对内容

步骤#3:通过该内容消费内容 InputStream

如果使用的第三方库只能处理文件,请将数据从其中复制InputStream到some FileOutputStream,然后将生成的文件与该库一起使用。

这样,无论内容来自何处(您可以访问的文件,您无法访问的文件,BLOB数据库中的列等),您都可以使用有效的代码。

也可以看看: