Saving to subfolder on internal storage causes crash
taar1 opened this issue · comments
Getting a fatal exception when trying to save a Bitmap to a subfolder in the internal storage. i.e.
INTERNAL_STORAGE/31/public/12jpg
Code:
Storage storage = SimpleStorage.getInternalStorage(context); storage.createFile(contact.getId() + "/public", nextFileName, originalFileAsBitmap);
Error:
07-25 21:55:13.283 1982-1982/net.gazeapp E/AndroidRuntime: FATAL EXCEPTION: main Process: net.gazeapp, PID: 1982 java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2000, result=-1, data=Intent { (has extras) }} to activity {net.gazeapp/net.gazeapp.AddContactActivity_}: java.lang.IllegalArgumentException: File app_31/public contains a path separator at android.app.ActivityThread.deliverResults(ActivityThread.java:3699) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) at android.app.ActivityThread.-wrap16(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5422) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.IllegalArgumentException: File app_31/public contains a path separator at android.app.ContextImpl.makeFilename(ContextImpl.java:1944) at android.app.ContextImpl.getDir(ContextImpl.java:1759) at android.content.ContextWrapper.getDir(ContextWrapper.java:258) at com.sromku.simple.storage.InternalStorage.buildPath(InternalStorage.java:152) at com.sromku.simple.storage.AbstractDiskStorage.createFile(AbstractDiskStorage.java:114) at com.sromku.simple.storage.InternalStorage.createFile(InternalStorage.java:18) at com.sromku.simple.storage.AbstractDiskStorage.createFile(AbstractDiskStorage.java:139) at com.sromku.simple.storage.InternalStorage.createFile(InternalStorage.java:18) at net.gazeapp.utilities.MediaTools.copyFileToPrivateStorage(MediaTools.java:80) at net.gazeapp.AddContactActivity.onActivityResult(AddContactActivity.java:225) at android.app.Activity.dispatchActivityResult(Activity.java:6456) at android.app.ActivityThread.deliverResults(ActivityThread.java:3695) at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742) at android.app.ActivityThread.-wrap16(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5422) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Any suggestions how to get this to work?
I am having the same error. Did you find a fix for this?
For separators, please use File.separator
instead of hard coded "/" char.
I made improvements in latest version. From now on, you will build absolute path by yourself. This code in new version should work for you:
Create directory: INTERNAL_STORAGE/files/31/public/
// init
Storage storage = new Storage(context);
// get path to internal storage files directory
String filesDirectory = mStorage.getInternalFilesDirectory();
// create directory for contact id
String contactFolder = filesDirectory + File.separator + contact.getId();
storage.createDirectory(contactFolder);
// and, folder called public inside (for some reason)
String contactPublicFolder = contactFolder + File.separator + "public";
storage.createDirectory(contactPublicFolder);
Add bitmap to contact folder
// init
Storage storage = new Storage(context);
// build file path (again)
String filesDirectory = mStorage.getInternalFilesDirectory();
String contactFolder = filesDirectory + File.separator + contact.getId();
String contactPublicFolder = contactFolder + File.separator + "public";
// build bitmap path
String filePath = contactPublicFolder + File.separator + nextFileName;
storage.createFile(filePath, originalFileAsBitmap);
Please use the latest version com.snatik:storage:2.1.0
. It has pretty some changes. You can see in README.md full list of options. The most biggest change is that you build absolute path by yourself.
I also added sample app and you can play and see how the lib is used.
Let me know if it helps and if you have any other questions.