【问题标题】:Selecting an Image from gallery and to save it in Android App从图库中选择图像并将其保存在 Android 应用程序中
【发布时间】:2016-05-12 13:58:24
【问题描述】:

我正在从图库中选择一个图像,当我们从最近的应用程序中清除时,我们选择的图像也被删除。我想显示图像,即使它已从最近的应用程序中删除,这意味着我想将图像保存在app.please 提供总代码。

提前致谢。

【问题讨论】:

  • 您将需要 SQLite 数据库来存储图像路径。首先为您的应用创建数据库,然后添加图像。
  • 我给了你整个代码(类),如果你满意就接受它作为答案

标签: android


【解决方案1】:

包 com.developerscode.com.profile_activity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created by android on 6/5/16.
 */
public class MainActivity extends AppCompatActivity {

    private int PICK_IMAGE_REQUEST = 1;
    ImageView image;


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

        image = (ImageView) findViewById(R.id.image);

        SharedPreferences myPrefrence = getPreferences(MODE_PRIVATE);
        String imageS = myPrefrence.getString("imagePreferance", "");
        Bitmap imageB;
        if(!imageS.equals("")) {
            imageB = decodeToBase64(imageS);
            image.setImageBitmap(imageB);
        }
    }


    public void selectImage(View v){
        Intent intent = new Intent();
// Show only images, no videos or anything else
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
// Always show the chooser (if there are multiple options available)
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        startActivityForResult(intent, PICK_IMAGE_REQUEST);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {

            InputStream stream;
            try {
                Toast.makeText(MainActivity.this, "Image saved", Toast.LENGTH_SHORT).show();
                stream = getContentResolver().openInputStream(data.getData());
                Bitmap realImage = BitmapFactory.decodeStream(stream);
               image.setImageBitmap(realImage);


                SharedPreferences myPrefrence = getPreferences(MODE_PRIVATE);
                SharedPreferences.Editor editor = myPrefrence.edit();
                editor.putString("imagePreferance", encodeToBase64(realImage));

                editor.commit();
            }
            catch (FileNotFoundException e) {
               // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

  public static String encodeToBase64(Bitmap image) {
      Bitmap immage = image;
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      immage.compress(Bitmap.CompressFormat.PNG, 100, baos);
      byte[] b = baos.toByteArray();
      String imageEncoded = Base64.encodeToString(b, Base64.DEFAULT);

      Log.d("Image Log:", imageEncoded);
      return imageEncoded;
  }

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

}

【讨论】:

    【解决方案2】:

    如果您希望在销毁应用程序后仍保存您选择的图像,为什么不直接使用 SharedPreferences。只需将您的文件路径放在共享首选项中即可。

    代码:

         public class save  
      {
    
               SharedPreferences sharedPreferences;
    
               Context ctx;
               public save(Context ctx,String file)
                          {
                          this.ctx =ctx;
                          sharedPreferences = this.ctx.getSharedPreferences(file,Context.MODE_PRIVATE);
    
                          }
    
    
    
    public void store(String key,String value)
    {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key,value);
        editor.commit();
    
    }
    
    public String read(String key)
    {
    
       String v= sharedPreferences.getString(key, "nothing");
        return v;
    
    }
    
    public void remove()
    {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.commit();
    }
    public void delete(String str){
    
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.remove(str);
        editor.commit();
    
    }
    
    public Map<String, ?> readall(){
    
        Map<String, ?> allEntries = sharedPreferences.getAll();
    
        return allEntries;
    }}
    

    要将所选路径添加到共享首选项,请使用方法 store();

    要从共享首选项中删除路径,请使用方法 delete();

    删除所有使用方法remove();

    读取所有使用 readall();

    【讨论】:

    • 实际上我只使用共享首选项来保存我的图像。在我的代码中,我将该图像编码为base64,然后保存在共享首选项中,并在为此使用单独的活动时从共享首选项中再次解码为位图。它工作得很好,但是当我将它与仪表板活动一起使用时,它再次将图像重置为默认值。不知道为什么?
    • 对不起,我不太明白你到底想做什么。为了让更多人了解您的问题,请添加适当的标签,而不仅仅是 android。并转发。添加 base64、android、gallery 等标签。我的意思是这些标签应该有助于吸引合适的人。希望有人能帮助你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多