Как сохранить изображения с помощью sharedpreference в android?

Я хочу сохранить изображения в android, используя sharedpreference. У меня есть два класса активности, когда я нажимаю кнопку первой активности, она вызывает второе действие, а второе действие отображает мое предпочтительное имя в виде списка, а также сбрасывает обои андроида на изображение, которое я установил в качестве предпочтительного обоев в первая активность.

Для второго действия код:

public class PreferencesActivityTest extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


            SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
            String prefName = myPrefs.getString("PREF_USERNAME", "nothing");
            String wallPaper = myPrefs.getString("PREFS_NAME", null);


            if(wallPaper != null) {

                try {

                      Bitmap bm = BitmapFactory.decodeFile("/data/misc/wallpaper/"+wallPaper);
                      Log.d(getClass().getSimpleName(),"Wallpaper name is: "+ wallPaper);
                      setWallpaper(bm);
                      Toast.makeText(this, "Wall paper has been changed." +
                                  "You may go to the home screen to view the same", Toast.LENGTH_LONG).show();
                } 

                catch (FileNotFoundException fe){
                      Log.e(getClass().getSimpleName(),"File not found");
                } catch (IOException ie) {
                      Log.e(getClass().getSimpleName()," IO Exception");
                }

    }


        ArrayList<String> results = new ArrayList<String>();
        results.add("Your Preferred name is: " + prefName);
      this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,results));
    }

Первое действие вызывает второе действие, но оно не вызывает if(wallPaper != null){}

Почему он не работает?

Ответ 1

Не рекомендуется хранить изображение в настройках Share. И вы должны сохранить это изображение на sdcard. Затем сохраните путь к изображению (из sdcard) в настройках Share, как это -

    SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
    Editor edit=shre.edit();
    edit.putString("imagepath","/sdcard/imh.jpeg");
    edit.commit();

а затем выберите образ из SD-карты, используя этот путь

Ответ 2

Все, что вам нужно сделать, это преобразовать изображение в него Base64 string:

Bitmap realImage = BitmapFactory.decodeStream(stream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
realImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);   
byte[] b = baos.toByteArray(); 

String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
textEncode.setText(encodedImage);

SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit=shre.edit();
edit.putString("image_data",encodedImage);
edit.commit();

а затем при извлечении преобразуйте его обратно в растровое изображение:

SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
String previouslyEncodedImage = shre.getString("image_data", "");

if( !previouslyEncodedImage.equalsIgnoreCase("") ){
    byte[] b = Base64.decode(previouslyEncodedImage, Base64.DEFAULT);
    Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
    imageConvertResult.setImageBitmap(bitmap);
}

Однако я должен сказать вам, что поддержка Base64 только недавно включена в API8. Чтобы настроить более низкую версию API, вам необходимо добавить ее в первую очередь. К счастью, этот парень уже имеет необходимый учебник.

Кроме того, я создал быстрый и грязный пример Я публикую в github.

Ответ 3

Привет, друзья, я получил решение проблемы выше. Я отправляю свой полный исходный код, чтобы другие могли использовать это решение.

Это мое второе решение по этой проблеме. Уже я пишу один ответ, это другой ответ на тот же вопрос. Как сохранить изображение в общих предпочтениях в Android | Общая проблема с предпочтением в Android с изображением.

Выполните следующие шаги: -

  • Объявить bitmap и String как static

    public static final String PRODUCT_PHOTO = "photo";
    public static Bitmap product_image;
    
  • В onCreate() напишите некоторый код.

    //---------set the image to bitmap
    product_image= BitmapFactory.decodeResource(getResources(), .drawable.logo);
    //____________convert image to string
    String str_bitmap = BitMapToString(product_image);
    //__________create two method setDefaults() andgetDefaults()
    setDefaults(PRODUCT_PHOTO, str_bitmap, this)  
    getDefaults(PRODUCT_PHOTO, this);
    
    1. напишите ниже код в методах

SetDefaults();

public static void setDefaults(String str_key, String value, Context    context)
{
 SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor edit=shre.edit();
edit.putString(str_key, value);
edit.apply();
}

3.2.setDefaults();

   public static String getDefaults(String key, Context context)
   {
    SharedPreferences preferences =            PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);

   }
  1. BitMapToString();

    public static String BitMapToString(Bitmap bitmap)
    {
    ByteArrayOutputStream baos=new  ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG,100, baos);
    byte[] arr = baos.toByteArray();
    return Base64.encodeToString(arr, Base64.DEFAULT);
    }
    

    Теперь, если вы хотите получить доступ к этому файлу изображения в другом действии, выполните следующие шаги.

  2. Объявить строку как статическую

    public static final String PRODUCT_PHOTO = "photo";
    String str_bitmap;
    private  Bitmap bitmap;
    private ImageView  imageView_photo;
    

    В onCreate():

      //--------get image form previous activity,here ProductActivity is my previous activity.
     str_bitmap =ProductActivity.getDefaults(PRODUCT_PHOTO, this);
     //-------------- decode the string to the bitmap
     bitmap=decodeBase64(str_bitmap);
     //----------- finally set the this image to the Imageview.
     imageView_photo.setImageBitmap(bitmap);
    

для decodeBase64();

     public static Bitmap decodeBase64(String input)
     {
     byte[] decodedByte = Base64.decode(input, 0);
     return BitmapFactory.decodeByteArray(decodedByte, 0,   decodedByte.length);
     }