Именование файла с разделителем пути на Android

Я пытаюсь создать файл настроек для своего приложения с помощью 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);

Есть ли способ решить эту проблему?

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

Nick B 11.07.2018 16:10

@NickB В моем приложении я должен сделать каждый файл настроек для каждой учетной записи, чтобы упростить резервное копирование и восстановление, поэтому для меня это невозможно

Mium 11.07.2018 16:12

Почему бы вам просто не заменить косую черту на подчеркивание?

TmTron 11.07.2018 16:15

@TmTron Не могли бы вы уточнить?

Mium 11.07.2018 16:31

String encodedStr = Base64.encodeToString (originalStr.getBytes (), Base64.URL_SAFE);

user10053723 11.07.2018 17:13

Вы можете заменить все косые черты в строке с кодировкой base64 символами подчеркивания, прежде чем использовать ее в качестве имени файла. Но заметка @Subzero - лучший способ.

TmTron 11.07.2018 17:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
191
0

Другие вопросы по теме