rn-fetch-blob: RNFetchBlob download not working on android 9
My code to download the file as below
RNFetchBlob
.config({
path : path,
background: true,
cacheable:false,
timeout: 1000 * 60 * 15 //15 minutes
})
.fetch('GET', forFile.url, {
//some headers ..
})
.then((res) => {
Realm.open({schema: [ScheduleSchema,PlaylistSchema,FileSchema],schemaVersion: schema_version})
.then(realm => {
realm.write(() => {
localPath = Platform.OS === 'android' ? 'file://' + res.path() : `playlists/${playlistName}/${getFileName(forFile)}`
forFile.file_local_path = localPath
console.log('The file saved to ', res.path() + 'for remote url' +forFile.url)
})
}).catch((error) => {
alert("realm open error on file download service", error);
console.log(error);
reject(error)
})
resolve(forFile);
}).catch((error)=>{
console.log("file download error " + error);
showToastMessage(I18n.t("ErrorMessage.ErrorInFileDownload"))
})
This code works fine for android 7 but not on android 9. Error log from Android studio Logcat as below
java.lang.IllegalStateException: cannot make a new request because the previous response is still open: please call response.close()
at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:164)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
at com.RNFetchBlob.RNFetchBlobReq$2.intercept(RNFetchBlobReq.java:385)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:221)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:172)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
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:764)
Versions - “rn-fetch-blob”: “0.11.2” react-native: 0.60.5 Android - buildToolsVersion = “28.0.3” minSdkVersion = 22 //min supported devices, android 5.1 lollipop compileSdkVersion = 28 targetSdkVersion = 28 supportLibVersion = “28.0.3”
Note - Before the call of rn-fetch-blob file download, I have one more API call i.e fetch(react-native) to download playlists JSON.
About this issue
- Original URL
- State: open
- Created 5 years ago
- Reactions: 15
- Comments: 15
try adding to <application>: android:requestLegacyExternalStorage=“true”
Guys, I solved this problem. The approach with Download Manager works because it is a third-party application that already has the required permissions. If you want to download without manager in order to get download progress, it is important to get permissions in your application. And just adding
<uses-permission android: name = "android.permission.WRITE_EXTERNAL_STORAGE" />toAndroidManifest.xmlis not enough. Additionally, you need to explicitly request permission like this: https://reactnative.dev/docs/permissionsandroid. If you doRNFetchBlob.fs.dirs- in every directory that starts with ‘/ storage’ you will need it permission! I hope someone will be useful.Unfortunately this solution does not work when targeting android API 30, as per the documentation:
If anyone finds a solution for this, please share here.
Hi guys , found any solution for this ?
@JerakRus yeah it work, thank you