|
@@ -2,9 +2,49 @@
|
|
|
|
|
|
|
|
package io.legado.app.utils
|
|
package io.legado.app.utils
|
|
|
|
|
|
|
|
|
|
+import android.annotation.SuppressLint
|
|
|
|
|
+import android.app.Activity
|
|
|
|
|
+import android.content.Context
|
|
|
|
|
+import android.content.ContextWrapper
|
|
|
import android.content.SharedPreferences
|
|
import android.content.SharedPreferences
|
|
|
import androidx.core.content.edit
|
|
import androidx.core.content.edit
|
|
|
|
|
+import java.io.File
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 获取自定义路径的SharedPreferences, 用反射生成 SharedPreferences
|
|
|
|
|
+ * @param dir 目录路径
|
|
|
|
|
+ * @param fileName 文件名,不需要 '.xml' 后缀
|
|
|
|
|
+ * @return SharedPreferences
|
|
|
|
|
+ */
|
|
|
|
|
+@SuppressLint("DiscouragedPrivateApi")
|
|
|
|
|
+fun Context.getSharedPreferences(
|
|
|
|
|
+ dir: String,
|
|
|
|
|
+ fileName: String
|
|
|
|
|
+): SharedPreferences? {
|
|
|
|
|
+ try {
|
|
|
|
|
+ // 获取 ContextWrapper对象中的mBase变量。该变量保存了 ContextImpl 对象
|
|
|
|
|
+ val fieldMBase = ContextWrapper::class.java.getDeclaredField("mBase")
|
|
|
|
|
+ fieldMBase.isAccessible = true
|
|
|
|
|
+ // 获取 mBase变量
|
|
|
|
|
+ val objMBase = fieldMBase.get(this)
|
|
|
|
|
+ // 获取 ContextImpl。mPreferencesDir变量,该变量保存了数据文件的保存路径
|
|
|
|
|
+ val fieldMPreferencesDir = objMBase.javaClass.getDeclaredField("mPreferencesDir")
|
|
|
|
|
+ fieldMPreferencesDir.isAccessible = true
|
|
|
|
|
+ // 创建自定义路径
|
|
|
|
|
+ val file = File(dir)
|
|
|
|
|
+ // 修改mPreferencesDir变量的值
|
|
|
|
|
+ fieldMPreferencesDir.set(objMBase, file)
|
|
|
|
|
+ // 返回修改路径以后的 SharedPreferences :%FILE_PATH%/%fileName%.xml
|
|
|
|
|
+ return getSharedPreferences(fileName, Activity.MODE_PRIVATE)
|
|
|
|
|
+ } catch (e: NoSuchFieldException) {
|
|
|
|
|
+ e.printOnDebug()
|
|
|
|
|
+ } catch (e: IllegalArgumentException) {
|
|
|
|
|
+ e.printOnDebug()
|
|
|
|
|
+ } catch (e: IllegalAccessException) {
|
|
|
|
|
+ e.printOnDebug()
|
|
|
|
|
+ }
|
|
|
|
|
+ return null
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
fun SharedPreferences.getString(key: String): String? {
|
|
fun SharedPreferences.getString(key: String): String? {
|
|
|
return getString(key, null)
|
|
return getString(key, null)
|