2014-02-12 77 views
2

抓取圖像時,我有下面的代碼,其用於抓取的圖像(無論是從照相機或畫廊),然後在一個ImageView的顯示它:空指針異常從廊

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if(resultCode == RESULT_OK) 
    { 
     if(requestCode == 1888) 
     { 
      final boolean isCamera; 
      if(data == null) 
      { 
       isCamera = true; 
      } 
      else 
      { 
       final String action = data.getAction(); 
       if(action == null) 
       { 
        isCamera = false; 
       } 
       else 
       { 
        isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       } 
      } 

      Uri selectedImageUriTemp; 
      Uri selectedImageUri; 
      if(isCamera) 
      { 
       selectedImageUriTemp = outputFileUri; 
       Bitmap image = decodeFile(new File(selectedImageUriTemp.getPath())); 
       selectedImageUri = getImageUri(image); 
      } 
      else 
      { 
       selectedImageUriTemp = data == null ? null : data.getData(); 
       Bitmap image = decodeFile(new File(selectedImageUriTemp.getPath())); 
       selectedImageUri = getImageUri(image); 
      } 

      Log.i("TAG", "IMAGEURI: " + selectedImageUri); 

      pictureThumb.setImageURI(selectedImageUri); 
      setRealPath(selectedImageUri); 
     } 
    } 
} 

private Uri getImageUri(Bitmap image){ 
    ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
    image.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 
    String path = Images.Media.insertImage(getApplicationContext().getContentResolver(), image, "Title", null); 
    return Uri.parse(path); 
} 

代碼工作,如果我嘗試使用相機抓取圖像,但是當我嘗試從圖庫抓取圖像時,它會返回空指針異常。

任何人都可以向我建議正確的方向嗎?由於

這裏是完整的日誌:

02-12 10:34:56.249: E/AndroidRuntime(14607): FATAL EXCEPTION: main 
02-12 10:34:56.249: E/AndroidRuntime(14607): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=Intent { dat=content://media/external/images/media/29 }} to activity {com.gelliesmedia.thumbqoo/com.gelliesmedia.thumbqoo.PictureBooth}: java.lang.NullPointerException: uriString 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.deliverResults(ActivityThread.java:3216) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3259) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.access$1100(ActivityThread.java:138) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1253) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.os.Looper.loop(Looper.java:137) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.app.ActivityThread.main(ActivityThread.java:4954) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at java.lang.reflect.Method.invokeNative(Native Method) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at java.lang.reflect.Method.invoke(Method.java:511) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at dalvik.system.NativeStart.main(Native Method) 
02-12 10:34:56.249: E/AndroidRuntime(14607): Caused by: java.lang.NullPointerException: uriString 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.net.Uri$StringUri.<init>(Uri.java:464) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.net.Uri$StringUri.<init>(Uri.java:454) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at android.net.Uri.parse(Uri.java:426) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.gelliesmedia.thumbqoo.PictureBooth.getImageUri(PictureBooth.java:224) 
02-12 10:34:56.249: E/AndroidRuntime(14607): at com.gelliesmedia.thumbqoo.PictureBooth.onActivityResult(PictureBooth.java:206) 

回答

1

您onActivityResult很凌亂。

嘗試編寫類似這樣的代碼.. 下面的兩個方法是定義從相機捕獲圖像並分別從圖庫中獲取圖像。

protected void captureFromCamera() { 
     // TODO Auto-generated method stub 
     Intent cameraIntent = new Intent(
       android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 

     startActivityForResult(cameraIntent, 
       UploadProfilePicActivity.REQ_CAMERA); 
    } 

    private void selectImageFromGallery() { 
     // TODO Auto-generated method stub 
     Intent intent = new Intent(); 
     intent.setType("image/*"); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(Intent.createChooser(intent, 
       getString(R.string.upload_profile_photo)), 
       UploadProfilePicActivity.REQ_GALLERY); 
    } 

現在onActivityResult你的代碼可能會是這樣的..

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == UploadProfilePicActivity.REQ_GALLERY && data != null 
       && data.getData() != null) { 
      Uri _uri = data.getData(); 
      try { 
       Bitmap profileBmp = Media.getBitmap(getContentResolver(), _uri); 
       if (profileBmp != null) { 
        image.setImageBitmap(profileBmp); 
       } 

      } catch (OutOfMemoryError e) { 
       Utility.displayToast(context, 
         getString(R.string.err_large_image)); 
      } catch (Exception e) { 

      } 
     } else if (requestCode == UploadProfilePicActivity.REQ_CAMERA 
       && data != null) { 
      try { 
       Bitmap profileBmp = (Bitmap) data.getExtras().get("data"); 
       if (profileBmp != null) { 
        image.setImageBitmap(profileBmp); 
       } 
      } catch (OutOfMemoryError e) { 
       Utility.displayToast(context, 
         getString(R.string.err_large_image)); 
      } catch (Exception e) { 
      } 
     } 
    } 

使用參數,即requestCoderesponseCode

+0

這爲我工作從mediastore查詢。謝謝 – Sotti

0

試試這個代碼onActivityResult的更好imnplementation:

創建在您的xml中的imageview

ImageView photoFrame; 
public static final int REQ_CODE_PICK_IMAGE   = 101; 

在OnCreate中添加此:

photoFrame.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       try 
       { 
        Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
           android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        startActivityForResult(galleryIntent, REQ_CODE_PICK_IMAGE); 
       }catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }); 

在OnActivityResult添加以下代碼:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch(requestCode) { 
    case REQ_CODE_PICK_IMAGE: 
     if(resultCode == RESULT_OK) 
     { 
      Uri selectedImage = data.getData(); 
      String[] filePathColumn = {MediaStore.Images.Media.DATA}; 

      Cursor cursor = getContentResolver().query(
           selectedImage, filePathColumn, null, null, null); 
      cursor.moveToFirst(); 

      int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
      photoPath = cursor.getString(columnIndex); 
      cursor.close(); 
      photoFrame.setImageBitmap(Utils.getScaledImage(photoPath, 120, 120)); 
     } 
    } 
} 

創建utils的一類,在裏面添加以下代碼:

public static Bitmap getScaledImage(String path, int width, int height){ 
     try { 
      //decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(path ,o);    
      //Find the correct scale value. It should be the power of 2. 
      final int REQUIRED_SIZE=70; 
      int width_tmp=o.outWidth, height_tmp=o.outHeight; 
      int scale=1; 
      while(true){ 
       if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
        break; 
       width_tmp/=2; 
       height_tmp/=2; 
       scale++; 
      } 

      //decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize=scale; 
      Bitmap scaledPhoto = BitmapFactory.decodeFile(path, o2); 
      scaledPhoto = Bitmap.createScaledBitmap(scaledPhoto, width, height, true); 
      return scaledPhoto; 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

與此代碼您可以從圖庫中選擇圖片,然後您可以在Imageview上查看圖像

0

試試我的工作代碼,圖庫圖片需要使用它的id

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

    if(resultCode == RESULT_OK) 
    { 
     if(requestCode == CAMERA_PIC_REQUEST) 
     {    
      loadCameraImage(); 
      // Loading from camera is based on the intent passed 
     } 
     else if(requestCode == SELECT_PICTURE) 
     { 
      Uri currentUri = data.getData(); 
      String realPath = getRealPathFromURI(currentUri); 
    // You will get the real path here then you can work with that path as normal 
     } 
    } 

} 

    // Gets the real path from MEDIA 
public String getRealPathFromURI(Uri contentUri) { 

    String [] proj={MediaStore.Images.Media.DATA}; 
    Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null); 
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 

    return cursor.getString(column_index); 
}