android 通过uri获取文件大小,uri获取文件长度

通过uri获取文件大小有三种方法,一种是通过FileDescriptor获取

    fun length(context: Context, uri: Uri): Long =
            when (uri.scheme) {
                ContentResolver.SCHEME_FILE -> File(uri.path).length()
                ContentResolver.SCHEME_CONTENT -> try {
                    context.contentResolver.openFileDescriptor(uri, "r")?.statSize ?: 0
                } catch (e: Exception) {
                    0L
                }
                else -> 0L
            }

这种方法由于需要逐个转io流,在批量操作时比较耗时,建议在文件数量少时使用

android10之后,虽然无法直接操作沙盒目录外的其他文件,但读取文件的部分数据还是可以的

所以另一种文件是直接读取文件的长度

    fun length(context: Context, uri: Uri): Long =
            when (uri.scheme) {
                ContentResolver.SCHEME_FILE -> File(uri.path).length()
                ContentResolver.SCHEME_CONTENT -> {
                    val cr = context.contentResolver
                    val cursor = cr.query(uri, null, null, null, null)
                    if(cursor != null && cursor.moveToFirst()){
                        File(cursor.getString(cursor.getColumnIndex("_data"))).length()
                    }else 0
                }
                else -> 0L
            }

这种方法需要查询数据库,建议在批量查询文件时使用

最后一种是通过查询uri列数据获取

        val cursor = context.contentResolver.query(uri, null, null, null, null)
        if(cursor != null && cursor.moveToFirst()){
            val sizeIndex = cursor.getColumnIndex(OpenableColumns.SIZE)
            if(!cursor.isNull(sizeIndex)){
                val length = cursor.getLong(sizeIndex)
            }
        }

但是这种方法如果文件不存在,获取的长度会出错,因此不建议用

猜你喜欢

转载自blog.csdn.net/jingzz1/article/details/111095185
今日推荐