我正在为我的音频/视频播放器应用程序提供Android 11支持。实际上,我主要担心的是,谷歌部落不允许玩家应用程序访问所有文件。我不希望我的应用在谷歌商店发布时被拒绝。
在以前的API中,我使用的是WRITE_EXTERNAL_STORAGE
权限,包括Android 10(我选择退出作用域存储)。不过,我不知道如何处理Android11,而不让我的应用在谷歌商店上发布时遭到拒绝。我了解到查询MediaStore
记录需要READ_EXTERNAL_STORAGE
权限,我有以下问题:
>
乐趣获取视频():数组列表{
val marrayList = ArrayList<Video>()
val contentResolver =context?.contentResolver
val uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
val selection = "${MediaStore.Video.Media.DURATION} >= ?"
val selectionArgs = arrayOf(
TimeUnit.MILLISECONDS.convert(2, TimeUnit.SECONDS).toString()
)
val sortOrder = "${MediaStore.Video.Media.DISPLAY_NAME} ASC"
val collection =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
MediaStore.Video.Media.getContentUri(
MediaStore.VOLUME_EXTERNAL
)
} else {
MediaStore.Video.Media.EXTERNAL_CONTENT_URI
}
val cursor = contentResolver?.query(collection, null, selection, selectionArgs, sortOrder)
if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {
val idColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media._ID)
val nameColumn =
cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME)
val titleCol =cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)
val date=cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_ADDED)
val durationColumn =
cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)
val sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE)
while (cursor.moveToNext()) {
val videoPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))
val id = cursor.getLong(idColumn)
val title=cursor.getString(titleCol)
val name = cursor.getString(nameColumn)
val duration = cursor.getInt(durationColumn)
val mdate=cursor.getString(date)
val size = cursor.getString(sizeColumn)
val thumb =
ContentUris.withAppendedId(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, id)
var duration_formatted: String
val sec: Int = duration / 1000 % 60
val min: Int = duration / (1000 * 60) % 60
val hrs: Int = duration / (1000 * 60 * 60)
duration_formatted = if (hrs == 0) {
min.toString() + ":" + String.format(Locale.UK, "%02d", sec)
} else {
hrs.toString() + ":" + String.format(
Locale.UK,
"%02d",
min
) + ":" + String.format(
Locale.UK, "%02d", sec
)
}
val folder = Video(thumb.toString(),id,title,name,size, duration_formatted, videoPath, mdate)
marrayList.add(folder)
}
cursor.close()
}
return marrayList
}
2.以下是视频播放器项目的所有[源代码]1
您可以使用所有这些权限,而不受谷歌的任何禁止。你不能/不应该使用MANAGE_EXTERNAL_STORAGE
,新的perm专用于范围存储和文件管理应用程序、抗病毒药物和其他“特权”软件
我正在连接到mysql服务器并进行查询。我一直得到一个ER_BAD_FIELD_ERROR:'field list'中的未知列
我正在尝试创建许多文件,作为用户的一个功能。例如,我可能会编写一个应用程序,为他们过去几周听的每首歌创建一个文件(例如,一个带有歌词的文本文件)。我不能让用户为我生成的每个文件选择目录和文件名,这将花费他们数小时的时间。用户应该可以从其他应用程序访问这些文档。 在Android11中,存储访问框架似乎没有什么用处。我注意到最初有两个有趣的选项: 创建一个新文件(该文件创建启动用户与之交互的活动,以
我有一个DynamoDB表,其中有一个字母数字字符串作为哈希键(例如“D4ED6962-3EC2-4312-A480-96ECBB48C9DA”)。我需要根据表中的另一个字段查询该表,因此我需要我的查询选择所有键,例如我的字段x在dat x和date y之间。 我知道我需要在哈希键上设置一个条件,在范围键上设置另一个条件,但是我很难编写一个不将查询绑定到特定ID的哈希键条件。 我以为我可以使用一个
我有一个复合密钥的实体。订阅和源具有多对多的关系。 我正在使用Spring数据存储库来处理它。 当我尝试使用方法saveAll时,它会抛出 “com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:未知列'subscripti0_.subscription_id'” 同时尝试在保存后返回值。 Hibernate生成以下查询: 所以,现在我
问题内容: 我有一个似乎容易实现的目标,但是我没有找到一个好的解决方案。Google对此没有透露任何信息,我只是希望我一直在错误的地方寻找解决方案,或者只是试图以错误的方式使用工具… 也许今天对我来说想清楚已经太晚了:)但是,我希望这是您可以帮助我的地方。 我只需要能够记录在SQL Server的特定实例上执行的错误查询。我以为SQL Profiler可以让我立即执行此操作,但我无法找到允许我仅记
问题内容: 假设我要编写以下HQL查询: 将其编写为参数化查询的正确方法是什么,例如 问题答案: 我不确定如何使用位置参数来执行此操作,但是如果可以使用命名参数而不是位置参数,则可以将命名参数放在方括号内,并且可以使用Query接口中的setParameterList方法将值列表绑定到此参数。