如何在Android中将位图对象存储在SharedPreferences中

6

我希望能够将位图对象存储在共享首选项中,并在恢复方法中检索该对象并将其设置为后台。请告诉我如何将其存储和检索到共享首选项中。问题是在共享首选项中,我们可以放置像字符串、整数、布尔值、长整型等值,但不能放置位图对象。请帮助我解决这个问题。以下是我的代码:

    @Override
protected void onResume() {
    super.onResume();

rl_changeBackground.setBackgroundDrawable(new BitmapDrawable(getResources(),HomeSafeStaticVariables.bitmap));

    }
    }

请查看此处的答案:https://dev59.com/QWw05IYBdhLWcg3wUAM0#59501186 - VasanthRavichandran
3个回答

23
您只能在SharedPreference中添加布尔值、浮点数、整数、长整数和字符串,但您可以将位图转换为Base64字符串。在从SharedPreference检索后,可以将其转换回位图。
使用以下方法将位图转换为字节数组:
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); //bm is the bitmap object   
byte[] b = baos.toByteArray();

使用以下方法将字节数组编码为base64:

String encoded = Base64.encodeToString(b, Base64.DEFAULT); 

将其保存到SharedPrefrence中。

现在假设您的图像数据存储在名为"encoded"的字符串中,以下代码应该可以从Base64字符串中提取出位图:

byte[] imageAsBytes = Base64.decode(encoded.getBytes(), Base64.DEFAULT);
ImageView image = (ImageView)this.findViewById(R.id.ImageView);
image.setImageBitmap(BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length));

这可能会对您有所帮助。请尝试并告诉我!


如果需要,您也可以将其保存在SD卡上。 - Akhilesh Mani
但这会减慢所有操作。存在显著的延迟。 - most venerable sir
谢谢Akhilesh,好久不见了。你在SO上的得分很高。 - Deepak Sharma

3

您可以将Bitmap作为base64字符串存储在SharedPreferences中。但是,在SharedPreferences中存储位图图像不是一个好的做法。应该将图像存储在SD卡上,并将路径保存在SharedPreferences中。

查看此问题


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接