【问题标题】:My sharedprefrences not sharing correctly我的 sharedprefrences 没有正确分享
【发布时间】:2019-08-16 06:13:16
【问题描述】:

我有一个应用程序,您可以在其中将图像上传到我的公司服务器 因此,用户输入他们的登录详细信息、电子邮件、密码和客户端 ID(4 位代码)(在 LoginActivity.java 中),然后必须将此信息传递给所有其他活动,然后使用此传递的信息来构建 URL。现在我遇到的问题是 Sharedprefrences 没有正确共享......它们要么在 url 上显示为 NULL,要么只是“电子邮件”或“密码” 信息已正确保存在登录活动中,但是当我尝试将其传递给其他活动时失败

登录活动在这里我保存了偏好

public class LoginActivity extends AppCompatActivity implements TextWatcher {


    SharedPreferences MyPrefs;
    Intent intent;
    SharedPreferences.Editor editor;
    public static final String PREF_NAME= "MYPREFS";
    public static final  String ID = "ClientID" ;
    public static final  String EMAIL = "username" ;
    public static final  String PASS = "password";

    EditText email, password, id;

    @SuppressLint("CommitPrefEdits")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Button buttonOne=findViewById(R.id.button);
        buttonOne.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {



                Intent activity2Intent=new Intent(getApplicationContext(), MainActivity.class);
                startActivity(activity2Intent);

    }
});

        MyPrefs= getSharedPreferences(PREF_NAME, 0);
        editor = MyPrefs.edit();


        email=findViewById(R.id.emailtext);
        password=findViewById(R.id.pwdtext);
        id=findViewById(R.id.clientid);

        email.setText(MyPrefs.getString(EMAIL,"username"));
        password.setText(MyPrefs.getString(PASS,"password"));
        id.setText(MyPrefs.getString(ID, "id"));
        email.addTextChangedListener(this);
        password.addTextChangedListener(this);
        id.addTextChangedListener(this);

        MyPrefs =getSharedPreferences(EMAIL,0);
        MyPrefs =getSharedPreferences(ID,0);
        MyPrefs =getSharedPreferences(PASS,0);
        intent = new Intent(LoginActivity.this,CameraActivity.class);


    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        managePrefs();
    }

    @Override
    public void afterTextChanged(Editable editable) {
managePrefs();

    }


    private void managePrefs(){
        SharedPreferences.Editor editor =MyPrefs.edit();

        editor.putString(EMAIL, email.getText().toString().trim());
        editor.putString(PASS, password.getText().toString().trim());
        editor.putString(ID, id.getText().toString().trim());

        editor.apply();

    }

    @Override
    public void onPointerCaptureChanged(boolean hasCapture) {

    }
}

Camera Activity 这是必须将共享偏好传递给的地方

public class CameraActivity extends AppCompatActivity implements View.OnClickListener {

    private final int PICK_IMAGE=12345;
    private final int REQUEST_CAMERA=6352;
    private static final int REQUEST_CAMERA_ACCESS_PERMISSION=5674;
    private Bitmap bitmap;

    String myURL;
    String email;
    String clientId;
    String pwd;




    private ImageView imageView;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

我调用 sharedprefrences 的代码

SharedPreferences sharedPreferences = getSharedPreferences(LoginActivity.PREF_NAME, 0);
         email = sharedPreferences.getString(LoginActivity.EMAIL, "username");
    clientId = sharedPreferences.getString(LoginActivity.ID, "id");
       pwd = sharedPreferences.getString(LoginActivity.PASS, "password");


        imageView=findViewById(R.id.imageView);
        Button fromCamera=findViewById(R.id.fromCamera);
        Button fromGallery=findViewById(R.id.fromGallery);
        Button upload=findViewById(R.id.upload);
        upload.setOnClickListener(this);
        fromCamera.setOnClickListener(this);
        fromGallery.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {



        switch (view.getId()) {
            case R.id.fromCamera:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
                        && ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[]{Manifest.permission.CAMERA},
                            REQUEST_CAMERA_ACCESS_PERMISSION);
                } else {
                    getImageFromCamera();
                }
                break;
            case R.id.fromGallery:
                getImageFromGallery();
                break;
            case R.id.upload:
                if (bitmap != null)
                    uploadImageToServer();
                break;

        }


    }


    private void uploadImageToServer() {
        @SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HH_mm_ss");
        String currentTimeStamp = dateFormat.format(new Date());
        final ProgressDialog pd=new ProgressDialog(CameraActivity.this);
        pd.setMessage("Uploading, Please Wait....");
        pd.show();
        Intent intent = getIntent();
        String Item= intent.getStringExtra("Spinner");
        String Item2= intent.getStringExtra("Spinner2");


        Uri.Builder builder=new Uri.Builder();
        builder.scheme("https")
                .authority("www.smartpractice.co.za")
                .appendPath("files-upload-ruben.asp")
                .appendQueryParameter("MyForm", "Yes")
                .appendQueryParameter("ClientID",clientId)
                .appendQueryParameter("Username", email)
                .appendQueryParameter("Pwd", pwd)
        .appendQueryParameter("category",Item )
        .appendQueryParameter("client",Item2 );
        myURL=builder.build().toString();
        Toast toast = Toast.makeText(CameraActivity.this, myURL , Toast.LENGTH_LONG);
        toast.show();

        File imageFile=persistImage(bitmap,currentTimeStamp);

        Ion.with(this)
                .load(myURL)
                .uploadProgressDialog(pd)
                .setMultipartFile("SP-LOG", "image/jpeg", imageFile)


                .asString()


                .setCallback(new FutureCallback<String>() {
                    @Override
                    public void onCompleted(Exception e, String result) {
                     pd.cancel();
                        Toast.makeText(getApplicationContext(),"Uploaded",Toast.LENGTH_SHORT).show();

                    }
                });

    }

    private File persistImage(Bitmap bitmap, String name) {
        File filesDir=getApplicationContext().getFilesDir();
        File imageFile=new File(filesDir, name + ".jpg");

        OutputStream os;
        try {
            os=new FileOutputStream(imageFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);
            os.flush();
            os.close();
        } catch (Exception e) {
            Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
        }

        return imageFile;
    }


    private void getImageFromCamera() {
        Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, REQUEST_CAMERA);
    }

    private void getImageFromGallery() {
        Intent intent=new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
        }
    }

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE) {
            if (resultCode == Activity.RESULT_OK) {
                try {
                    InputStream inputStream=getContentResolver().openInputStream(data.getData());
                    bitmap=BitmapFactory.decodeStream(inputStream);
                    imageView.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

            }
        } else if (requestCode == REQUEST_CAMERA) {
            if (resultCode == Activity.RESULT_OK) {
                Bundle extras=data.getExtras();
                bitmap=(Bitmap) extras.get("data");
                imageView.setImageBitmap(bitmap);
            }
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_CAMERA_ACCESS_PERMISSION) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                getImageFromCamera();
            }
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        }
    }
}

【问题讨论】:

  • 你为什么叫这个代码行? MyPrefs =getSharedPreferences(EMAIL,0); MyPrefs =getSharedPreferences(ID,0); MyPrefs =getSharedPreferences(PASS,0);
  • 我只编写了 2 周的代码,这是我试图调用这些信息的尝试......我真的不知道...... :]
  • “当我尝试将它传递给其他活动时它失败了”是什么意思。你的意思是,你不能从 sharedPreference 中获得价值?
  • @Kabir,是的,我使用 sharedprefrences 来构建带有 URI 的 URL。 builder 所以当信息被传递时,我的 URL 中会出现 NULL
  • 检查一下 sharedPrefernece:abhiandroid.com/programming/shared-preference

标签: java android android-activity sharedpreferences


【解决方案1】:

要将数据存储在共享首选项中,请执行以下操作:

private SharedPreferences.Editor editor = getSharedPreferences(PREF_NAME, MODE_PRIVATE).edit();
                    editor.putString("email", email);
                    editor.putString("ID", id);
                    editor.putString("Pass", password);
                    editor.apply();

所以当你写 editor.putString("email", email); 时,我会给你一些解释。它告诉编辑器将您的电子邮件与关键“电子邮件”放在一起。

现在,如果您想读回这些值,请这样做:

String email = getSharedPreferences(PREF_NAME, MODE_PRIVATE).getString("email", "");
String ID= getSharedPreferences(PREF_NAME, MODE_PRIVATE).getString("ID", "");
String password= getSharedPreferences(PREF_NAME, MODE_PRIVATE).getString("Pass", "");

如果你不明白什么,请告诉我。

【讨论】:

    【解决方案2】:

    getSharedPrerencences(String name, int mode) 返回对共享首选项文件name 的引用。也就是行后

    MyPrefs =getSharedPreferences(EMAIL,0);
    MyPrefs =getSharedPreferences(ID,0);
    MyPrefs =getSharedPreferences(PASS,0);
    

    您的变量 MyPrefs 指向名为 password 的共享首选项文件,这可能不是您想要的,因为稍后您从名为 MYPREFS 的文件中读取。

    此外,如果您只是从首选项中读取信息,则无需致电 editor = MyPrefs.edit();,就像您在 onCreate 中所做的那样。这就是为什么您会收到使用@SuppressLint("CommitPrefEdits") 抑制的警告

    【讨论】:

    • 对不起,我不知道你在说什么,我对编码非常陌生
    猜你喜欢
    • 2016-02-07
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多