java.lang.SecurityException:不再支持 MODE_WORLD_READABLE

Posted

技术标签:

【中文标题】java.lang.SecurityException:不再支持 MODE_WORLD_READABLE【英文标题】:java.lang.SecurityException: MODE_WORLD_READABLE no longer supported 【发布时间】:2016-12-31 10:56:13 【问题描述】:

该异常仅发生在 android 7.0 Nougat(模拟器)设备中。

我的代码:

public void SessionMaintainence(Context context) 
    this.context = context;
    preferences = context.getSharedPreferences(PREF_NAME, Context.MODE_WORLD_READABLE);
    editor = preferences.edit();
    editor.commit();

LogCat:

> E/AndroidRuntime: FATAL EXCEPTION: main
>                                                  Process: burpp.av.feedback, PID: 2796
>                                                  java.lang.RuntimeException: Unable to create application
> burpp.av.feedback.FeedbackApplication: java.lang.SecurityException:
> MODE_WORLD_READABLE no longer supported
>                                                      at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5364)
>                                                      at android.app.ActivityThread.-wrap2(ActivityThread.java)
>                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
>                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
>                                                      at android.os.Looper.loop(Looper.java:154)
>                                                      at android.app.ActivityThread.main(ActivityThread.java:6077)
>                                                      at java.lang.reflect.Method.invoke(Native Method)
>                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
>                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
>                                                   Caused by: java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
>                                                      at android.app.ContextImpl.checkMode(ContextImpl.java:2162)
>                                                      at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:363)
>                                                      at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:358)
>                                                      at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:164)
>                                                      at burpp.av.feedback.support.SessionMaintainence.<init>(SessionMaintainence.java:63)
>                                                      at burpp.av.feedback.FeedbackApplication.onCreate(FeedbackApplication.java:43)
>                                                      at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)

【问题讨论】:

查看文档,MODE_WORLD_READABLE 已被弃用,因为它太危险了。:developer.android.com/reference/android/content/… 如错误所示,不支持MODE_WORLD_READABLE。从您的getSharedPreferences() 调用中删除该标志,将其替换为MODE_PRIVATE0 我的应用程序对“MODE_WORLD_READABLE”的需求很大。直到 6.0 都可以正常工作,但不能与 7.0 一起使用 如果我使用MODE_PRIVATE 那么我无法将一些数据共享给其他应用程序。如果我使用MODE_WORLD_READABLE,它确实允许共享一些数据,但它并不安全。那么在这种情况下我该怎么办。 如果我想在另一个应用程序中访问共享偏好值怎么办?你有什么解决办法吗? 【参考方案1】:

全球可读文件可能是一个安全漏洞。所以android首先弃用它,然后完全删除它。 MODE_WORLD_READABLEAndroid M 之前的版本中已被弃用。但在Android N 中不再支持它并抛出SecurityException。所以尝试不同的模式。我使用了Context.MODE_PRIVATE,它成功了。

【讨论】:

这是否也适用于 getDefaultSharedPreferences 方法是context.getSharedPreferences(PREF_NAME, MODE),我没有找到getDefaultSharedPreferences()。如果您要求的是 getSharedPreferences(),那么答案是肯定的,因为我们偏好名称和 MODE(在问题中提出)。 @R.Y 他指的是PreferenceManager.getDefaultSharedPreferences(Context context) @IgorGanapolsky 我认为默认首选项使用私有模式。您要么必须检查 AOSP 源代码,要么可能有人已经在 Internet 上询问过它。无论如何,由于 SharedPreference 是由框架自己创建的,我们可以假设 getDefaultSharedPreferences() 不会发生此异常。 Context.MODE_PRIVATE 也对我有用。谢谢@RakeshYadav

以上是关于java.lang.SecurityException:不再支持 MODE_WORLD_READABLE的主要内容,如果未能解决你的问题,请参考以下文章