2016-07-03 6 views
4

Я могу сохранить изображение, взятое из камеры во внутреннее хранилище, однако я не могу загрузить его в ImageView, который остается пустым. Я прочитал все соответствующие предложения, но не нашел подходящего решения. Вы можете найти соответствующий код ниже, любая помощь будет оценена, как я борюсь с ним в течение нескольких дней ...Невозможно загрузить изображение с камеры в ImageView

Manifest разрешения:

<uses-feature android:name="android.hardware.camera" /> 
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

ImageView на XML:

<ImageView 
    android:id="@+id/recipeImage" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginRight="10dp" 
    android:layout_weight="1" 
    android:background="@color/backgroundColorHomeBottomLayout" 
    android:padding="30dp" /> 

Соответствующая деятельность:

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

    if (requestCode == REQUEST_IMAGE_CAPTURE) { 
     if (resultCode == RESULT_OK) { 
      setPic(); 
      //mImageView.setImageURI(fileUri); 
     } 
     else if (resultCode == RESULT_CANCELED) { 
      /** user cancelled Image capture */ 
      Toast.makeText(this, 
        "User cancelled image capture", Toast.LENGTH_SHORT) 
        .show(); 
     } else { 
      /** failed to capture image */ 
      Toast.makeText(this, 
        "Sorry! Failed to capture image", Toast.LENGTH_SHORT) 
        .show(); 
     } 
    } 
} 

/** Internal memory methods */ 
private void launchCameraIntent() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     /** Ensure that there's a camera activity to handle the intent */ 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     /** Create the File where the photo should go */ 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      Uri photoURI = FileProvider.getUriForFile(this, 
        "v3.com.mycookbook5.fileprovider", 
        photoFile); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); 
     } 
    } 
} 

/** return a unique file name for a new photo using a date-time stamp */ 
private File createImageFile() throws IOException { 
    /** Create an image file name */ 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 
    /** Save a file: path for use with ACTION_VIEW intents */ 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 

private void setPic() { 
    // Get the dimensions of the View 
    int targetW = mImageView.getWidth(); 
    int targetH = mImageView.getHeight(); 

    // Get the dimensions of the bitmap 
    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
    int photoW = bmOptions.outWidth; 
    int photoH = bmOptions.outHeight; 

    // Determine how much to scale down the image 
    int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 

    // Decode the image file into a Bitmap sized to fill the View 
    bmOptions.inJustDecodeBounds = false; 
    bmOptions.inSampleSize = scaleFactor; 
    bmOptions.inPurgeable = true; 

    Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
    mImageView.setImageBitmap(bitmap); 
} 

Log:

07-03 12:56:07.188 3950-16091/? E/Drive.UninstallOperation: Package still installed v3.com.mycookbook5 
07-03 12:56:35.350 19680-19680/v3.com.mycookbook5 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/Android/data/v3.com.mycookbook5/files/Pictures/JPEG_20160703_125629_-664091716.jpg: open failed: ENOENT (No such file or directory) 
07-03 12:56:35.350 19680-19680/v3.com.mycookbook5 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/Android/data/v3.com.mycookbook5/files/Pictures/JPEG_20160703_125629_-664091716.jpg: open failed: ENOENT (No such file or directory) 
+0

Пожалуйста размещают журналы устройств (приложение или даже не фильтруются по имени приложения). Не исключение? такое же поведение на других устройствах? – FunkSoulBrother

+0

Журнал прилагается, я надеюсь, что тот самый, я новичок в Android. Я тестировал только на One Plus One – Napo

ответ

0

Я бы сказал, что вы можете получить изображение с нулевым размером из-за попытки изменить его размер до размера imageView (который, если он еще не отображен, может быть нулевого размера).

Попробуйте загрузить изображение без каких-либо манипуляций и после успеха - измените свой код, чтобы уменьшить потребление памяти, но пока не получите оптимальный результат.

Удачи.

+0

Спасибо за вашу помощь, однако я просто делаю первые шаги в Android и не знаю, как это сделать. – Napo

1

Я считаю, что ваша проблема заключается в том, что вы не даете изображению необходимое время для сохранения на SD-карте, поскольку код начинает искать его до его полной сохранности, поэтому вам необходимо предоставить обработчик с задержкой, чтобы убедившись, что образ был успешно сохранен, а также использовать следующий способ, чтобы получить путь к изображению:

new Handler().postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      setPic(); 
     } 
    }, 750); 

и для получения изображения с SDCard:

File file = new File(Environment.getExternalStorageDirectory()+File.separator + "image_name.jpg"); 
Bitmap bitmap = decodeSampledBitmapFromFile(file.getAbsolutePath(), 1000, 700); 

public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) 
{ 

    /* 
    * here you set all of your bmOptions specs 
    */ 

    return BitmapFactory.decodeFile(path, bmOptions); 
} 
+0

Спасибо Muhammed, на самом деле я сохраняю изображение во внутреннем хранилище. Ваше решение должно работать и на это? – Napo

+0

сначала попробуйте способ отложенного обработчика –

0

Вы понимаете, что вам нужно будет вытащить дополнительные данные из намерения? 'onActivityResult' вернется к вашей активности с помощью кода результата и WITH EXTRA DATA, который является растровым изображением, вы должны передать эти данные (каким бы способом вы ни выбрали) вашему методу setPic.
Чтобы получить Bitmap фотографию, которую вы можете использовать код вниз

if (requestCode == REQUEST_IMAGE_CAPTURE) { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); 
} 
0

попробуйте этот код для зефира

Uri imageFileUri = data.getData(); 

final Bitmap bitmap = getBitmapFromUri(imageFileUri); 

private Bitmap getBitmapFromUri(Uri uri) throws IOException { 
     ParcelFileDescriptor parcelFileDescriptor = 
       getLocalContext().getContentResolver().openFileDescriptor(uri, "r"); 
     FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); 
     Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); 
     parcelFileDescriptor.close(); 
     return image; 
    } 



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

    if (requestCode == REQUEST_IMAGE_CAPTURE) { 
     if (resultCode == RESULT_OK) { 

      //mImageView.setImageURI(fileUri); 
Uri imageFileUri = data.getData(); 
final Bitmap bitmap = getBitmapFromUri(imageFileUri); 
setPic(bitmap); 
     } 
     else if (resultCode == RESULT_CANCELED) { 
      /** user cancelled Image capture */ 
      Toast.makeText(this, 
        "User cancelled image capture", Toast.LENGTH_SHORT) 
        .show(); 
     } else { 
      /** failed to capture image */ 
      Toast.makeText(this, 
        "Sorry! Failed to capture image", Toast.LENGTH_SHORT) 
        .show(); 
     } 
    } 
} 
1

Проблема решена. Чтобы помочь другим, вот как это должно быть выполнено:

  1. Сбросить цельSdkVersion на build.gradle от 23 до> 22, чтобы избежать проблем с разрешением.
  2. Добавьте следующий код launchCameraIntent() метод:

    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
    
  3. метод Изменение setPic следующим образом:

    Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getPath()); 
        Matrix matrix = new Matrix(); 
        matrix.postRotate(90); 
        Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); 
        Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 200, 150 ,false); 
        mImageView.setImageBitmap(scaledBitmap); 
    
Смежные вопросы