2016-09-11 2 views
1

Я получил эту дурацкую проблему памяти, когда я направляю кодированного Растр в другой класс:Bitmap не будет sented по SharedPreferences: Не удалось выделить память

java.lang.OutOfMemoryError: Failed to allocate a 5280012 byte allocation with 3645732 free bytes and 3MB until OOM

(Он работал и раньше, но я не знаю, что не так с ним теперь)

Вот мой класс отправитель:

public void ProfilePic(View view) { 

     Intent i = new Intent(Intent.ACTION_PICK , MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(i , SELECTED_IMAGE); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     switch (requestCode){ 
      case SELECTED_IMAGE: 

       if (resultCode==RESULT_OK){ 

        Uri uri=data.getData(); 
        String[]projection = {MediaStore.Images.Media.DATA}; 

        Cursor cursor = getContentResolver().query(uri , projection , null , null , null); 
        cursor.moveToFirst(); 

        int columnIndex = cursor.getColumnIndex(projection[0]); 
        String filePath=cursor.getString(columnIndex); 
        cursor.close(); 

        yourImage = BitmapFactory.decodeFile(filePath); 

        ProfilePic = new BitmapDrawable(yourImage); 

        imageView.setImageDrawable(ProfilePic); 
       } 

       break; 
     } 
    } 


    public static String encodeTobase64(Bitmap yourImage) { 

    Bitmap immage = yourImage; 
    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 void next2(View view) { 

     if(yourImage != null) { 

      SharedPreferences prefs = this.getSharedPreferences(
        "PP", Context.MODE_PRIVATE); 
      SharedPreferences.Editor edit = prefs.edit(); 
      edit.putString("PP", encodeTobase64(yourImage)); 
      edit.commit(); 

     } 

     else { 

      SharedPreferences prefs = this.getSharedPreferences(
        "PP", Context.MODE_PRIVATE); 
      SharedPreferences.Editor edit = prefs.edit(); 
      edit.putString("PP", "0"); 
      edit.commit(); 
     } 


     SharedPreferences p = this.getSharedPreferences(
       "home_button", Context.MODE_PRIVATE); 
     SharedPreferences.Editor e = p.edit(); 
     e.putBoolean("fr", true); 
     e.commit(); 


     Intent i = new Intent(this , Results.class); 
     startActivity(i); 
    } 

App сбой при входе в "Результаты"-активности.

Но, когда я закрыть приложение и вернуться снова, он идет прямо в конечные результаты деятельности и все выглядит нормально (sented картина успешно sented) ...

Что вызывает Эта проблема?

+2

просто вы из памяти, изображение требуется около 5 МБ и ваше приложение имеет только 3MB –

+0

есть быстрый способ для оптимизации изображения в коде ??? – PersonalHealth

+1

Проверьте правильность ширины и высоты изображения. Ограничьте пользователя, используя слишком большой файл. –

ответ

2

BitmapFactory.Options поможет вам просто уменьшить размер растрового изображения. Вы можете определить размер вручную или просто использовать поле inSampleSize для заданного значения. Перейдите по ссылке на load large bitmap efficiently

BitmapFactory.Options options=new BitmapFactory.Options(); 
    options.inSampleSize=4; 
    yourImage =BitmapFactory.decodeFile(filePath,options) 
+1

спасибо !!!!!! – PersonalHealth

+0

мое удовольствие приятель. Хорошее кодирование –

Смежные вопросы