마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 Preference 파일 읽기/쓰기 질문드립니다.

0 추천

다른 App의 Preference xml 파일 값을 읽어오고 쓰는 과정에서

문의드립니다.

 

Application A

A 앱은 test.xml 파일에 ment key 값으로 hello 를 써놓은 상태입니다.

        pref = getSharedPreferences("test", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);      
      
        editor = pref.edit();
        editor.putString("ment", "hello");
        editor.commit();

 

Application B

B앱은 A의 Preference 파일(test.xml)의 ment key 값을 읽고 bye라고 썼습니다.

try {
            mContext =createPackageContext("com.pref1", Context.CONTEXT_IGNORE_SECURITY);
         } catch (NameNotFoundException e) {         
          e.printStackTrace();         
  }

pref = mContext.getSharedPreferences("test", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE);

 SharedPreferences.Editor editor = pref.edit();
        editor.putString("ment", "bye");
        editor.commit();

Log.d(TAG, "ment= " + pref.getString("ment", "nothing"); //bye로 찍힘

 

Application B에서 write후 Log를 찍어보면 bye로 읽혀집니다.

하지만, data/data/A의PackageName/shared_prefs/test.xml 파일을 열어보면

hello로 가지고 있습니다.

분명히 B에서 wirte를 했지만, B의 로그상에서는 바뀐것으로 표시되지만

실제 파일을 열어보면 값이 변경되지 않았습니다.

 

이 부분이 왜  이러는 걸까요 ㅠ.ㅠ

이래저래 구글링해봐도 이유를 찾을수가 없네요.

 

아시는 분의 답변 쫌 부탁드립니다.

국화향기 (430 포인트) 님이 2013년 4월 12일 질문

2개의 답변

+1 추천
제가 해당소스로 테스트해본결과 정상적으로 동작합니다.

패키지명을 다시한번 확인해보시기 바랍니다,,

그래도 안되신다면 b에서 변경요청시 로그를 잘보세요.

실패원인을 찾으실수있을겁니다,
익명사용자 님이 2013년 4월 12일 답변
2013년 4월 12일 reshown
0 추천
A 앱에서 getSharedPreferences("test", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE);

이렇게 해서 SharedPreferences 를 생성했습니다.

 

B 앱에서도 getSharedPreferences("test", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE);

이렇게 해서 SharedPreferences 를 생성했습니다.

 

그렇다면 test.xml 파일은 1개만 존재할까요?

아닙니다. 각각의 앱의 데이터 영역에 각자의 test.xml 파일을 만듭니다.

그리고 그 파일을 읽습니다.

 

단지 MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE 이렇게 설정해 주면

다른 앱에서도 해당 파일의 경로로 접근하면 읽고 쓸수 있게 권한만 풀어준 상태가 됩니다.

 

B에서 A의 test.xml 파일에 접근하려면 SharedPreferences 말고

그냥 파일로 접근해서 읽고 쓰기를 해야 합니다.

 

참고로 MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE 은

api 17 부터 deprecated 되었습니다. 보안상 이유로 위험하니까 쓰지 말랍니다.
원조안드로이드 (58,190 포인트) 님이 2013년 4월 12일 답변
위 내용중에서 B는
mContext.getSharedPreferences("test", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE);

이런식으로 A의 context를 읽어와서 Preference 파일을 받아오는데요.
이경우 각각의 APP이 test 파일을 갖고 있는게 아니라
B도 A의 것을 보고 있지 않나요?
그런 경우에는 됩니다.
밑에 분의 답변처럼 가능합니다.
...