Cara Menyimpan gambar ke ImageView menggunakan Preferensi Bersama

Saya memiliki aktivitas yang membuka aktivitas lain untuk mendapatkan gambar unduhan. Gambar kembali ke aktivitas awal saya dan berada di imageView. Itu berfungsi dengan baik. Bagaimana cara menyimpan gambar sehingga ketika pengguna kembali lagi nanti, atau mematikan aplikasi, gambar tersebut masih ada. Saya tahu saya seharusnya menggunakan Preferensi Bersama untuk mendapatkan jalur gambar dan tidak menyimpan gambar itu sendiri, tetapi saya tidak tahu bagaimana cara melakukannya.

Aktifitas utama

public class MainActivity extends Activity {

  private static final int REQUEST_CODE = 1;
  private Bitmap bitmap;
  Button button;
  ImageView imageView;
  String selectedImagePath;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button=(Button) findViewById(R.id.click);
    imageView=(ImageView) findViewById(R.id.image);
    imageView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            Switch();
            return true;
        }
    });
  }

  public void Switch(){
    imageView = (ImageView) findViewById(R.id.image);
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, REQUEST_CODE);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode==REQUEST_CODE&&resultCode== Activity.RESULT_OK){
      try {
        Uri selectedImage = data.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        Log.v("roni", filePath);
        cursor.close();
        if(bitmap != null && !bitmap.isRecycled())
          {
            bitmap = null;
          }
        bitmap = BitmapFactory.decodeFile(filePath);
        //imageView.setBackgroundResource(0);
        imageView.setImageBitmap(bitmap);
        } catch (Exception e){
          e.printStackTrace();
        }
      }
  }

  @Override
  protected void onPause() {
    super.onPause();
     save();
  }

  public void save() {
    SharedPreferences sp = getSharedPreferences("AppSharedPref", 1); // Open SharedPreferences with name AppSharedPref
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("ImagePath", selectedImagePath); // Store selectedImagePath with key "ImagePath". This key will be then used to retrieve data.
    editor.commit();
  }

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

  public void restore(){
    SharedPreferences sp = getSharedPreferences("AppSharedPref", 1);
    selectedImagePath = sp.getString("ImagePath", "");
    bitmap = BitmapFactory.decodeFile(selectedImagePath);
    imageView.setImageBitmap(bitmap);
  }
}

Lihat Aktivitas

public class ViewActivity extends ActionBarActivity {
ImageButton imageViews;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view);
    imageViews = (ImageButton) findViewById(R.id.image);
    Intent intent = getIntent();
    Uri data = intent.getData();
    if (intent.getType().indexOf("image/") != -1)
    {
        imageViews.setImageURI(data);
    }
}

person God_master    schedule 05.08.2015    source sumber
comment
Artinya, saya menyimpan direktori drawable, di belakang saya memanggil metode onResume. (maaf, saya punya sampah bahasa Inggris..jadi.)   -  person God_master    schedule 05.08.2015


Jawaban (3)


Tulis Metode untuk menyandikan Bitmap Anda ke dalam string base64

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;
}

Masukkan BitmapAnda ke dalam metode ini seperti sesuatu yang encodeTobase64 sesuai preferensi Anda

        SharedPreferences myPrefrence = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = myPrefrence.edit();
        editor.putString("namePreferance", itemNAme);
        editor.putString("imagePreferance", encodeToBase64(yourBitmap));
        editor.commit();

Dan bila Anda ingin menampilkan gambar Anda di mana pun, ubah saja menjadi Bitmap lagi menggunakan metode decodeToBase64

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

ini kode untuk mendapatkan Bitmap lagi

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

Namun menurut pendapat saya, Anda harus tetap menggunakan jalur preferensi bersama ke bitmap.

person Eliasz Kubala    schedule 05.08.2015
comment
Aku percaya kamu benar. Hanya jalannya yang harus diselamatkan. Ini adalah sejumlah besar data yang disimpan di Preferensi Bersama. - person Miriana Itani; 05.08.2015
comment
@EliaszKubala , bisakah kamu menulis contoh untuk saya? Saya tidak mengerti.:( - person God_master; 05.08.2015
comment
Coba sekarang. Jika berhasil, terimalah jawaban saya. Dalam variabel imageB adalah Bitmap Anda. Jika tidak berhasil, tolong beri saya kesalahan. - person Eliasz Kubala; 05.08.2015

Inilah yang saya gunakan:

public class AppPrefrances {
protected static AppPrefrances INSTANCE;
private static SharedPreferences prefs;

public static AppPrefrances getInstance(Context context) {
    if (INSTANCE == null) {
        INSTANCE = new AppPrefrances();
        prefs = PreferenceManager.getDefaultSharedPreferences(context);
    }

    return INSTANCE;
}

public void setPath(String path) {
    prefs.edit().putString("path", path).apply();
}

public String getPath() {
    return prefs.getString("path", "-1");
}
}

Sekarang di onActivityResult Anda:

AppPrefrances.getInstance(getApplicationContext()).setPath(file_path);

Kemudian di onCreate, Anda memeriksa:

String check= AppPrefrances.getInstance(getApplicationContext()).setPath();
if(check!=null&&!check.equals("-1")){
imageView.setImageUri(Uri.parse(check));
}
person Miriana Itani    schedule 05.08.2015
comment
Tentu kelas pertama adalah kelas independen yang menggunakan Preferensi Bersama. Itu statis karena digunakan berkali-kali. Fungsi setPath menyimpan jalur. prefs.edit().putString(jalur, jalur).apply(); Di baris ini sebelumnya, ada jalur kunci. Kunci ini harus unik; setiap kali setPath dipanggil, nilai apa pun akan disimpan dengan jalur kunci. Ini lebih seperti peta hash: kunci, nilai. Fungsi getPath memiliki nilai default -1. Dengan nilai default ini Anda dapat mengetahui apakah suatu gambar telah disimpan atau tidak. - person Miriana Itani; 05.08.2015

#EliaszKubala,it my code.

di sini kesalahan: Tidak dapat melanjutkan aktivitas {com.example.thang.sdcardimagesactivity/com.example

 @Override
protected void onPause() {
    super.onPause();
    save();
}
public void save(){
    SharedPreferences sp = getSharedPreferences("AppSharedPref", 1); // Open SharedPreferences with name AppSharedPref
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("ImagePath", "abc");
    editor.putString("ImagePath", encodeTobase64(bitmap)); // Store selectedImagePath with key "ImagePath". This key will be then used to retrieve data.
    editor.commit();
}

@Override
protected void onResume() {
    super.onResume();
    restore();
}
public void restore(){
    SharedPreferences sp = getSharedPreferences("AppSharedPref", 1);
    selectedImagePath = sp.getString("ImagePath", "abc");
    bitmap = decodeToBase64(selectedImagePath);
    imageView.setImageBitmap(bitmap);
}
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);
}
person God_master    schedule 05.08.2015