2014-09-06 6 views
1

В приложении для Android, которое я делаю, пользователь делает снимок, который я хочу отобразить позже в нескольких действиях. Я придумал ошибку «из памяти» при отображении снимка в настоящее время в представлении изображения, поэтому я решил использовать код от http://developer.android.com/training/displaying-bitmaps/load-bitmap.html, чтобы сделать это эффективно. Вот методы, которые я использую:Android: намерение в OnActivityResult дает неправильный путь

public static int calculateInSampleSize(
     BitmapFactory.Options options, int reqWidth, int reqHeight) { 

    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 


     while ((halfHeight/inSampleSize) > reqHeight 
       && (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

и

public static Bitmap decodeSampledBitmap(Uri mUri, int reqWidth, int reqHeight) { 

    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(mUri.getPath(), options); 

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeFile(mUri.getPath, options); 

}; 

Я позволил пользователю сфотографировать с помощью метода:

static final int REQUEST_IMAGE_CAPTURE = 1; 

private void dispatchTakePictureIntent(){ 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if(takePictureIntent.resolveActivity(getPackageManager()) != null){ 
     startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
    } 
} 

А потом получать принятые данные изображения:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK){ 
     Uri imageUri = null; 
     if(data != null){ 
      imageUri = data.getData(); 
     } 

     ImageView imageView = (ImageView)findViewById(R.id.new_photo); 
     imageView.setImageBitmap(decodeSampledBitmap(imageUri, imageView.getWidth(), imageView.getHeight())); 


    } 

} 

Мое приложение разбивается, и я получаю info: «Файл не найден или нет такой директории». Я проверил, что делает файл imageUri.getPath(), и в моем случае его: "/ external/images/media/1777" (что кажется мне довольно странным, потому что я не пользуюсь SD-картой) и снятая фотография фактически сохраняется в "/storage/emulated/0/DCIM/100ANDRO/DSC_0052.JPG". У вас есть идеи, что я делаю неправильно?

+0

Вы используете метод getExternalStorage? – KOTIOS

+0

Нет, я не использую его. Все это с фотографией и ее отображением «происходит» в методах, которые я написал. –

+0

ok is ur изображение сохранено? вы используете правильный эмулятор? – KOTIOS

ответ

2

Намерение Дополнительный предел Макс 1MB примерно до пряники ..

Я нашел магическое число 86389 в Jellybean если вы пришлете выше этого он будет бросать память из исключения ..

Solution : Pass Image Uri, dont pass full bitmap object

+0

Хм, это странно, я использую Android 4.3. Хорошо, спасибо, я постараюсь это сделать :) –

+0

приветствую ... я столкнулся с подобной проблемой, все самое лучшее, дайте мне знать результат .. – KOTIOS

+0

Работал, спасибо большое! :) –

0

Используйте следующий код перед запускомActivityForResult (takePictureIntent, REQUEST_IMAGE_CAPTUR Е);

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri()); 

Где getImageUri() является

private Uri getImageUri() { 
    // Store image in dcim 
    File myDir = new File(Environment.getExternalStorageDirectory() 
      + "/My_App");  
    if(!myDir.exists()) 
     myDir.mkdir(); 
    File file = new File(myDir, "MyImage.png"); 
    Uri imgUri = Uri.fromFile(file); 
    return imgUri; 
} 

Читайте Android official docs regarding this для дальнейшего уточнения.

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