Saving Image Data In SharedPreferences
Using Android Studio 1.4
It is possible to store image in SharedPreferences byconverting it into Base64 string. |
Follow previous tutorial or download start up project MyProfile3-first-login.zip.
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.notarazi.myprofile" > <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MyProfile" android:configChanges="keyboardHidden|orientation|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
Get permission to use Camera and Gallery resource.
Prevent the application from resetting the image view when device orientation changes.
Add a method call (setProfilePhoto) and another Image View (usersavedphoto).
The second Image View (usersavedphoto) is used to check that the image has been successfully encoded/decoded to/from Base64 string.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MyProfile"> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.joooonho.SelectableRoundedImageView android:id="@+id/userphoto" android:layout_width="120dp" android:layout_height="120dp" android:layout_gravity="center" android:scaleType="centerCrop" android:src="@drawable/photo" app:sriv_border_color="#FFCC00" app:sriv_border_width="2dp" app:sriv_oval="true" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="20dp" android:text="Personal Profile"/> <EditText android:id="@+id/username" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="text" android:hint="Name"/> <EditText android:id="@+id/userphone" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="phone" android:hint="Phone number"/> <EditText android:id="@+id/useremail" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textEmailAddress" android:hint="Email"/> <Button android:layout_width="match_parent" android:layout_height="match_parent" android:text="OK" android:onClick="setProfilePhoto" /> <com.joooonho.SelectableRoundedImageView android:id="@+id/usersavedphoto" android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="center" android:scaleType="centerCrop" android:src="@android:drawable/ic_menu_gallery" app:sriv_border_color="#FFCC00" app:sriv_border_width="2dp" app:sriv_oval="true" /> </LinearLayout> </ScrollView> </RelativeLayout> |
Bind imageview object to imageview ui.
Get bitmap from the imageview object.
Convert bitmap to string
Save string to sharedpreferences
package com.notarazi.myprofile; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Base64; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import java.io.ByteArrayOutputStream; public class MyProfile extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_profile); checkFirstLogin(); prepareForm(); } private void prepareForm() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); EditText etUserName=(EditText)findViewById(R.id.username); EditText etUserPhone=(EditText)findViewById(R.id.userphone); EditText etUserEmail=(EditText)findViewById(R.id.useremail); // If value for key not exist then return second param value - In this case "..." etUserName.setText(preferences.getString("username", "...")); etUserPhone.setText(preferences.getString("userphone", "...")); etUserEmail.setText(preferences.getString("useremail", "...")); } private void checkFirstLogin() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); // If value for key not exist then return second param value - In this case true if (preferences.getBoolean("firstLogin", true)) { initProfile(); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("firstLogin", false); editor.commit(); } } private void initProfile() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("username","Demo TryTest"); editor.putString("userphone","01234567890"); editor.putString("useremail","demotrytest@gmail.com"); editor.commit(); } public void setProfilePhoto(View view){ ImageView ivphoto = (ImageView)findViewById(R.id.userphoto); //code image to string ivphoto.buildDrawingCache(); Bitmap bitmap = ivphoto.getDrawingCache(); ByteArrayOutputStream stream=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); byte[] image=stream.toByteArray(); //System.out.println("byte array:"+image); //final String img_str = "data:image/png;base64,"+ Base64.encodeToString(image, 0); //System.out.println("string:"+img_str); String img_str = Base64.encodeToString(image, 0); //decode string to image String base=img_str; byte[] imageAsBytes = Base64.decode(base.getBytes(), Base64.DEFAULT); ImageView ivsavedphoto = (ImageView)this.findViewById(R.id.usersavedphoto); ivsavedphoto.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) ); } } |
package com.notarazi.myprofile; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Base64; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import java.io.ByteArrayOutputStream; public class MyProfile extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_profile); checkFirstLogin(); prepareForm(); } private void prepareForm() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); EditText etUserName=(EditText)findViewById(R.id.username); EditText etUserPhone=(EditText)findViewById(R.id.userphone); EditText etUserEmail=(EditText)findViewById(R.id.useremail); // If value for key not exist then return second param value - In this case "..." etUserName.setText(preferences.getString("username", "...")); etUserPhone.setText(preferences.getString("userphone", "...")); etUserEmail.setText(preferences.getString("useremail", "...")); } private void checkFirstLogin() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); // If value for key not exist then return second param value - In this case true if (preferences.getBoolean("firstLogin", true)) { initProfile(); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("firstLogin", false); editor.commit(); } } private void initProfile() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("username","Demo TryTest"); editor.putString("userphone","01234567890"); editor.putString("useremail","demotrytest@gmail.com"); editor.commit(); } public void setProfileImage(View view){ ImageView ivphoto = (ImageView)findViewById(R.id.userphoto); //code image to string ivphoto.buildDrawingCache(); Bitmap bitmap = ivphoto.getDrawingCache(); ByteArrayOutputStream stream=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); byte[] image=stream.toByteArray(); //System.out.println("byte array:"+image); //final String img_str = "data:image/png;base64,"+ Base64.encodeToString(image, 0); //System.out.println("string:"+img_str); String img_str = Base64.encodeToString(image, 0); //decode string to image String base=img_str; byte[] imageAsBytes = Base64.decode(base.getBytes(), Base64.DEFAULT); ImageView ivsavedphoto = (ImageView)this.findViewById(R.id.usersavedphoto); ivsavedphoto.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) ); //save in sharedpreferences SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("userphoto",img_str); editor.commit(); } } |
package com.notarazi.myprofile; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Base64; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import java.io.ByteArrayOutputStream; public class MyProfile extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_profile); checkFirstLogin(); prepareForm(); } private void prepareForm() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); EditText etUserName=(EditText)findViewById(R.id.username); EditText etUserPhone=(EditText)findViewById(R.id.userphone); EditText etUserEmail=(EditText)findViewById(R.id.useremail); ImageView ivUserPhoto=(ImageView) findViewById(R.id.userphoto); ImageView ivUserSavedPhoto=(ImageView) findViewById(R.id.usersavedphoto); // If value for key not exist then return second param value - In this case "..." etUserName.setText(preferences.getString("username", "...")); etUserPhone.setText(preferences.getString("userphone", "...")); etUserEmail.setText(preferences.getString("useremail", "...")); String img_str=preferences.getString("userphoto", ""); if (!img_str.equals("")){ //decode string to image String base=img_str; byte[] imageAsBytes = Base64.decode(base.getBytes(), Base64.DEFAULT); ivUserPhoto.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) ); ivUserSavedPhoto.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) ); } } private void checkFirstLogin() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); // If value for key not exist then return second param value - In this case true if (preferences.getBoolean("firstLogin", true)) { initProfile(); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("firstLogin", false); editor.commit(); } } private void initProfile() { SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("username","Demo TryTest"); editor.putString("userphone","01234567890"); editor.putString("useremail","demotrytest@gmail.com"); editor.commit(); } public void setProfileImage(View view){ ImageView ivphoto = (ImageView)findViewById(R.id.userphoto); //code image to string ivphoto.buildDrawingCache(); Bitmap bitmap = ivphoto.getDrawingCache(); ByteArrayOutputStream stream=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); byte[] image=stream.toByteArray(); //System.out.println("byte array:"+image); //final String img_str = "data:image/png;base64,"+ Base64.encodeToString(image, 0); //System.out.println("string:"+img_str); String img_str = Base64.encodeToString(image, 0); //decode string to image String base=img_str; byte[] imageAsBytes = Base64.decode(base.getBytes(), Base64.DEFAULT); ImageView ivsavedphoto = (ImageView)this.findViewById(R.id.usersavedphoto); ivsavedphoto.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length) ); //save in sharedpreferences SharedPreferences preferences = getSharedPreferences("myprefs", MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString("userphoto",img_str); editor.commit(); } } |
OUTCOME.
(If there is a profile photo stored in shared preferences, the small image below the button will display it. Otherwise it will display a gallery icon as in step no.3).
http://www.tutorialspoint.com/android/android_shared_preferences.htm
http://kalisandroid.blogspot.my/2014/08/introduction-inandroid-normally-we-send.html
http://androidopentutorials.com/android-sharedpreferences-tutorial-and-example/