You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity插件调用Android SharedPreferences报NullPointerException问题排查

Unity Android插件 SharedPreferences 问题解答

空对象是什么?

空指针异常里的空对象就是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:13:20