2016-09-09 2 views
0

Я работаю над Android-приложение, которое должно сделать снимок и отобразить предварительный просмотр, прежде чем он будет загружен в раскол. (Звучит просто, верно? По крайней мере, так я думал). Моя проблема: я думаю, это ошибка из памяти, потому что иногда ей удается отображать изображение, но в большинстве случаев приложение просто закрывается.Работа с ошибкой памяти для камеры намерение imageView Предварительный просмотр

Вот как это использовать намерение:

imageCaptureButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      SimpleDateFormat s = new SimpleDateFormat("ddMMyyyyhhmmss"); 
      Intent chooserIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      stamp = accNum[pos] + "_" + s.format(new Date()); 
      File f = new File(Environment.getExternalStorageDirectory(), stamp + ".jpg"); 
      chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
      imageToUploadUri = Uri.fromFile(f); 
      imagePath = f.getPath(); 
      stopFusedLocation(); 
      startActivityForResult(chooserIntent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); 


     } 
    }); 

Вот как я декодировать захваченное изображение

private Bitmap getBitmap(String path) { 

    Uri uri = Uri.fromFile(new File(path)); 
    InputStream in = null; 
    try { 
     final int IMAGE_MAX_SIZE = 1200000; // 1.2MP 
     in = getActivity().getContentResolver().openInputStream(uri); 

     // Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(in, null, o); 
     in.close(); 


     int scale = 1; 
     while ((o.outWidth * o.outHeight) * (1/Math.pow(scale, 2)) > 
       IMAGE_MAX_SIZE) { 
      scale++; 
     } 
     Log.d("", "scale = " + scale + ", orig-width: " + o.outWidth + ", orig-height: " + o.outHeight); 

     Bitmap b = null; 
     in = getActivity().getContentResolver().openInputStream(uri); 
     if (scale > 1) { 
      scale--; 
      // scale to max possible inSampleSize that still yields an image 
      // larger than target 
      o = new BitmapFactory.Options(); 
      o.inSampleSize = scale; 
      b = BitmapFactory.decodeStream(in, null, o); 

      // resize to desired dimensions 
      int height = b.getHeight(); 
      int width = b.getWidth(); 
      Log.d("", "1th scale operation dimenions - width: " + width + ", height: " + height); 

      double y = Math.sqrt(IMAGE_MAX_SIZE 
        /(((double) width)/height)); 
      double x = (y/height) * width; 

      Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x, 
        (int) y, true); 
      b.recycle(); 
      b = scaledBitmap; 

      System.gc(); 
     } else { 
      b = BitmapFactory.decodeStream(in); 
     } 
     in.close(); 

     Log.d("", "bitmap size - width: " + b.getWidth() + ", height: " + 
       b.getHeight()); 
     return b; 
    } catch (IOException e) { 
     Log.e("", e.getMessage(), e); 
     return null; 
    } 
} 

Вот как я обрабатывать результата деятельности

/** 
* Receiving activity result method will be called after closing the camera 
* */ 
@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE && resultCode == Activity.RESULT_OK) { 
     if(imageToUploadUri != null){ 
      Uri selectedImage = imageToUploadUri; 
      getActivity().getContentResolver().notifyChange(selectedImage, null); 
      Bitmap reducedSizeBitmap = getBitmap(imageToUploadUri.getPath()); 
      if(reducedSizeBitmap != null){ 

       bkl.setImageBitmap(reducedSizeBitmap); 




      }else{ 
       Toast.makeText(getContext(),"Error while capturing Image",Toast.LENGTH_LONG).show(); 
      } 
     }else{ 
      Toast.makeText(getActivity(),"Error while capturing Image",Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

Пожалуйста, не Я говорю о его дублирующем вопросе, потому что я прочитал все другие вопросы об этом, и ничего не кажется работать. Я даже попробовал android:largeHeap = true в манифесте, затем восстановил состояние экземпляра, все, ничего, похоже, не сработало.

Любая помощь приветствуется.

ответ

0

Проверьте LeakCanary и посмотрите, где у вас есть утечки в действии.

Также у вас, как спагетти код:

}else{ 
      Toast.makeText(getContext(),"Error while capturing Image",Toast.LENGTH_LONG).show(); 
     } 
    }else{ 
     Toast.makeText(getActivity(),"Error while capturing Image",Toast.LENGTH_LONG).show(); 

getAplication(); getContext(); 

это не так. Создайте контекст или активность и восстановите все.

+0

lol #spaghetti_code. все в порядке, но эти линии никогда не используются. – vinstar

0

Если прохождение imageToUploadUri не важно пройти с intent, то вы можете получить эскиз в статистов intent «s с помощью (Bitmap) intent.getExtras().get("data"). В противном случае убедитесь, что imageToUploadUri.getPath() возвращает правильный путь. Вы можете использовать метод ниже, чтобы получить путь к этому изображению из uri.

public String getPathFromURI(Uri uri){ 
    String filePath = ""; 
    String[] filePahColumn = {MediaStore.Images.Media.DATA}; 
    Cursor cursor = getContentResolver().query(uri, filePahColumn, null, null, null); 
    if (cursor != null) { 
     if(cursor.moveToFirst()){ 
      int columnIndex = cursor.getColumnIndex(filePahColumn[0]); 
      filePath = cursor.getString(columnIndex); 
     } 
     cursor.close(); 
    } 
    return filePath; 
} 

Это может помочь.

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