如何从意图打开默认文件应用程序中的 DCIM/Camera 文件夹

Posted

技术标签:

【中文标题】如何从意图打开默认文件应用程序中的 DCIM/Camera 文件夹【英文标题】:How to open DCIM/Camera folder in default Files app from intent 【发布时间】:2021-04-03 21:21:12 【问题描述】:

我正在制作一个相机应用程序,它同时拍摄前置摄像头和后置摄像头图像/视频,我不希望每个文件的相机预览中都有单独的缩略图。

我想使用“文件”应用打开“/storage/emulated/0/DCIM/Camera”文件夹,并进一步打开 ACTION_GET_CONTENT 无法使用的照片/视频,因为它选择图像并退出“文件”应用,如此处尝试-

    val intent = Intent(Intent.ACTION_GET_CONTENT)
    val uri: Uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).path.toString() + "/Camera")
    intent.setDataAndType(uri, "*/*")
    startActivity(Intent.createChooser(intent, "Open folder"))

我也尝试过 ACTION_VIEW,但它并不特定于一个文件夹,并会打开显示所有媒体的库 -

    val intent = Intent()
    intent.action = Intent.ACTION_VIEW
    intent.type = "image/*"
    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
    startActivity(intent)

“image/*”在画廊中也显示图像和视频,这对我来说很好。当使用“*/*”时,我们也可以使用“文件”应用程序,但它会打开下载文件夹。 我发现的一种解决方案仅适用于此处尝试的 ES Explorer -

    val uri: Uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).path.toString() + "/Camera")
    val intent = Intent(Intent.ACTION_VIEW)
    intent.setDataAndType(uri, "resource/folder")
    startActivity(intent)

这是由于不支持“资源/文件夹”导致崩溃。将“资源/文件夹”更改为“*/*”会使“文件”应用打开下载文件夹,而“照片”应用会挂起。

似乎画廊可以通过buckets 做到这一点,但它也不是通用的。

我的要求不高,只是显示我的相机文件夹,我可以从中打开和查看任何照片/视频。

【问题讨论】:

我愿意在这个问题上加分,但找不到选项。 我们等到您找到选项并且我们知道赏金;-)。 我发现我可以在 2 天后添加赏金,但最低声望是 50。***.com/help/bounty。我想我需要花更多的时间在这里! 是的,您可以在这里花一些时间阅读一些标记为“android”的 *** 页面,因为之前有人问过您想要什么。 但是.. 您可以让选择器在与用户之前选择文件的文件夹相同的文件夹中打开。如果您将获得的内容方案 uri 放在额外的下一个意图中,那么它就可以工作。谷歌搜索 INITIAL_URI。 【参考方案1】:

如果用户没有使用 ACTION_GET_CONTENT 选择一个文件,这是不可能的。

但是现在...试试这个代码:

String scheme = "content://com.android.externalstorage.documents/document/primary%3APictures";
//  String scheme = "content://com.android.externalstorage.documents/document/primary%3ADCIM%2FCamera";

Uri uri = Uri.parse(scheme);

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

intent.setType("*/*");
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri); // Added in API level 26 

startActivityForResult(intent, 12345);

Toast.makeText(context, "Picker opened in:\n\n" + uri.toString(), Toast.LENGTH_LONG).show();

它在这里工作,我很惊讶。

【讨论】:

它没有解决我的问题,因为我只能查看缩略图,如果我点击它们,它们会被选中并返回,而不是打开。这就是 ACTION_GET_CONTENT 的问题。 当然。 ACTION_GET_CONTENT 就是这样。它用于选择文件。与在某个文件夹中打开无关。正常行为。我想我不清楚你想要什么。 我只想在 DCIM/Camera 文件夹中打开“文件”应用 用 action_view 和报告试试这个。 在很多设备上都没有“文件”应用。【参考方案2】:

要从某个文件夹开始打开“文件”应用,您可以使用以下代码,但遗憾的是仅适用于 Android 11 设备。

//String scheme = "content://com.android.externalstorage.documents/document/primary%3APictures";
//String scheme = "content://com.android.externalstorage.documents/document/primary%3ADownload";
//String scheme = "content://com.android.externalstorage.documents/document/10F9-2E19%3ADownload";
String scheme = "content://com.android.externalstorage.documents/document/primary%3ADCIM%2FCamera";

Uri uri = Uri.parse(scheme);

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setDataAndType(uri, "vnd.android.document/root"); 

startActivity(intent );

Toast.makeText(context, "Files app opening in:\n\n" + uri.toString(), Toast.LENGTH_LONG).show();

                

【讨论】:

很高兴他们在 Android 11 中添加了这个,不幸的是,我的应用是基于 Android 10 的。 这不是您应用的编译版本。它是所用设备的 Android 版本。 目标设备装有Android 10,我无法更改。

以上是关于如何从意图打开默认文件应用程序中的 DCIM/Camera 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何从意图过滤器接收 pdf 文件 - Android

如何使用意图打开指定文件夹中的画廊

如何使我的应用程序对打开 PDF 文件的隐式意图可见?

如何使用默认裁剪意图裁剪 android marshmallow 中的图像?

如何将活动中的意图传递给已打开的片段

如何处理通知中的待处理意图