java - 将图像存储在 SharedPreferences 中

标签 java android xml android-studio sharedpreferences

mHomePage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, REQUEST_CODE);
        }
    });
    mHomePage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent galleryIntent = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(galleryIntent, RESULT_LOAD);
        }
    });


    return rootView;
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // When an Image is picked
    if (requestCode == RESULT_LOAD && resultCode == RESULT_OK) {
        Uri resultUri = data.getData();
        CropImage.activity(resultUri)
                .start(getActivity());
    }

    if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
        CropImage.ActivityResult result = CropImage.getActivityResult(data);
        Uri uri = result.getUri();

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

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

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

    }

尝试通过编码将图像存储在共享首选项中,但我对此很陌生,无法弄清楚。我看到了一些与此问题相关的问题,但尚不清楚。有人可以帮我解决如何在 SharedPreferences 中存储路径/图像吗?

代码甚至无法编译,因为我已将 uri 放入 .decodeStream() 的 inout 流中。

最佳答案

Uri 指向存储图像的路径,因此首先必须使用 InputStream 读取它。

此代码将修复编译错误。作为侧节点,请使用 edit.apply() 而不是 edit.commit()

if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
    try
    {
        InputStream ims = getContentResolver().openInputStream(uri);
        Bitmap realImage = BitmapFactory.decodeStream(uri);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        realImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();

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

        SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
        SharedPreferences.Editor edit=shre.edit();
        edit.putString("image_data",encodedImage);
        //edit.commit();
        edit.apply();
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
}

但是,我真的没有看到在 SharedPreferences 中存储图像有什么意义?这并不是真正的目的。为什么不使用将文件保存在 context.getFilesDir() 中并在需要时从那里读取它?这比编码/解码要好。

关于java - 将图像存储在 SharedPreferences 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53185301/

相关文章:

android - 在 MPAndroidChart 中实现具有可变切片大小的饼图

java - JAXB @XmlJavaTypeAdapter 用法

java - Eclipse中有控制台功能吗?

m2eclipse 使在 openjdk-6-jdk 上运行的 eclipse 3.5.SR2 崩溃

android - 如何在 Android Studio 中更新导入的模块?

java - DocumentBuilder XML 文件空变量问题

Java XML API 将“转换为”

java - Angular7 + maven 出现 IBM websphere 错误(frontend-maven-plugin :1. 0:npm(npm 安装失败))

java - 如何在 Java String 的正则表达式中使用开始和结束标记?

java - 错误: constructor intent undefined