anggrayudi / anggrayudi/SimpleStorage

MediaStore lost access to files after uninstalling the app or clearing its data

Open
#103 7 comments 0 reactions 0 assignees View on GitHub
bug wontfix
Dominant language
Kotlin
Stars
867
Forks
104
Avg merge
22d 6h
Merged PRs (30d)
1

Description

Library version: 1.5.1
OS version: [Android 12]
Device model: [Emulator Pixel 5]

**Describe the bug**
I'm creating a txt file in **Downloads** folder with this code:
```kotlin
fun writeToConfig() {
val file = MediaStoreCompat.createDownload(
context,
FileDescription("config-test.txt", "", "text/plain"),
CreateMode.REUSE,
)
file?.openOutputStream(true).use {
it?.write("HelloWorld\n".toByteArray())
}
}
```
And I'm reading the file with this approach:
```kotlin
fun readConfig() {
val file = MediaStoreCompat.fromFileName(context, MediaType.DOWNLOADS, "config-test.txt")
file?.openInputStream()?.use {
val text = it.readBytes().toString(Charsets.UTF_8)
logD(text)
}
}
```
Everything works fine. But after I uninstall the app and reinstall it, when I call the `readConfig()` function, the file variable is null. and strange thing is that when i call the `writeToConfig()` function again, instead of reusing the same file it creates a new file with this name: **"config-test (1).txt"**.
So after I saw this, I tried to retest the code and I deleted the files (**""config-test.txt"** and **"config-test (1).txt"**). After force stopping and relaunching the app I got an Exception: `android.database.sqlite.SQLiteConstraintException`.
After this exception you cant work with this code anymore and the only way to fix this crash is that you need to wipe data from your device settings.
So we have **two** bugs in here

**To Reproduce**
1. Use `MediaStoreCompat` to write/read a file in Downloads folder.
2. Unistall the app
3. Install the app
4. (Bug 1 appears)
5. Go to Downloads folder and manually delete the file.
6. Force stop the app
7. launch the app again.
8. (Bug 2 --> Crash)

**Stacktrace**
```
FATAL EXCEPTION: main
Process: app.source.getcontact, PID: 8835
java.lang.RuntimeException: Unable to create application com.test.myapp.DebugApp: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: files._data (code 2067 SQLITE_CONSTRAINT_UNIQUE)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6730)
at android.app.ActivityThread.access$1500(ActivityThread.java:247)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2053)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: files._data (code 2067 SQLITE_CONSTRAINT_UNIQUE)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:178)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:557)
at android.content.ContentResolver.insert(ContentResolver.java:2193)
at android.content.ContentResolver.insert(ContentResolver.java:2155)
at com.anggrayudi.storage.media.MediaStoreCompat.createMedia(MediaStoreCompat.kt:143)
at com.anggrayudi.storage.media.MediaStoreCompat.createDownload(MediaStoreCompat.kt:34)
at com.test.myapp.ConfigCache.writeToConfig(ConfigCacheImpl.kt:37)
at com.test.myapp.DebugApp.onCreate(DebugApp.kt:7)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1211)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6725)
at android.app.ActivityThread.access$1500(ActivityThread.java:247) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2053) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loopOnce(Looper.java:201) 
at android.os.Looper.loop(Looper.java:288) 
at android.app.ActivityThread.main(ActivityThread.java:7839) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.