android - React Native + Expo - 触发 android Intent 打开本地存储的文件。 (安卓)

标签 android react-native android-intent expo

我们有一个托管的 expo 应用程序,它正在使用 FileSystem.downloadAsync,这没问题。

我们有一个 FlatList,它显示下载文件的列表。

我们不想为世界上的每个应用程序构建一个文件查看器,这不是我们的目标。

我们希望能够从列表中点击一个文件,并可能使用 Android Intent 系统向用户提供他们已经安装的可以处理该文件类型的应用列表。

例如我们有类似的东西


    class FileBrowser extends Component {
        state = {
            files: [
                {
                    key: '1'
                    name: 'file.jpg',
                    sys_path: 'file://blah.jpg'
                }
            ]
        }

        openFile(item) {
            IntentLauncherAndroid.startActivityAsync(
               'android.intent.action.OPEN_DOCUMENT', {
                data: item.sys_path
            })
        }

        render() {
            return (
                <FlatList data={ this.state.files } renderItem={ (item) => <Button title={ item.name } onPress={ this.openFile(item) } />} />
            )
        }
    }

我们几乎已经用尽了 https://chromium.googlesource.com/android_tools/+/febed84a3a3cb7c2cb80d580d79c31e22e9643a5/sdk/platforms/android-23/data/activity_actions.txt 中的 Intent 列表

唯一几乎到达那里的是 android.intent.action.VIEW 但是它只是打开一个随机的应用程序列表,其中没有一个可以处理图像 - 我们还传入了 mime 类型,例如image/jpegimage/* 希望能过滤列表。


在 Android 上仅提供用户在适当的应用程序中打开文件的正确方法是什么?

最佳答案

使用 Expo SDK 34(我使用 expo 34.0.3 因为存在字体无法解决的问题),您可以通过这种方式打开列表。但这不是打开列表的正确解决方案。因为用户必须做一些这样的工作。

expo sharing api

                  await Sharing.shareAsync(
                        fileUri, 
                        {dialogTitle: 'share or copy your pdf via'}
                        ).catch(error =>{
                        console.log(error);
                    })

如果您通过提供本地文件 URI 来执行此操作,您可以看到如下所示的底部操作表。然后用户可以选择复制到选项并将其粘贴到某个位置。在该用户可以打开文件之后,操作系统会询问将使用什么应用程序来打开您的文件。

share files

关于android - React Native + Expo - 触发 android Intent 打开本地存储的文件。 (安卓),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56147618/

相关文章:

Android 4.0.3 ICS ArrayAdapter notifyDataSetChanged 不更新ListView

reactjs - React Native 中如何销毁组件实例以避免内存泄漏并释放 native 代码的底层 View 对象?

ios - 无法在 XCode 中存档 react-native 项目以使用 Pod 进行暂存配置

android - 如何取消警报管理器中的重复任务?

android - 服务不工作?

android - 在 MediaPlayer::Android 中听起来停止得太快

android - 以编程方式前向锁定 Android APK

javascript - 如何将一个简单的 React JS 应用程序从根目录移动到子目录中?

android - ACTION_WEB_SEARCH 仅在第一次打开正确的搜索查询

android - 如何以编程方式启动 "Google Play Games Profile"游戏页面