Unity插件调用Android SharedPreferences报NullPointerException问题排查
空对象是什么?
空指针异常里的空对象就是Context实例。getSharedPreferences()是Context类的成员方法,你调用该方法时,用来发起调用的Context对象为null,因此触发了NullPointerException。
是否遗漏Java侧SharedPreferences初始化步骤?
是的,核心问题就是没有正确获取并初始化Context。Android中SharedPreferences必须通过有效的Context实例才能获取,Unity Android插件里不能直接使用空Context调用相关方法。
是否需创建存储文件?如何创建?
不需要手动创建存储文件。当你通过有效的Context调用getSharedPreferences()并执行写入操作(比如editor.apply())时,Android系统会自动在App的私有目录下生成对应的XML文件,路径通常为/data/data/[你的应用包名]/shared_prefs/[你指定的文件名].xml。
正确的插件代码实现
以下是可直接复用的代码示例,解决Context为空的问题:
import android.content.Context; import android.content.SharedPreferences; import com.unity3d.player.UnityPlayer; public class PrefsPlugin { // 获取Unity当前Activity作为有效Context private static Context getAppContext() { return UnityPlayer.currentActivity; } public static void setPreferenceString(String key, String value) { // 获取SharedPreferences实例,MODE_PRIVATE表示仅本应用可访问 SharedPreferences prefs = getAppContext().getSharedPreferences("UnityAppPrefs", Context.MODE_PRIVATE); SharedPreferences.Editor editor = prefs.edit(); editor.putString(key, value); editor.apply(); // 异步写入,性能优于commit() } public static String getPreferenceString(String key, String defaultValue) { SharedPreferences prefs = getAppContext().getSharedPreferences("UnityAppPrefs", Context.MODE_PRIVATE); return prefs.getString(key, defaultValue); } }
关键注意点
UnityPlayer.currentActivity是Unity官方提供的获取当前应用Activity(即有效Context)的正确方式,用它可以彻底避免Context为空的问题。- 你之前的set方法未报错,大概率是代码逻辑未实际触发到需要Context的执行分支,替换为上述代码后即可正常工作。
- 存储文件由系统自动创建,无需手动干预。
内容的提问来源于stack exchange,提问作者Mario Rossi
相关产品推荐
相关产品推荐

