获取Android中Uri的实际路径
问题:Get Real Path For Uri Android
原因:这段代码可以在所有Android版本上工作,因为它根据API级别进行了条件判断,并使用不同的方法来获取URI的真实路径。
解决方法:使用上面提供的代码可以解决获取URI真实路径的问题。根据API级别的不同,代码使用不同的方法来获取真实路径,包括使用DocumentsContract、MediaStore和File等类来处理不同类型的URI。代码还提供了一些辅助方法来判断URI的类型。
代码示例中的getPathFromUri()方法可以用于获取URI的真实路径。如果URI是通过DocumentsContract提供的,那么根据不同的URI类型,代码将使用不同的方法来获取真实路径。对于使用content协议的URI,代码将调用getDataColumn()方法来查询数据列并返回路径。对于使用file协议的URI,代码将直接返回路径。
代码还提供了一些辅助方法,如isExternalStorageDocument()、isDownloadsDocument()、isMediaDocument()和isGooglePhotosUri(),用于判断URI的类型。
需要注意的是,该方法在Android 7及以上版本中可能存在问题,因为在这些版本中,数据列"_data"可能不存在。
代码示例中还提到了一些问题和错误,如在处理非主要下载文件夹时可能会出错,以及在Android 7及以上版本中可能会出现"_data"列不存在的错误。
原因:在Android中,有时候需要获取文件的真实路径,但是通过URI获取路径时会遇到一些问题。上述代码是为了解决这个问题而编写的,通过不同的URI类型,使用不同的方式获取文件的真实路径。
解决方法:使用上述提供的getRealPathFromURI
函数,将URI传递给该函数,即可获取文件的真实路径。
代码如下:
val fileRealPath = getRealPathFromURI(context!!, fileURI) ?: ""
如果遇到问题,可以根据情况检查isDownloadDocument
方法中的id.startsWith("msf:")
条件,也可以参考stackoverflow上的解决方案。如果问题无法解决,可以提出新的问题寻求帮助。
注意:以上代码和解决方案是使用Kotlin语言编写的。
问题:在Android中获取Uri的真实路径的原因和解决方法
当我们需要获取Android设备上的选定视频的真实路径时,可以使用以下代码:
Uri uri = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); if(cursor.moveToFirst()){ int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String yourRealPath = cursor.getString(columnIndex); } else { //boooo, cursor doesn't have rows ... } cursor.close();
以上代码通过查询内容提供器的方式,可以获取到选定视频的真实路径。
此外,还可以参考以下链接获取帮助:
[Get filename and path from URI from mediastore](https://stackoverflow.com/questions/3401579)
最新的解决方案是使用File Provider(API 29),可以参考以下链接:
- [Blogs: https://blogs.datanapps.com/media-picker](https://blogs.datanapps.com/media-picker)
- [Github: https://github.com/datanapps/MediaPicker](https://github.com/datanapps/MediaPicker)
希望这些信息能够对您有所帮助。如果没有,请明天再更新答案。