【问题标题】:How do i let a user save an image from gallery to his SharedPrefferences?我如何让用户将图像从画廊保存到他的 SharedPreferences?
【发布时间】:2021-10-24 09:44:10
【问题描述】:

如何让用户将图片从图库保存到他的 SharedPreferences?

我现在正在使用此代码,以便用户可以从他喜欢的图库中选择一张图片。如何将他选择的图片保存到 SharedPreferences?

if (v.getId() == R.id.btnUploadPicture)
{
    Intent uploadPic = new Intent(Intent.ACTION_PICK,
                    android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    final int ACTIVITY_SELECT_IMAGE = 1234;
    startActivityForResult(uploadPic, ACTIVITY_SELECT_IMAGE);
}

【问题讨论】:

  • 由于共享首选项用于保存少量数据,因此使用共享首选项存储图像是不可行的。我建议您将图像保存到外部存储,然后将图像的路径保存为共享首选项中的字符串。
  • 我可以保存图像路径吗? (比如它在设备中的存储位置)
  • 是的,我建议只有
  • 我该怎么做?
  • 作为 Base64,但这是个坏主意

标签: java android android-studio sharedpreferences


【解决方案1】:

您可以将图像路径保存在共享首选项中,稍后从共享首选项中获取图像路径。

图片路径可以这样获取。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == ACTIVITY_SELECT_IMAGE && resultCode == RESULT_OK) {
        Bitmap photo = (Bitmap) data.getExtras().get("data"); 
        imageView.setImageBitmap(photo);

        Uri tempUri = getImageUri(getApplicationContext(), photo);

        File finalFile = new File(getRealPathFromURI(tempUri));

        System.out.println(mImageCaptureUri);
    }  
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
}

【讨论】:

    【解决方案2】:

    如果我错了,请纠正我。但听起来真正的问题是,当您从 startActivityForResult 返回时,您不知道如何处理图像。 当您使用 startActivityForResult 时,onActivityResult 总是在从所述活动返回时运行。 你需要在你的类中覆盖 onActivityResult。

    我建议制作

    final int ACTIVITY_SELECT_IMAGE = 1234;
    

    一个全局变量,因此您可以在 startActivityForResult 中使用它。因为你需要用 if 语句包围你的代码,这样它就不会在从另一个活动返回时运行。

    在您的类中放置以下覆盖方法。

     @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
     if (requestCode == ACTIVITY_SELECT_IMAGE) {
        if (resultCode == Activity.RESULT_OK) {
            System.out.println("Successfully Returned from Gallery with Image")
            //This is your image from the gallery
            if (data != null) {
                Uri fileUri = data.getData();
                //This is where you will do what you need with the image. 
                //Maybe set an ImageView
                //imageView.setImageURI(fileUri);
                //Or you can copy the image to the app's gallery
                //Add URI to SharedPrefs 
    
            }
    
        } else if (resultCode == Activity.RESULT_ERROR) {
            Toast.makeText(this, "An Error Has Occurred", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Task Cancelled", Toast.LENGTH_SHORT).show();
        }
     }
    }
    

    【讨论】:

    • else if (resultCode == Activity.RESULT_ERROR) 我应该在这里输入什么活动?包含此代码或其他代码的活动?
    • onActivityResult 方法将在原始活动中。当 startActivityForResult 被调用时,应用程序将被发送到第二个活动,期望得到一个“结果”。当应用程序返回到原始活动时,它会使用以下参数运行 onActivityResult:requestCode、resultCode 和数据。 ResultCode 是 -1 或 0。这表明第二个活动是成功运行还是被取消。 else if (resultCode == Activity.RESULT_ERROR) 允许您在第二个活动被取消时处理它。在这种情况下,将向用户显示一条 Toast 消息,让他们知道。
    • 我明白了,谢谢你的帮助
    • 如果您发现其中一个答案得到证实,请将其标记为解决方案。同样,如果您发现评论有帮助,请单击向上箭头,以便其他人将来可以更轻松地找到有用的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多