React Native + Expo-触发android打开本地存储文件的意图。(Android)

Owe*_*wen 5 android android-intent react-native 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) } />} />
            )
        }
    }
Run Code Online (Sandbox Code Playgroud)

我们已经从https://chromium.googlesource.com/android_tools/+/febed84a3a3cb7c2cb80d580d79c31e22e9643a5/sdk/platforms/android-23/data/activity/actions.txt中删除了意图列表

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


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

Vid*_*ana 2

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

展会共享API

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

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

分享文件