我无法获得其他应用程序的共享首选项

时间:2013-08-06 17:01:35

标签: android sharedpreferences android-sharing

我是Android新手。我正在尝试访问另一个应用程序中的一个应用程序的 SharedPreferences 。 但我没有得到这些价值观。

我的代码发布在下面。

SharedPref1中的Create.java

package com.example.sharedpref1;

public class Create extends Activity implements OnClickListener{

    EditText et1,et2;
    Button btn;
    String LogID,Pwd;
    public SharedPreferences loginDetails;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.create);

        et1 = (EditText)findViewById(R.id.etC1);
        et2 = (EditText)findViewById(R.id.etC2);
        btn = (Button)findViewById(R.id.bCreate);
        loginDetails = getSharedPreferences("logid", MODE_WORLD_READABLE);

        btn.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {

        if(v.getId() == R.id.bCreate)
        {
            LogID = et1.getText().toString();
            Pwd = et2.getText().toString();
            Toast.makeText(getApplicationContext(), "User Profile Createad With\nUser ID: "+LogID +"\nPassword: "+Pwd, Toast.LENGTH_LONG).show();
            SharedPreferences.Editor store = loginDetails.edit();
            store.putString("logid", LogID);
            store.putString("pass", Pwd);
            store.commit();

            finish();

        }
    }
}

SharedPref2中的Show.java

package com.example.sharedpref2;

public class Show  extends Activity implements OnClickListener{

    EditText log,pwd;
    Button back;
    public SharedPreferences loginDetails;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.show);

        log = (EditText)findViewById(R.id.etid);
        pwd = (EditText)findViewById(R.id.etPwd);
        back = (Button)findViewById(R.id.bBack);

        back.setOnClickListener(this);

        loginDetails = getSharedPreferences("logid", MODE_WORLD_READABLE);

        log.setText(loginDetails.getString("logid", "defValue"));
        pwd.setText(loginDetails.getString("pass", "defValue"));
    }

    }

我的价值如下 enter image description here

2 个答案:

答案 0 :(得分:1)

  

我正在尝试访问另一个应用程序中的一个应用程序的SharedPreferences。

这是一个坏主意。引用the documentation for MODE_MULTI_PROCESS

  

SharedPreference loading flag:设置后,即使已在此进程中加载​​了共享首选项实例,也会检查磁盘上的文件是否已修改。在应用程序具有多个进程的情况下,有时需要此行为,所有进程都写入相同的SharedPreferences文件。 一般来说,流程之间通常有更好的沟通方式。

(强调补充)

此外,这可行的唯一方法是,如果您制作SharedPreferences MODE_WORLD_READABLE,这意味着任何应用都可以获得这些偏好。有才能的程序员不会这样做,但会使用其他IPC机制,这些机制只能在用户权限的情况下限制两个应用程序之间的通信,以免将用户数据泄露给其他人。

最后,您没有任何可以跨进程工作的代码。 getSharedPreferences()会获得自己的流程的偏好设置。我可以考虑从另一个进程获取SharedPreferences的唯一方法是在getSharedPreferences()上通过Context调用createPackageContext(),而我没有尝试过这个,因为我不会梦想实现你提出的建议。

答案 1 :(得分:0)

如果您需要在应用程序之间共享内容,我建议您使用内容提供商,而不是SharedPrefrences。根据我的经验,在这些情况下,SharedPrefernces是不可靠的。

MODE_WORLD_READABLE在API级别17中被删除。 http://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE