Android - ImageView不会显示用相机拍摄的照片

问题描述:

请耐心等待...我一直在寻找周围的为一个工作,裸骨头代码启动相机活动,拍摄一张照片,并将其放在一个简单的ImageView>上。 <下面贴出的代码激活了活动并拍摄了图片,但图片没有显示在ImageView上!缺少什么? :'(Android - ImageView不会显示用相机拍摄的照片

public class MainActivity extends Activity 
{ 
private static final int PICK_IMAGE = 0; 

private static final int PICK_IMAGE_FROM_GALLERY = 1; 

private Button mBtnCamera, mBtnGallery, mBtnCancel; 

private ImageView mImageView; 

private Uri mURI; 
private String mPhotoPath; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mImageView = (ImageView) findViewById(R.id.imgDisplayImage); 

    mBtnCamera = (Button) findViewById(R.id.btnPhotoCamera); 
    mBtnGallery = (Button) findViewById(R.id.btnPhotoGallery); 
    mBtnCancel = (Button) findViewById(R.id.btnCancel); 

    mBtnCamera.setOnClickListener(new OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      Intent camera = new Intent(); 

      camera.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 

      camera.putExtra("crop", "true"); 

      File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

      mURI = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myFile.jpg")); 

      camera.putExtra(MediaStore.EXTRA_OUTPUT, mURI); 

      startActivityForResult(camera, PICK_IMAGE); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == PICK_IMAGE) 
    { 
     // Result includes a Bitmap thumbnail? 
     if (data != null) 
     { 
      if (data.hasExtra("data")) 
      { 
       //Bitmap thumbnail = data.getParcelableExtra("data"); 

       Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 

       mImageView.setImageBitmap(thumbnail); 
      } 
     } 
     // If there is no thumbnail data, the image will have been stored in target output URI. 
     else 
     { 

      Cursor cursor = getContentResolver().query(
        Media.EXTERNAL_CONTENT_URI, new String[] 
          { 
           Media.DATA, 
           Media.DATE_ADDED, 
           MediaStore.Images.ImageColumns.ORIENTATION 
          }, 
          Media.DATE_ADDED, 
          null, 
          "date_added ASC" 
      ); 

      if (cursor != null && cursor.moveToFirst()) 
      { 
       do 
       { 
        mURI = Uri.parse(cursor.getString(cursor.getColumnIndex(Media.DATA))); 
        mPhotoPath = mURI.toString(); 
       } 
       while (cursor.moveToNext()); 
       cursor.close(); 
      } 

      // Resize full image to fit out in image view. 
      int width = mImageView.getWidth(); 
      int height = mImageView.getHeight(); 

      BitmapFactory.Options factoryOptions = new BitmapFactory.Options(); 

      factoryOptions.inJustDecodeBounds = true; 

      BitmapFactory.decodeFile(/*mURI.getPath()*/ mPhotoPath, factoryOptions); 

      int imageWidth = factoryOptions.outWidth; 
      int imageHeight = factoryOptions.outHeight; 

      // Determine how much to scale down the image 
      int scaleFactor = Math.min(
        imageWidth/width, 
        imageHeight/height 
        ); 

      // Decode the image file into a Bitmap sized to fill view 

      factoryOptions.inJustDecodeBounds = false; 
      factoryOptions.inSampleSize = scaleFactor; 
      factoryOptions.inPurgeable = true; 

      Bitmap bitmap = BitmapFactory.decodeFile(/*mURI.getPath()*/ mPhotoPath, factoryOptions); 

      mImageView.setImageBitmap(bitmap); 
     } 
    } 
} 
} 
+1

尝试给位图photo =(位图)data.getExtras()。get(“data”);在if条件而不是位图thumbnail = data.getParcelableExtra(“data”); – Droidee 2013-02-28 15:40:52

+0

尝试过,不工作:(无论如何我加了你的建议 – 2013-02-28 16:20:13

我在三星的Android的一些设备同样的问题,然后我实现的逻辑让拍摄的照片的路径

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == PICK_IMAGE) 
    { 
     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, CAMERA_REQUEST_CODE); 

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

     if(photoPath != null) { 
      Bitmap bitmap = BitmapFactory.decodeFile(photoPath); 
      ///Do Implement your logic whatever you want. 
      mImageView.setImageBitmap(bitmap); 
     } 
    } 
} 
+0

即使在合并你的建议后仍然无法工作:( 我将编辑主线程以显示整个代码现在的外观,太长以至于无法将所有内容都粘贴到此处 – 2013-02-28 16:08:24

+0

另外,我不是在一台虚拟机上测试这个,而是在一台Galaxy S3手机上。 – 2013-02-28 16:10:52

+0

我在三星有同样的问题,请将我的代码发布在onActivityResult上,然后你会得到位图的路径 – 2013-02-28 16:13:26

尝试增加

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); 

(和稍微延迟)在

if (requestCode == PICK_IMAGE) 

block。我认为问题可能是您的设备无法正确刷新Media Store。

(当然是更好的行动是使用MediaScanner到scan your file

屡试不爽的银河S3手机上运行。感谢TGMCians的帮助。

public class MainActivity extends Activity 
{ 
private static final int PICK_IMAGE = 0; 

private static final int PICK_IMAGE_FROM_GALLERY = 1; 

private Button mBtnCamera, mBtnGallery, mBtnCancel; 

private ImageView mImageView; 

private Uri mURI; 
private String mPhotoPath; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mImageView = (ImageView) findViewById(R.id.imgDisplayImage); 

    mBtnCamera = (Button) findViewById(R.id.btnPhotoCamera); 
    mBtnGallery = (Button) findViewById(R.id.btnPhotoGallery); 
    mBtnCancel = (Button) findViewById(R.id.btnCancel); 

    mBtnCamera.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      Intent camera = new Intent(); 

      camera.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 

      camera.putExtra("crop", "true"); 

      File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

      mURI = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "myFile.jpg")); 

      camera.putExtra(MediaStore.EXTRA_OUTPUT, mURI); 

      startActivityForResult(camera, PICK_IMAGE); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode == Activity.RESULT_OK) 
    { 
     if (requestCode == PICK_IMAGE) 
     { 
      Cursor cursor = getContentResolver().query(
        Media.EXTERNAL_CONTENT_URI, new String[] 
          { 
           Media.DATA, 
           Media.DATE_ADDED, 
           MediaStore.Images.ImageColumns.ORIENTATION 
          }, 
          Media.DATE_ADDED, 
          null, 
          "date_added ASC" 
      ); 

      if (cursor != null && cursor.moveToFirst()) 
      { 
       do 
       { 
        mURI = Uri.parse(cursor.getString(cursor.getColumnIndex(Media.DATA))); 
        mPhotoPath = mURI.toString(); 
       } 
       while (cursor.moveToNext()); 
       cursor.close(); 
      } 
      if (data != null) 
      { 
       if (data.hasExtra("data")) 
       { 
        Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 

        mImageView.setImageBitmap(thumbnail); 
       } 
       else 
       { 
        System.out.println("Intent bundle does not have the 'data' Extra"); 

        int width = mImageView.getWidth(); 
        int height = mImageView.getHeight(); 

        BitmapFactory.Options factoryOptions = new BitmapFactory.Options(); 

        factoryOptions.inJustDecodeBounds = true; 

        BitmapFactory.decodeFile(/*mURI.getPath()*/ mPhotoPath, factoryOptions); 

        int imageWidth = factoryOptions.outWidth; 
        int imageHeight = factoryOptions.outHeight; 

        // Determine how much to scale down the image 
        int scaleFactor = Math.min(
          imageWidth/width, 
          imageHeight/height 
          ); 

        // Decode the image file into a Bitmap sized to fill view 

        factoryOptions.inJustDecodeBounds = false; 
        factoryOptions.inSampleSize = scaleFactor; 
        factoryOptions.inPurgeable = true; 

        Bitmap bitmap = BitmapFactory.decodeFile(/*mURI.getPath()*/ mPhotoPath, factoryOptions); 

        mImageView.setImageBitmap(bitmap); 

       } 
      } 
     } 
    } 
    else 
    { 
     System.out.println("Picture taking activity NOT returning RESULT_OK"); 
    } 
} 
}