ログイン後のアプリケーションでは、ユーザー名と画像を他のページの共有設定に保存する必要があります。名前を優先して保存できますが、画像の保存方法がどこにもありません。
私はそのようなことを試みています-
SharedPreferences myPrefrence;
String namePreferance="name";
String imagePreferance="image";
SharedPreferences.Editor editor = myPrefrence.edit();
editor.putString("namePreferance", itemNAme);
editor.putString("imagePreferance", itemImagePreferance);
editor.commit();
画像をオブジェクトに変換した後、文字列として保存しようとしています。しかし、ビットマップに再変換しても何も得られませんでした。
私はあなたの問題を解決してそのようなことをします:
ビットマップを文字列base64にエンコードする書き込みメソッド
// method for bitmap to base64
public static String encodeTobase64(Bitmap image) {
Bitmap immage = image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immage.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
Log.d("Image Log:", imageEncoded);
return imageEncoded;
}
このメソッド内でビットマップを好みのように渡します。
SharedPreferences.Editor editor = myPrefrence.edit();
editor.putString("namePreferance", itemNAme);
editor.putString("imagePreferance", encodeTobase64(yourbitmap));
editor.commit();
また、画像をどこにでも表示したい場合は、decodeメソッドを使用して再度ビットマップに変換します。
// method for base64 to bitmap
public static Bitmap decodeBase64(String input) {
byte[] decodedByte = Base64.decode(input, 0);
return BitmapFactory
.decodeByteArray(decodedByte, 0, decodedByte.length);
}
このメソッド内に文字列を渡し、必要な操作を行ってください。
Finally I solved this problem.
手順:-1.以前のアクティビティからインテントデータを取得するために、onCreate()にコードを記述しました
private Bitmap bitmap;
Intent intent = getIntent();
if (getIntent().getExtras() != null)
{
// for get data from intent
bitmap = intent.getParcelableExtra("PRODUCT_PHOTO");
// for set this picture to imageview
your_imageView.setImageBitmap(bitmap);
sharedPreferences();
}else
{
retrivesharedPreferences();
}
2 sharedPreferences()を作成し、このコードを配置します
private void sharedPreferences()
{
SharedPreferences shared = getSharedPreferences("App_settings", MODE_PRIVATE);
SharedPreferences.Editor editor = shared.edit();
editor.putString("PRODUCT_PHOTO", encodeTobase64(bitmap));
editor.commit();
}
3このメソッドをretrivesharedPreferences()で作成し、このコードを配置します。
private void retrivesharedPreferences()
{
SharedPreferences shared = getSharedPreferences("MyApp_Settings", MODE_PRIVATE);
String photo = shared.getString("PRODUCT_PHOTO", "photo");
assert photo != null;
if(!photo.equals("photo"))
{
byte[] b = Base64.decode(photo, Base64.DEFAULT);
InputStream is = new ByteArrayInputStream(b);
bitmap = BitmapFactory.decodeStream(is);
your_imageview.setImageBitmap(bitmap);
}
}
4 encodeTobase64()メソッドを記述して、ビットマップを文字列base64-にエンコードし、このメソッドにコードを挿入します
public static String encodeTobase64(Bitmap image) {
Bitmap bitmap_image = image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap_image.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);
return imageEncoded;
}
お役に立てれば幸いです。
Base64にエンコードしますか?! 共有設定に保存している情報が多すぎるのです。あなたがしなければならない戦略は、画像URIファイルのパスを保存し、そのようにそれを取得することです。このようにして、アプリはそれほど多くの情報を保存せず、画像をデコードするときにメモリを消費します。
フォローしたい場合は、このアイデアを実証するために Github で簡単なアプリを作成しました。
private ImageView mImage;
private Uri mImageUri;
public void imageSelect() {
Intent intent;
if (Build.VERSION.SDK_INT < 19) {
intent = new Intent(Intent.ACTION_GET_CONTENT);
} else {
intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
}
intent.setType("image/*");
startActivityForResult(Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_IMAGE_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a image.
// The Intent's data Uri identifies which item was selected.
if (data != null) {
// This is the key line item, URI specifies the name of the data
mImageUri = data.getData();
// Removes Uri Permission so that when you restart the device, it will be allowed to reload.
this.grantUriPermission(this.getPackageName(), mImageUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
final int takeFlags = Intent.FLAG_GRANT_READ_URI_PERMISSION;
this.getContentResolver().takePersistableUriPermission(mImageUri, takeFlags);
// Saves image URI as string to Default Shared Preferences
SharedPreferences preferences =
PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("image", String.valueOf(mImageUri));
editor.commit();
// Sets the ImageView with the Image URI
mImage.setImageURI(mImageUri);
mImage.invalidate();
}
}
}
}
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
String mImageUri = preferences.getString("image", null);
mImage.setImageURI(Uri.parse(mImageUri));
これで終わりです!これで、画像のURIパスを共有設定にきれいに保存でき、画像をエンコードしてSharedPreferencesに保存する貴重なシステムリソースを無駄にすることがなくなりました。