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_PRIVATE
或0
。
我的应用程序对“MODE_WORLD_READABLE”的需求很大。直到 6.0 都可以正常工作,但不能与 7.0 一起使用
如果我使用MODE_PRIVATE
那么我无法将一些数据共享给其他应用程序。如果我使用MODE_WORLD_READABLE
,它确实允许共享一些数据,但它并不安全。那么在这种情况下我该怎么办。
如果我想在另一个应用程序中访问共享偏好值怎么办?你有什么解决办法吗?
【参考方案1】:
全球可读文件可能是一个安全漏洞。所以android首先弃用它,然后完全删除它。 MODE_WORLD_READABLE
在 Android 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的主要内容,如果未能解决你的问题,请参考以下文章