วิธีบันทึกภาพไปยัง ImageView โดยใช้การตั้งค่าที่ใช้ร่วมกัน

ฉันมีกิจกรรมที่เปิดอีกหนึ่งกิจกรรมเพื่อรับรูปดาวน์โหลด รูปภาพกลับมาที่กิจกรรมดั้งเดิมของฉันและพักใน imageView นั่นทำงานได้ดี ฉันจะบันทึกรูปภาพได้อย่างไร ดังนั้นเมื่อผู้ใช้กลับมาในภายหลัง หรือฆ่าแอป รูปภาพนั้นยังคงอยู่ตรงนั้น ฉันรู้ว่าฉันควรใช้ Shared Preferences เพื่อรับเส้นทางของรูปภาพและไม่บันทึกรูปภาพนั้นเอง แต่ฉันไม่รู้ว่าจะทำอย่างไร

กิจกรรมหลัก

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

ดูกิจกรรม

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 แหล่งที่มา
comment
หมายความว่า ฉันบันทึกไดเร็กทอรีที่วาดได้ ไว้ด้านหลังฉันเรียกใช้เมธอด onResume (ขออภัย ฉันมีขยะภาษาอังกฤษ..ดังนั้น)   -  person God_master    schedule 05.08.2015


คำตอบ (3)


เขียนวิธีเข้ารหัสบิตแมปของคุณเป็นสตริง 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;
}

ส่ง บิตแมปของคุณ ภายในวิธีการนี้ เช่น encodeTobase64 ตามที่คุณต้องการ

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

และเมื่อคุณต้องการให้แสดงภาพของคุณที่ใด ให้แปลงเป็น Bitmap อีกครั้งโดยใช้วิธี decodeToBase64

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

นี่คือรหัสเพื่อรับ Bitmap อีกครั้ง

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

แต่ในความคิดของฉัน คุณควรเก็บไว้ในเส้นทางการตั้งค่าที่ใช้ร่วมกันเท่านั้นไปยังบิตแมป

person Eliasz Kubala    schedule 05.08.2015
comment
ฉันเชื่อว่าคุณพูดถูก ควรบันทึกเฉพาะเส้นทางเท่านั้น นี่เป็นข้อมูลจำนวนมหาศาลที่ต้องบันทึกไว้ในการตั้งค่าที่ใช้ร่วมกัน - person Miriana Itani; 05.08.2015
comment
@EliaszKubala คุณช่วยเขียนตัวอย่างให้ฉันได้ไหมฉันไม่เข้าใจ :( - person God_master; 05.08.2015
comment
ลองตอนนี้. ถ้ามันใช้งานได้โปรดยอมรับคำตอบของฉัน ในตัวแปร imageB คือบิตแมปของคุณ หากไม่ได้ผลโปรดแจ้งข้อผิดพลาดให้ฉัน - person Eliasz Kubala; 05.08.2015

นี่คือสิ่งที่ฉันใช้:

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

ตอนนี้อยู่ใน onActivityResult ของคุณ:

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

จากนั้นใน onCreate คุณตรวจสอบ:

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
แน่นอนว่าคลาสแรกนั้นเป็นคลาสอิสระที่ใช้การตั้งค่าที่ใช้ร่วมกัน เป็นแบบคงที่เนื่องจากมีการใช้งานหลายครั้ง ฟังก์ชัน setPath บันทึกเส้นทาง prefs.edit().putString(เส้นทาง, เส้นทาง).apply(); เส้นนี้ก่อนมีเส้นทางสำคัญ คีย์นี้จะต้องไม่ซ้ำกัน เมื่อใดก็ตามที่มีการเรียก setPath มันจะบันทึกค่าใดก็ตามด้วยพาธคีย์ มันเหมือนกับแฮชแมป: คีย์, ค่า ฟังก์ชัน getPath มีค่าเริ่มต้นคือ -1 ด้วยค่าเริ่มต้นนี้ คุณจะทราบได้ว่ารูปภาพได้รับการบันทึกหรือไม่ - person Miriana Itani; 05.08.2015

#EliaszKubala,it my code.

ข้อผิดพลาดที่นี่: ไม่สามารถดำเนินกิจกรรมต่อได้ {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