Я пытаюсь создать файл настроек для своего приложения с помощью SharedPreferences. Имя файла зашифровано с использованием Base64, например:
settings_tNlnyBx1p2mQRgahrEAviA==.xml (Originally, settings_username.xml)
TNlnyBx1p2mQRgahrEAviA == зависит от пользователей. Если пользователи создают учетные записи с другими адресами электронной почты, результат шифрования отличается.
Однако иногда результат шифрования включает '/' (разделитель путей), и при исключении возникает ошибка. (java.lang.IllegalArgumentException) Я знаю, что в пути не может быть '/', но я не могу запретить пользователю использовать этот адрес электронной почты.
Ошибка выглядит так:
Caused by: java.lang.IllegalArgumentException: File settings_NGX0Ij2z6L/4xgitGr7apA==.xml contains a path separator
at android.app.ContextImpl.makeFilename(ContextImpl.java:2333)
at android.app.ContextImpl.getSharedPrefsFile(ContextImpl.java:400)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:430)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:185)
at com.heartric.useron.MainActivity$override.onCreate(MainActivity.java:32)
at com.heartric.useron.MainActivity$override.access$dispatch(MainActivity.java)
at com.heartric.useron.MainActivity.onCreate(MainActivity.java)
at android.app.Activity.performCreate(Activity.java:6904)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5478)
at android.app.ActivityThread.access$1200(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1827)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7331)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
и мой код:
database = getSharedPreferences("settings_NGX0Ij2z6L/4xgitGr7apA= = ", 0);
Есть ли способ решить эту проблему?
@NickB В моем приложении я должен сделать каждый файл настроек для каждой учетной записи, чтобы упростить резервное копирование и восстановление, поэтому для меня это невозможно
Почему бы вам просто не заменить косую черту на подчеркивание?
@TmTron Не могли бы вы уточнить?
String encodedStr = Base64.encodeToString (originalStr.getBytes (), Base64.URL_SAFE);
Вы можете заменить все косые черты в строке с кодировкой base64 символами подчеркивания, прежде чем использовать ее в качестве имени файла. Но заметка @Subzero - лучший способ.




Можно ли просто использовать SharedPreferences как есть и хранить в нем каждое значение вместо файла конфигурации?