FileSystem.writeAsStringAsync crashes

Viewed 270

Overview

  1. SDK Version: 41
  2. Platforms: Android

I've just updated my expo application from 40 to 41 and then this line of code started to crash:

await FileSystem.writeAsStringAsync(filename, aux, {
                encoding: FileSystem.EncodingType.UTF8,
            });

This is the whole function:

export async function writeExternalData(data: CombinedDataModelInterfaces) {
    try {
        console.log(TAG, '::writeExternalData::data:', data);
        // const { status } = await Permissions.askAsync(Permissions.CAMERA_ROLL);
        const {status,granted} = await MediaLibrary.requestPermissionsAsync()
        console.log(TAG,'::status:',status,'::granted:',granted)
        if (status === 'granted') {
            let tempname = 'lotusdata_' + new Date().toISOString();
            let filename = FileSystem.documentDirectory + tempname + '.json';
            console.log(TAG, '::filename:' + filename);
            const aux = JSON.stringify(data)
            console.log(TAG,'::data as json string:',aux)
            await FileSystem.writeAsStringAsync(filename, aux, {
                encoding: FileSystem.EncodingType.UTF8,
            });
            console.log(TAG,'::createAssetAsync')
            await MediaLibrary.createAssetAsync(filename);
            console.log(TAG,'::assetAsync created')
            return filename;
        } else {
            return new Error('Permissions denied... :(');
        }
    } catch (error) {
        return error;
    }
}

Relevant lib versions:

    "expo": "^41.0.0",
    "expo-document-picker": "~9.1.2",
    "expo-file-system": "~11.0.2",
    "expo-media-library": "~12.0.2",
    "expo-permissions": "~12.0.1",
    "expo-sharing": "~9.1.2",
    "expo-sqlite": "~9.1.0",
    "expo-status-bar": "~1.0.4",
    "react": "16.13.1",
    "react-dom": "16.13.1",
    "react-native": "https://github.com/expo/react-native/archive/sdk-41.0.0.tar.gz",

Native error code that I get

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$4.done(AsyncTask.java:399)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
    at java.util.concurrent.FutureTask.run(FutureTask.java:271)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.contains(java.lang.CharSequence)' on a null object reference
    at abi41_0_0.expo.modules.medialibrary.MediaLibraryUtils.getRelativePathForAssetType(MediaLibraryUtils.java:1)
    at abi41_0_0.expo.modules.medialibrary.MediaLibraryUtils.getEnvDirectoryForAssetType(MediaLibraryUtils.java:1)
    at abi41_0_0.expo.modules.medialibrary.CreateAsset.createAssetFile(CreateAsset.java:4)
    at abi41_0_0.expo.modules.medialibrary.CreateAsset.doInBackground(CreateAsset.java:4)
    at abi41_0_0.expo.modules.medialibrary.CreateAsset.doInBackground(CreateAsset.java:1)
    at android.os.AsyncTask$3.call(AsyncTask.java:378)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    ... 3 more```
1 Answers

What does your URI looks like? Expo says that if its a SAF URI that you have to create the file before you write to it.

Also, where's your metro console logging? If that is failing, then I would clean the android project

cd android && ./gradlew clean && cd .. && npm run android
Related