본문 바로가기
안드로이드 자바

[Java][Android] Shared Preferences 사용하여 이미지 저장하고 불러오기

by teamnova 2021. 7. 3.
728x90

이번 시간에는 Shared Preferences를 사용하여 이미지를 저장해보겠습니다.

 

 

 

 

버튼을 누르면 이미지가 바뀌고 저장됩니다. 앱을 종료한 후 다시 실행하면 이전에 바뀌었던 이미지가 저장되어 있는 것을 확인 할 수 있습니다.

 

Shared Preferences에서 이미지를 저장하기 위해서는

shared preferences의 저장, 불러오기 기능을 알아야 하고

String 과 비트맵의 상호 변환을 알아야 합니다.

 


 

스틱코드의 여러 포스팅 중에서 아래 링크의 포스팅을 즐겨찾기 합니다.

 

stickode.com/detail.html?no=2192

 

 

그리고 이미지 2개를 준비해주시고 drawble 안에 넣어주세요(예제는 png파일입니다.)

 

 

1. MainActivity.java

즐겨찾기 해놓은 코드를 태그만 입력해서 모두 불러 올 수 있습니다.

아래 사진처럼 태그를 입력하여 해당 코드를 더블 클릭하면

즐겨찾기 해놓은 코드가 생성됩니다.

 

package com.example.imagesave;

import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Base64;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.io.ByteArrayOutputStream;

public class MainActivity extends AppCompatActivity {

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

        final ImageView imageView1= findViewById(R.id.imageView1); //화면에 보이는 이미지뷰를 연결
        final ImageView imageView2= findViewById(R.id.imageView2);


        Bitmap icon1 = BitmapFactory.decodeResource(getResources(), R.drawable.image1);  // image1을 비트맵으로 변환
        final Bitmap icon2 = BitmapFactory.decodeResource(getResources(), R.drawable.image2);  // image2를 비트맵으로 변환



        SharedPreferences getImg1 = getSharedPreferences("imgSave1",MODE_PRIVATE);
        String str1 = getImg1.getString("imgSave1","");

        //String형을 BitMap으로 변환
        byte[] encodeByte1 = Base64.decode(str1, Base64.DEFAULT);
        Bitmap bitmap1 = BitmapFactory.decodeByteArray(encodeByte1, 0, encodeByte1.length);


        SharedPreferences getImg2 = getSharedPreferences("imgSave2",MODE_PRIVATE);
        String str2 = getImg2.getString("imgSave2","");


        byte[] encodeByte2 = Base64.decode(str2, Base64.DEFAULT);
        Bitmap bitmap2 = BitmapFactory.decodeByteArray(encodeByte2, 0, encodeByte2.length);



         if(bitmap1==null){
             imageView1.setImageBitmap(icon1); //image1의 비트맵을 이미지뷰에 세팅

         }else if(bitmap1!=null){
             imageView2.setImageBitmap(bitmap1);
         }


        if(bitmap2==null){
            imageView2.setImageBitmap(icon2);   //image2의 비트맵을 이미지뷰에 세팅

        }else if(bitmap2!=null){
            imageView1.setImageBitmap(bitmap2);
        }


        Button btn   = (Button) findViewById(R.id.button);


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                BitmapDrawable drawable1 = (BitmapDrawable) imageView1.getDrawable();
                BitmapDrawable drawable2 = (BitmapDrawable) imageView2.getDrawable();


                Bitmap bitmap1 = drawable1.getBitmap();
                imageView2.setImageBitmap(bitmap1);

                //Bitmap을 String형으로 변환
                ByteArrayOutputStream baos1= new ByteArrayOutputStream();
                bitmap1.compress(Bitmap.CompressFormat.PNG, 70, baos1);
                byte[] bytes1 = baos1.toByteArray();
                String temp1 = Base64.encodeToString(bytes1, Base64.DEFAULT);

                SharedPreferences imgSave1 = getSharedPreferences("imgSave1",MODE_PRIVATE);
                SharedPreferences.Editor editor1 = imgSave1.edit();
                editor1.putString("imgSave1", temp1);
                editor1.commit();




                Bitmap bitmap2 = drawable2.getBitmap();
                imageView1.setImageBitmap(bitmap2);

                ByteArrayOutputStream baos2= new ByteArrayOutputStream();
                bitmap2.compress(Bitmap.CompressFormat.PNG, 70, baos2);
                byte[] bytes2 = baos2.toByteArray();
                String temp2 = Base64.encodeToString(bytes2, Base64.DEFAULT);

                SharedPreferences imgSave2 = getSharedPreferences("imgSave2",MODE_PRIVATE);
                SharedPreferences.Editor editor2 = imgSave2.edit();
                editor2.putString("imgSave2", temp2);
                editor2.commit();

            }
        });



    }
}

 

 

2. activity_main.xml

마찬가지로 태그만 입력해서 스틱코드에서 미리 즐겨찾기 해놓은 코드를 손쉽게 불러옵니다.

 

 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="192dp"
        android:layout_height="203dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.497"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.323"
        tools:srcCompat="@tools:sample/avatars" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/imageView1"
        app:layout_constraintVertical_bias="0.441"
        tools:srcCompat="@tools:sample/avatars" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이미지 바꾸기"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.83"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.095" />

</androidx.constraintlayout.widget.ConstraintLayout>