【问题标题】:How to open default gallery app with particular album or folder for Android Q?如何为 Android Q 打开带有特定专辑或文件夹的默认图库应用程序?
【发布时间】:2020-04-21 18:12:21
【问题描述】:

我已尝试按照以下代码打开画廊中的特定文件夹,但它对我不起作用,并且出现无法找到项目的错误。

fun openDirectoryInGallery(context: Context, directory: String) {
        val intent = Intent(Intent.ACTION_VIEW)
        val file = if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), directory)
        } else {
            File(Environment.DIRECTORY_PICTURES.plus(File.separator).plus(directory))
        }

        intent.setDataAndType(Uri.withAppendedPath(Uri.fromFile(file), directory), "*/*")
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        startActivity(context, Intent.createChooser(intent, "Open folder"), Bundle())
    }

【问题讨论】:

  • 我不太确定它是否允许您在图库中打开特定文件夹,因为将列出多个带有选择器意图的应用程序,并且它们可能都无法处理打开特定文件夹的意图.我建议您扫描该文件夹并创建自己的画廊视图。这样一来,所有设备都会保持一致。
  • @ShivamPokhriyal 我找到了解决方案,但它不起作用stackoverflow.com/questions/44858799/…
  • 该解决方案适用于2017,并不意味着也适用于2020
  • 正如我已经提到的,这种方法不能确保图库应用程序会打开您指定的文件夹。可以这样想:假设您已经构建了一个图库应用程序,它将显示您手机中的所有照片,并且其他一些开发人员想要在图库中打开一个特定的文件夹并使用上述意图。现在,您的应用程序也将列在选择器意图中,但您尚未处理显示特定文件夹的意图。如果选择了您的应用程序,它将显示所有照片。这就是我告诉你建立自己的画廊的原因,因为这种行为可能不会在所有设备上保持一致。
  • 我希望这个链接可以帮助你。 stackoverflow.com/questions/13418807/…

标签: android android-10.0


【解决方案1】:

操作系统中从未对此提供支持。这是设备上安装的应用程序的问题。

从来没有要求设备具有能够响应ACTION_VIEW 以获取目录的图库应用。

您的应用在 Android 7.0+ 上应该会因FileUriExposedException 而崩溃,而该异常的存在就是为什么越来越少的应用愿意支持file 方案的原因。

在 Android 10+ 上,file 方案(以及扩展名为 Uri.fromFile())根本毫无意义,好像您的应用可以访问该文件,而其他应用则不能。

最后,Environment.DIRECTORY_PICTURES.plus(File.separator).plus(directory) 不是有效的文件系统路径。

【讨论】:

  • 看起来很不错的答案,你能帮我总结一下吗,我们可以导航到画廊到 Android Q 和 Prior OS 上的特定文件夹吗?
  • 在任何版本的 Android 上都没有可靠的方法来做到这一点。在 Android 10+ 上,您甚至不知道您想要的文件夹是否存在。如果您想继续使用不可靠的代码,则需要让用户通过ACTION_OPEN_DOCUMENT_TREE 选择文件夹,然后祈祷设备具有支持ACTION_VIEW 的图库应用程序@ 987654330@ Uri 指向一棵树而不是一段内容。
  • 能否提供 DocumentsContract.EXTRA_INITIAL_URI 的参考链接?当前在此参数中以 file://... 格式传递 uri,但它不在图片文件夹中导航,上述参数是否需要其他 Uri 格式?
  • @VishalPatoliyaツ:“当前在此参数中以 file://... 格式传递 uri,但它不在图片文件夹中导航”——当然。 DocumentsContract 用于存储访问框架,而不是文件。 “上述参数是否需要其他 Uri 格式?” -- 它必须是您从存储访问框架获得的Uri,例如ACTION_OPEN_DOCUMENT。 “你能给个参考链接吗”--developer.android.com/reference/android/provider/…
  • @VishalPatoliyaツ:“存储访问框架来自 android Q”——存储访问框架自 Android 4.4 以来就已存在。
【解决方案2】:
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent,"SelectPicture"),PICK_IMAGE_REQUEST); 

【讨论】:

  • 不回答问题。 OP 想在画廊而不是整个画廊中打开一个特定的文件夹。
  • @ShivamPokhriyal 是正确的,它不会解决问题。 eagerprince 请理解这个问题,您提供的解决方案将允许在任何地方仅选择图像文件,但是问题陈述有所不同。另外如果你不能简单地解释它,那么你理解的不够好 - 爱因斯坦与其说这不是我的问题,请努力解释。
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2017-04-23
  • 1970-01-01
相关资源
最近更新 更多