sromku / android-storage

Create, read, delete, append, encrypt files and more, on internal or external disk spaces with a really simple API

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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.