2015-06-22 4 views
0

Я хочу установить изображение в ImageView. Я получаю путь изображения в своем первом действии, и передаю его через Intent как строку для второго действия. Во втором действии я установил путь к ImageView. Он работает правильно, и мне нужно загрузить эту фотографию на сервер. Поэтому я расшифровал путь к растровому изображению. Он выбрасывает OutOfMemoryError. Как решить эту проблему?Как разрешить OutOfMemoryError на Bitmap в Android?

И когда я использую переднюю камеру, проблем нет. Изображение загружается успешно. Проблема связана с изображениями, сделанными передней камерой устройства. Каково решение этой проблемы? Может ли кто-нибудь помочь?

Вот код, чтобы преобразовать путь изображения в строку и передать его через Intent:

if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { 


     Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[]{MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, MediaStore.Images.Media.DATE_ADDED, null, "date_added ASC"); 
     if(cursor != null && cursor.moveToFirst()) 
     { 
      do { 
       Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA))); 
       photoPath = uri.toString(); 

      }while(cursor.moveToNext()); 
      cursor.close(); 

      try { 
       Intent intent = new Intent(MainActivity.this, ImageUploadActivity.class); 
       intent.putExtra("ImagePath", photoPath); 
       MainActivity.this.startActivity(intent); 
      } 
      catch (Exception e) 
      { 
       Toast.makeText(MainActivity.this, "Method invoked"+photoPath, Toast.LENGTH_SHORT).show(); 
      } 
     } 

Прием Намерение во Второй деятельности:

Intent camIntent = getIntent(); 
camPicPath = camIntent.getExtras().getString("ImagePath"); 
imageView = (ImageView) findViewById(R.id.imgView); 
imageView.setImageBitmap(BitmapFactory.decodeFile(camPicPath)); 
Toast.makeText(getApplicationContext(), "PATHe"+camPicPath, Toast.LENGTH_SHORT).show(); 
bitmap = (BitmapFactory.decodeFile(camPicPath)); 

метод для загрузки файла:

class ImageUploadTask extends AsyncTask<Void, Void, String> { 
    @Override 
    protected String doInBackground(Void... unsued) { 
     try { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 
      HttpPost httpPost = new HttpPost("http://11.10.11.15/test/upload.php"); 

      MultipartEntity entity = new MultipartEntity(
        HttpMultipartMode.BROWSER_COMPATIBLE); 

      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos); 
      byte[] data = bos.toByteArray(); 


      /* entity.addPart("uploaded_file", new ByteArrayBody(data, 
        "myImage.jpg"));*/ 

      // String newFilename= filename.concat("file"); 
      // newFilename=filename+newFilename; 

      entity.addPart("uploaded_file", new ByteArrayBody(data, 
        filename)); 
      // Log.e(TAG, "Method invoked"); 
      httpPost.setEntity(entity); 
      HttpResponse response = httpClient.execute(httpPost, 
        localContext); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(
          response.getEntity().getContent(), "UTF-8")); 

      StringBuilder builder = new StringBuilder(); 
      String aux = ""; 

      while ((aux = reader.readLine()) != null) { 
       builder.append(aux); 
      } 

      String sResponse = builder.toString(); 


      return sResponse; 
     } catch (Exception e) { 
      if (dialog.isShowing()) 
       dialog.dismiss(); 
      Toast.makeText(getApplicationContext(), "Exception Message 1", Toast.LENGTH_LONG).show(); 
      Log.e(e.getClass().getName(), e.getMessage(), e); 
      return null; 
     } 
+0

Вы должны сжать изображение. –

+0

[Android Управление памятью растровых изображений] (https://developer.android.com/training/displaying-bitmaps/manage-memory.html) – Bharatesh

ответ

0

Использовать следующий метод:

Bitmap bm = ShrinkBitmap(imagefile, 300, 300); 
    image.setImageBitmap(bm); 

Bitmap ShrinkBitmap(String file, int width, int height) { 
    BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
    bmpFactoryOptions.inJustDecodeBounds = true; 
    Bitmap bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions); 
    int heightRatio = (int) Math.ceil(bmpFactoryOptions.outHeight/(float) height); 
    int widthRatio = (int) Math.ceil(bmpFactoryOptions.outWidth/(float) width); 
    if (heightRatio > 1 || widthRatio > 1) { 
      if (heightRatio > widthRatio) { 
       bmpFactoryOptions.inSampleSize = heightRatio; 
      } else { 
       bmpFactoryOptions.inSampleSize = widthRatio; 
      } 
    } 
    bmpFactoryOptions.inJustDecodeBounds = false; 
    bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions); 
    return bitmap; 
} 

Или использовать inSampleSize при установке растрового изображения, как это:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 4; 
imageView.setImageBitmap(BitmapFactory.decodeFile(path, options)); 
+0

Большое спасибо. Этот метод решил мою проблему. – Gibs

0

Вы можете добавить ниже собственности приложения тег manifiest файла для высокой памяти.

android:largeHeap="true"