2013-07-16 3 views
1

Я сделал снимок с помощью MediaStore и сохранил его. Я вижу изображение в своей галерее. Однако, когда я пытаюсь установить растровое изображение изображения в свой ImageView, он становится пустым.ImageView.setImageBitmap is blank

String abspath; 

public void getPicture(View view) { 

     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     File imageFile = new File(PATH + "/image.jpg"); 
     abspath = imageFile.getAbsolutePath().toString(); 

     cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile)); 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(abspath))) 

     startActivityForResult(cameraIntent, RESULT_CAMERA);   
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    setContentView(R.layout.activity); 

    if(requestCode == RESULT_CAMERA) { 
      // open the image file 
      Bitmap bitmap = BitmapFactory.decodeFile(abspath); 
      ImageView imageView = (ImageView)findViewById(R.id.imageView); 

      imageView.setImageBitmap(bitmap); //imageView is now blank, although my saved image is not a blank image 
      //imageView.setImageURI(Uri.fromFile(new File(abspath))); same result 

} 

}

+0

На какой версии Android вы проверяете код? –

+0

@BrijeshThakur 17 –

ответ

0

В моем собственном коде, я делаю следующие вызовы перед попыткой чтения из медиа URI:

activity.getContentResolver().notifyChange(mediaUri, null); 
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
intent.setData(mediaUri); 
activity.sendBroadcast(intent); 

Это попытка гарантировать, что система правильно обновляется для разрешения URI содержимого.

Редактировать: Извините, я заметил, что вы пытаетесь прочитать путь к файлу, а не URI. Я не знаю, почему это может быть неудачно (кроме проблем с разрешениями), но, возможно, вы можете попробовать получить доступ к файлу через URI, полученный из URI.fromFile (imageFile).

0

Это работает для меня:

Intent intent = new Intent(
          MediaStore.ACTION_IMAGE_CAPTURE); 
        intent.putExtra(MediaStore.EXTRA_OUTPUT, 
          mCapturedImageURI); 
        startActivityForResult(intent, TAKE_PICTURE) 

следуют:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    String imagePath = null;     
     if (requestCode == TAKE_PICTURE) 
      if (resultCode == Activity.RESULT_OK) {     
       imagePath = getPath(mCapturedImageURI); 
      } 
    } 

    if (imagePath != null) { 
     // TODO: to this from asynctask 
     ExifInterface exif = null; 
     try { 
      exif = new ExifInterface(imagePath); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     int orientation = exif.getAttributeInt(
       ExifInterface.TAG_ORIENTATION, 
       ExifInterface.ORIENTATION_NORMAL); 
     mBabymScaledPhoto = mApp.getBabyBitmapFromPath(imagePath, 
       orientation); 
     ImageView iv = (ImageView) fragView 
       .findViewById(R.id.welcome_iv_babyPhoto); 
     iv.setImageBitmap(mBabymScaledPhoto); 
    } 

} 
public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    CursorLoader cursorLoader = new CursorLoader(fragView.getContext(), 
      uri, projection, null, null, null); 
    Cursor cursor = cursorLoader.loadInBackground(); 
    if (cursor != null) { 
     // HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL 
     // THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } else 
     return null; 
} 
1

я не знаю, но есть некоторые изменения, получая изображение с камеры в качестве части onActivityResult() в API версии 17. вы пытаетесь получить изображение с помощью imagePath. Но на самом деле камера не хранит его по указанному имени. Он использует собственный механизм для хранения изображения. Вы можете видеть, войдя в галерею. Название изображения будет отличаться от того, что вы дали. Как рекомендовано Лучше использовать ContentResolver для запроса последнего захваченного изображения. Вы можете изменить запрос в соответствии с вашим требованием. Ниже приведен пример.

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PIC_CAMERA_IMAGE && resultCode == RESULT_OK) { 

      Uri selectedImage=null; 
        // Works on API 16 or Below 
      if(null!=data) 
      { 
       selectedImage = data.getData(); 
      } 
        // For API 17 
      if(null==selectedImage) 
      { 
       final ContentResolver cr = getContentResolver();  
       final String[] p1 = new String[] { 
         MediaStore.Images.ImageColumns._ID, 
         MediaStore.Images.ImageColumns.DATE_TAKEN 
       };     
       Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC");  
       if (c1.moveToFirst()) { 
        String uristringpic = "content://media/external/images/media/" +c1.getInt(0); 
        selectedImage = Uri.parse(uristringpic);      
       } 
       c1.close(); 

      } 


     } 

    }