@r4dic4l/react-native-open-doc
This is a fork of react-native-open-doc.
Open files stored on device for preview - Android and iOS.
Pick files using native file pickers for iOS and Android (UIDocumentPickerViewController / Intent.ACTION_OPEN_DOCUMENT)
Share files on Android (for iOS use the react-native Share.share({ url: selectedUri }) api, see https://reactnative.dev/docs/share#share for more details).
Getting started
$ npm install @r4dic4l/react-native-open-doc --save
Mostly automatic installation
$ react-native link @r4dic4l/react-native-open-doc
Android ONLY:
Define a FileProvider
Define a file provider in your AndroidManifest.xml.
Note that the authorities value should be <your package name>.provider
, for example:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.mydomain.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
In meta-data, all supported files should be listed. @xml/provider_paths takes values configured in xml/provider_paths.xml.
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="shared" path="."/>
<external-path name="shared" path="."/>
<external-files-path name="shared" path="."/>
<root-path name="root" path="."/>
</paths>
Define intents for actions for package visibility in android 11
For actions in this package, the following intents are necessary in your AndroidManifest.xml.
<manifest>
...
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.SEND" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.intent.action.OPEN_DOCUMENT" />
<data android:mimeType="*/*" />
</intent>
</queries>
...
</manifest>
Manual installation
iOS
- In XCode, in the project navigator, right click
Libraries
➜ Add Files to [your project's name]
- Go to
node_modules
➜ react-native-open-doc
and add RNCOpenDoc.xcodeproj
- In XCode, in the project navigator, select your project. Add
libRNCOpenDoc.a
to your project's Build Phases
➜ Link Binary With Libraries
- Run your project (
Cmd+R
)<
Android
- Open up
android/app/src/main/java/[...]/MainActivity.java
- Add
import com.capriza.reactlibrary.RNCOpenDocPackage;
to the imports at the top of the file - Add
new RNCOpenDocPackage()
to the list returned by the getPackages()
method
- Append the following lines to
android/settings.gradle
:
include ':react-native-open-doc'
project(':react-native-open-doc').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-open-doc/android')
- Insert the following lines inside the dependencies block in
android/app/build.gradle
:
implementation project(':react-native-open-doc')
- Define a FileProvider
Usage
import RNCOpenDoc from '@r4dic4l/react-native-open-doc';
RNCOpenDoc.open(pathToFile);
RNCOpenDoc.openWithSuggestedMime(contentUri, suggestedMimeType);
RNCOpenDoc.share(pathToFile);
RNCOpenDoc.shareWithSuggestedMime(pathToFile, suggestedMimeType);
RNCOpenDoc.pick(null, (error, files) => {
if (error) {
console.log(`error in RNCOpenDoc.pick ${error}`);
}
else if (files) {
this.handleSelectedFiles(files);
}
});
files
is an array of objects with the following properties:
fileName
(string) e.g. "foo.html"fileSize
(number) (iOS only) File size in bytesmimeType
(string) (iOS only) e.g. "text/html"uri
(string) Example (iOS): "file:///private/var/mobile/Containers/Data/Application/.../foo.html"