如何在PreferencesScreen中存储/获取图像

问题描述 投票:2回答:1

我有一个首选项屏幕,我希望用户选择一个图像。我这样做是对的。我甚至设法在选择后显示图像。但是,我的问题是这个。我如何“获得”图像?像getBoolean(),getString()等,没有“getImageUri”或其他。

这是我当前打开选择器并为我自己的ImageView分配所选图像的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.layout.activity_settings);

    Preference prefereces = findPreference("test");
    prefereces.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        public boolean onPreferenceClick(Preference preference) {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            int PICK_IMAGE = 1;
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE);
            return true;
        }
    });

}

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    if (resultCode == RESULT_OK) {
        Uri selectedImage = imageReturnedIntent.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};

        Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        cursor.close();

        ImageView ok = (ImageView)findViewById(R.id.incognitoView);

        ok.setImageURI(selectedImage);

        Log.d("OK", "Data Recieved! " + filePath);
    }
}

这是一个更好的解释截图:screenshot-1

单击“选择图像”会调出图库选取器 - 实际选择图像会将图像放在视图的中心,就像这样。

screenshot-2

感谢帮助!

android android-preferences
1个回答
2
投票

如果使用PreferenceClickListener,则必须自己实现保存/检索首选项的逻辑。

您可以使用SharedPreferences.Editor编辑SharedPreferences:

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

SharedPreferences.Editor editor = sp.edit();
editor.putString("image_uri", imageUri);
editor.apply();

但是,我不建议将图像URI存储在SharedPreference中,因为以后可能无法访问URI。相反,我会将图像存储在文件系统中,并将引用放在SharedPreference中。

您可以使用ParcelFileDescriptor从URI读取图像:

ParcelFileDescriptor pfd = this.getContentResolver().openFileDescriptor(imageUri, "r");
FileInputStream is = new FileInputStream(pfd.getFileDescriptor());
...

(我会将保存/检索首选项的所有代码移动到自己的类中。)

public class MySettings {

    public static final String PREF_KEY_IMAGE_REF = "pref_image_ref";

    private Context mContext;
    private SharedPreferences mPreferences;

    public MySettings(Context) {
        mContext = context;
        mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public String getImageRef() {
        return mPreferences.getString(PREF_KEY_IMAGE_REF, null);
    }

    public void setImageRef(String imageRef) {
        SharedPreferences.Editor editor = mPreferences.edit();
        editor.putString(PREF_KEY_PREF_KEY_IMAGE_REF, imageRef);
        editor.apply();
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.