0

我想拍攝一張圖片,將filpath存儲在全局變量中,然後顯示縮略圖。但在保存圖像後,它無法顯示圖像。Android相機,保存圖像,然後顯示圖像

失敗於:

startActivityForResult(takePicture, 0); 

//

//Camera Application For new Photo 
public void btnPhotoClicked(View v) { 

    Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    //Create the file path 
    File pictureDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    String pictureName = getPictureName(); 
    File imageFile = new File(pictureDirectory, pictureName); 
    Uri pictureUri = Uri.fromFile(imageFile); 

    //set the filepath to a global variable 
    imgurl = pictureUri.toString(); 


    //save the picture 
    takePicture.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri); 


    //start the activity 
    startActivityForResult(takePicture, 0);//zero can be replaced with any action code 

} 

這裏是顯示功能,它從取相片分離並挑相片

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) { 
     case 0: 
      if(resultCode == RESULT_OK){ 

       Uri selectedImage = imageReturnedIntent.getData(); 
       //Set the thumbnail 
       mImageView.setImageURI(selectedImage); 

       //set a textfield to the filepath 
       tximgurl.setText(imgurl); 


      } 

      break; 
     case 1: 
      if(resultCode == RESULT_OK){ 
       Uri selectedImage = imageReturnedIntent.getData(); 
       mImageView.setImageURI(selectedImage); 

       tximgurl.setText(imgurl); 
      } 
      break; 
    } 

} 

回答

1

這裏是代碼我已經用於捕捉和保存相機圖像然後將其顯示給ImageView的。

這裏是打開捕捉攝像頭圖像活動的方法。

private static final int CAMERA_PHOTO = 111; 
private Uri imageToUploadUri; 

private void captureCameraImage() { 
     Intent chooserIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     File f = new File(Environment.getExternalStorageDirectory(), "POST_IMAGE.jpg"); 
     chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
     imageToUploadUri = Uri.fromFile(f); 
     startActivityForResult(chooserIntent, CAMERA_PHOTO); 
    } 

那麼你的onActivityResult()方法應該是這樣的。

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

     if (requestCode == CAMERA_PHOTO && resultCode == Activity.RESULT_OK) { 
      if(imageToUploadUri != null){ 
       Uri selectedImage = imageToUploadUri; 
       getContentResolver().notifyChange(selectedImage, null); 
       Bitmap reducedSizeBitmap = getBitmap(imageToUploadUri.getPath()); 
       if(reducedSizeBitmap != null){ 
        imageview.setImageBitmap(reducedSizeBitmap); 
       }else{ 
        Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show(); 
       } 
      }else{ 
       Toast.makeText(this,"Error while capturing Image",Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

這裏是onActivityResult()中使用的getBitmap()方法。

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 = 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 = 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; 
     } 
    } 

我希望它有幫助!

編輯:

如果使用捆綁額外= data.getExtras();在你的onActivityResult中,它會返回縮略圖而不是實際的圖像。

+0

它不會崩潰,但這會失敗。 if(requestCode == CAMERA_PHOTO && resultCode == RESULT_OK) –

+0

你有沒有定義private static final int CAMERA_PHOTO = 111? – Rajesh

+0

是的,我有。在活動的頂部 –

1

嘗試這種情況:

啓動照相機的活動:

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 == RESULT_OK) { 
     Bundle extras = data.getExtras(); 
     Bitmap imageBitmap = (Bitmap) extras.get("data"); 
     mImageView.setImageBitmap(imageBitmap); 
    } 
} 

更多:http://developer.android.com/training/camera/photobasics.html

+0

對不起,但這並沒有保存圖像 –