当前位置: 首页 > 知识库问答 >
问题:

在Android 11上正确查询MediaStore记录

姜杜吟
2023-03-14

我正在为我的音频/视频播放器应用程序提供Android 11支持。实际上,我主要担心的是,谷歌部落不允许玩家应用程序访问所有文件。我不希望我的应用在谷歌商店发布时被拒绝。

在以前的API中,我使用的是WRITE_EXTERNAL_STORAGE权限,包括Android 10(我选择退出作用域存储)。不过,我不知道如何处理Android11,而不让我的应用在谷歌商店上发布时遭到拒绝。我了解到查询MediaStore记录需要READ_EXTERNAL_STORAGE权限,我有以下问题:

  1. 谷歌(当我在他们的商店发布我的应用程序时)会接受在Android11上运行时要求读取外部存储的请求吗

共有2个答案

庄元龙
2023-03-14

>

乐趣获取视频():数组列表{

     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

亢保赫
2023-03-14

您可以使用所有这些权限,而不受谷歌的任何禁止。你不能/不应该使用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方法将值列表绑定到此参数。