2014-02-12 3 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); 
} 

код работает, если я попробуйте захватить изображение с помощью камеры, однако, когда я пытаюсь захватить изображение из галереи, он возвращает исключение NULL-указателя.

Может ли кто-нибудь предложить мне правильное направление? Благодаря

вот полный журнал:

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) { 
      } 
     } 
    } 

Лучше imnplementation из onActivityResult с использованием параметров, т.е. requestCode и responseCode

+0

Это работает для меня. благодаря – Sotti

0

попробовать этот код:

создать изображение в вашем xml

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

Попробуйте мой рабочий код, галерея изображения должны быть запрошены из MediaStore, используя его идентификатор

@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); 
} 
Смежные вопросы