Skip to content

Commit 7b5fb99

Browse files
Ron RadtkeRon Radtke
authored andcommitted
fixing an issue with MediaStore create file for API < Q
1 parent 71d1c44 commit 7b5fb99

File tree

3 files changed

+180
-92
lines changed

3 files changed

+180
-92
lines changed

android/src/main/java/com/ReactNativeBlobUtil/ReactNativeBlobUtil.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -432,29 +432,29 @@ public void createMediaFile(ReadableMap filedata, String mt, Promise promise) {
432432
if (mt == null) promise.reject("ReactNativeBlobUtil.createMediaFile", "invalid mediatype");
433433

434434
FileDescription file = new FileDescription(filedata.getString("name"), filedata.getString("mimeType"), filedata.getString("parentFolder"));
435-
Uri res = ReactNativeBlobUtilMediaCollection.createNewMediaFile(file, ReactNativeBlobUtilMediaCollection.MediaType.valueOf(mt));
435+
Uri res = ReactNativeBlobUtilMediaCollection.createNewMediaFile(file, ReactNativeBlobUtilMediaCollection.MediaType.valueOf(mt), this.getReactApplicationContext());
436436
if (res != null) promise.resolve(res.toString());
437437
else promise.reject("ReactNativeBlobUtil.createMediaFile", "File could not be created");
438438
}
439439

440-
@RequiresApi(api = Build.VERSION_CODES.Q)
441440
@ReactMethod
442441
public void writeToMediaFile(String fileUri, String path, Promise promise) {
443442
boolean res = ReactNativeBlobUtilMediaCollection.writeToMediaFile(Uri.parse(fileUri), path, promise);
444443
if(res) promise.resolve("Success");
445444
}
446445

446+
@RequiresApi(api = Build.VERSION_CODES.Q)
447447
@ReactMethod
448448
public void copyToInternal(String contentUri, String destpath, Promise promise) {
449449
ReactNativeBlobUtilMediaCollection.copyToInternal(Uri.parse(contentUri), destpath, promise);
450450
}
451451

452+
@RequiresApi(api = Build.VERSION_CODES.Q)
452453
@ReactMethod
453454
public void getBlob(String contentUri, String encoding, Promise promise) {
454455
ReactNativeBlobUtilMediaCollection.getBlob(Uri.parse(contentUri), encoding, promise);
455456
}
456457

457-
@RequiresApi(api = Build.VERSION_CODES.Q)
458458
@ReactMethod
459459
public void copyToMediaStore(ReadableMap filedata, String mt, String path, Promise promise) {
460460
if (!(filedata.hasKey("name") && filedata.hasKey("parentFolder") && filedata.hasKey("mimeType"))) {
@@ -471,15 +471,14 @@ public void copyToMediaStore(ReadableMap filedata, String mt, String path, Promi
471471
}
472472

473473
FileDescription file = new FileDescription(filedata.getString("name"), filedata.getString("mimeType"), filedata.getString("parentFolder"));
474-
Uri fileuri = ReactNativeBlobUtilMediaCollection.createNewMediaFile(file, ReactNativeBlobUtilMediaCollection.MediaType.valueOf(mt));
474+
Uri fileuri = ReactNativeBlobUtilMediaCollection.createNewMediaFile(file, ReactNativeBlobUtilMediaCollection.MediaType.valueOf(mt), this.getReactApplicationContext());
475475

476476
if (fileuri == null) {
477477
promise.reject("ReactNativeBlobUtil.createMediaFile", "File could not be created");
478478
return;
479479
}
480480

481481
boolean res = ReactNativeBlobUtilMediaCollection.writeToMediaFile(fileuri, path, promise);
482-
483482
if(res) promise.resolve(fileuri.toString());
484483
}
485484

android/src/main/java/com/ReactNativeBlobUtil/ReactNativeBlobUtilFS.java

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,75 @@ class ReactNativeBlobUtilFS {
4444
this.emitter = ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class);
4545
}
4646

47+
/**
48+
* Write string with encoding to file (used for mediastore)
49+
*
50+
* @param path Destination file path.
51+
* @param encoding Encoding of the string.
52+
* @param data Array passed from JS context.
53+
*/
54+
static boolean writeFile(String path, String encoding, String data, final boolean append) {
55+
try {
56+
int written;
57+
File f = new File(path);
58+
File dir = f.getParentFile();
59+
if (!f.exists()) {
60+
if (dir != null && !dir.exists()) {
61+
if (!dir.mkdirs() && !dir.exists()) {
62+
return false;
63+
}
64+
}
65+
if (!f.createNewFile()) {
66+
return false;
67+
}
68+
}
69+
70+
// write data from a file
71+
if (encoding.equalsIgnoreCase(ReactNativeBlobUtilConst.DATA_ENCODE_URI)) {
72+
String normalizedData = ReactNativeBlobUtilUtils.normalizePath(data);
73+
File src = new File(normalizedData);
74+
if (!src.exists()) {
75+
return false;
76+
}
77+
byte[] buffer = new byte[10240];
78+
int read;
79+
written = 0;
80+
FileInputStream fin = null;
81+
FileOutputStream fout = null;
82+
try {
83+
fin = new FileInputStream(src);
84+
fout = new FileOutputStream(f, append);
85+
while ((read = fin.read(buffer)) > 0) {
86+
fout.write(buffer, 0, read);
87+
written += read;
88+
}
89+
} finally {
90+
if (fin != null) {
91+
fin.close();
92+
}
93+
if (fout != null) {
94+
fout.close();
95+
}
96+
}
97+
} else {
98+
byte[] bytes = ReactNativeBlobUtilUtils.stringToBytes(data, encoding);
99+
FileOutputStream fout = new FileOutputStream(f, append);
100+
try {
101+
fout.write(bytes);
102+
written = bytes.length;
103+
} finally {
104+
fout.close();
105+
}
106+
}
107+
return true;
108+
} catch (FileNotFoundException e) {
109+
// According to https://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html
110+
return false;
111+
} catch (Exception e) {
112+
return false;
113+
}
114+
}
115+
47116
/**
48117
* Write string with encoding to file
49118
*
@@ -57,7 +126,6 @@ static void writeFile(String path, String encoding, String data, final boolean a
57126
int written;
58127
File f = new File(path);
59128
File dir = f.getParentFile();
60-
61129
if (!f.exists()) {
62130
if (dir != null && !dir.exists()) {
63131
if (!dir.mkdirs() && !dir.exists()) {

0 commit comments

Comments
 (0)