0

我創建了一個活動,允許用戶將圖片添加到該活動中的ImageView中。我創建了一個按鈕,爲該活動打開一個上下文菜單,並且爲用戶提供了從圖庫中選取圖片或使用相機拍攝圖片的選項。

如果我選擇第一個選項 - 從圖庫中選擇一張圖片,它可以正常工作。畫廊已打開,我選擇了圖片,我的活動恢復並且圖片被添加到ImageView。
Android - 相機活動被打開而不是圖片庫

  1. 如果我再次打開上下文菜單,並嘗試打開圖庫,相機 活動被打開:選擇第二個選項,在拍照,恢復到我的活動後

    奇怪的事情開始發生而不是
  2. 我「完成操作需使用」對話框顯示
  3. 我開畫廊關閉相機活動,並恢復到我的活動,挑選一張照片,並拋出NullPointerException異常

爲什麼我有這種行爲和異常?我試過尋找類似的主題,但還沒有找到解決方案。
下面是我的活動

public boolean onContextItemSelected(MenuItem item) { 
    super.onContextItemSelected(item); 
    switch(item.getItemId()) { 
    case R.id.cm_Select_picture: { 
     // TODO open gallery 
     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, ""), RC_SELECT_PICTURE); 
    } 
    case R.id.cm_Take_picture: { 
     // TODO open camera 
     Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     startActivityForResult(cameraIntent, RC_TAKE_PICTURE); 
    } 
    default: return false; 
    } 
} 


protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode == RESULT_OK) { 
     switch(requestCode) { 
     case RC_SELECT_PICTURE: { 
      Log.d(TAG, "Case select picture"); 
      Uri selectedImageUri = data.getData(); 
      String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

      Cursor cursor = getContentResolver().query(selectedImageUri 
        , filePathColumn, null, null, null); 
      cursor.moveToFirst(); 
      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      String filePath = cursor.getString(columnIndex); 
      cursor.close(); 
      Bitmap pic = BitmapFactory.decodeFile(filePath); 
      goodsImage.setImageBitmap(pic); 
     } 
     case RC_TAKE_PICTURE: { 
      Log.d(TAG, "Case take picture"); 
      if(data.getExtras().get("data") != null) { 
       Bitmap pic = (Bitmap) data.getExtras().get("data"); 
       goodsImage.setImageBitmap(pic); 
      } 
     } 
     } 
    } 
} 


04-26 01:34:59.529: E/AndroidRuntime(20531): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { dat=content://media/external/images/media/9 }} to activity {com.forestassistant/com.statistics.GoodsActivity}: java.lang.NullPointerException 

回答

1

我曾經從我的活動通話攝像頭活動的方法,並且效果不錯,在這裏是我的代碼:

setMediaUri(getNewMediaFilePath(actOwner.getContentResolver())); 
       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, getMediaUri()); 
       startActivityForResult(cameraIntent, CAMERA_CAPTURE_REQUEST_CODE); 

,當結果回調

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK 
      && requestCode == CAMERA_CAPTURE_REQUEST_CODE) { 
     Drawable toRecycle= imgView.getDrawable(); 
     if (toRecycle != null) {     
      ((BitmapDrawable)imgView.getDrawable()).getBitmap().recycle(); 
     } 
     mImg = decodeFileIntoRequiredSize(getPath(getMediaUri(),this), requiredSizeForImage); 
     imgView.setImageBitmap(mImg);   
    } 
public Bitmap decodeFileIntoRequiredSize(String filePath,int requiredSize){ 
    Bitmap b = null; 
    try { 
     File f = new File(filePath); 
     //Decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 

     FileInputStream fis = new FileInputStream(f); 
     BitmapFactory.decodeStream(fis, null, o); 
     fis.close(); 
     int scale = 1; 
     if (o.outHeight > requiredSize || o.outWidth > requiredSize) { 
      scale = (int)Math.pow(2, (int) Math.round(Math.log(requiredSize/(double) Math.max(o.outHeight, o.outWidth))/Math.log(0.5))); 
     } 

     //Decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     fis = new FileInputStream(f); 
     b = BitmapFactory.decodeStream(fis, null, o2); 
     fis.close(); 
    } catch (IOException e) { 
    } 
    return b; 
} 
public String getPath(Uri uri,Activity act) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = act.managedQuery(uri, projection, null, null, null); 
    if (cursor != null) {  
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } else 
     return null; 
} 
public Uri getNewMediaFilePath(ContentResolver contentResolver) { 
    ContentValues values = new ContentValues(); 

    //create the directory 
    // /mnt/sdcard/DCIM/Camera/IMG_20111101_111922.jpg 
    String cameraDir = "/Camera"; 
    //File dir1 = act.getExternalFilesDir(Environment.DIRECTORY_DCIM); 
    File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()+cameraDir); 
    if(!dir.exists()) dir.mkdir(); 

    //use date as filename 
    String name = "IMG_" + (String) android.text.format.DateFormat.format("yyyyMMdd_hhmmss",new Date()); 
    String path = dir.getPath()+File.separator + name; 
    values.put(MediaStore.MediaColumns.TITLE, name); 
    values.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis()); 
    Uri base = null; 
    path += ".jpg"; 
    base = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg"); 
    values.put(MediaStore.MediaColumns.DATA, path); 
    return contentResolver.insert(base, values); 
} 

希望這有助於你。

+0

我剛剛意識到,我忘了在每種情況下添加一箇中斷語句......它現在按預期工作。無論如何,謝謝你的回答! – droid8421 2012-04-26 09:07:26

相關問題