如何在 Preferencescreen 中 store/get 图片
How to store/get image in PreferencesScreen
我有一个首选项屏幕,我希望用户在其中 select 图片。我这样做恰到好处。我什至设法在 selected 后显示图像。但是,我的问题是这样的。我如何"get"图像?像 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);
}
}
这里有一张截图可以更好地解释:
单击 "select image" 调出图库选择器 - 实际上选择图像会将图像置于视图的中心,就像这样。
感谢帮助!
如果您使用 PreferenceClickListener,则必须自己实现 saving/retrieving 首选项的逻辑。
您可以使用 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());
...
(我会将 saving/retrieving 首选项的所有代码移至自己的 class。)
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();
}
}
我有一个首选项屏幕,我希望用户在其中 select 图片。我这样做恰到好处。我什至设法在 selected 后显示图像。但是,我的问题是这样的。我如何"get"图像?像 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);
}
}
这里有一张截图可以更好地解释:
单击 "select image" 调出图库选择器 - 实际上选择图像会将图像置于视图的中心,就像这样。
感谢帮助!
如果您使用 PreferenceClickListener,则必须自己实现 saving/retrieving 首选项的逻辑。
您可以使用 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());
...
(我会将 saving/retrieving 首选项的所有代码移至自己的 class。)
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();
}
}