12

Android 7.0 Nougat(仿真器)設備中僅發生異常。不再支持java.lang.SecurityException:MODE_WORLD_READABLE

java.lang.SecurityException異常:MODE_WORLD_READABLE不再支持

我的代碼:

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) 
+0

查看文檔,MODE_WORLD_READABLE已棄用,因爲它太危險了:https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE – Opiatefuchs

+4

由於錯誤提示'MODE_WORLD_READABLE'爲不支持。從'getSharedPreferences()'調用中移除該標誌,用'MODE_PRIVATE'或'0'替換它。 – CommonsWare

+0

在我的應用程序中有'MODE_WORLD_READABLE'的巨大需求。它一直工作得很好,直到6.0,但它不工作7.0 –

回答

21

世界可讀的文件可能是一個安全漏洞。所以android首先棄用它,然後完全刪除它。 MODE_WORLD_READABLE已棄用,版本爲Android M。但在Android N不再支持,並拋出SecurityException。所以嘗試一種不同的模式。我用Context.MODE_PRIVATE它工作。

+0

這是否也適用於** getDefaultSharedPreferences **? –

+0

該方法是context.getSharedPreferences(PREF_NAME,MODE),我沒有找到getDefaultSharedPreferences()。如果它是getSharedPreferences()所要求的,那麼答案是肯定的,因爲我們的首選項名稱和模式(在問題中被問到)。 –

+0

@ R.Y他指的是['PreferenceManager.getDefaultSharedPreferences(Context context)'](https://developer.android.com/reference/android/preference/PreferenceManager.html#getDefaultSharedPreferences(android.content.Context))。 – Sufian