2012-04-24 50 views
0

我试图在Android应用程序中保存图片。这里是我的回调函数:安卓相机应用程序中的空指针异常

ShutterCallback myShutterCallback = new ShutterCallback(){ 

    @Override 
    public void onShutter() { 
     Log.d(TAG, "shutter callback"); 

    }}; 


PictureCallback myPictureCallback_RAW = new PictureCallback(){ 

    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     Log.d(TAG, "raw callback"); 

    }}; 

PictureCallback myPictureCallback_JPG = new PictureCallback(){ 

    @Override 
    public void onPictureTaken(byte[] arg0, Camera arg1) { 
     // TODO Auto-generated method stub 
     Bitmap bitmapPicture 
      = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); 

     ContentValues values = new ContentValues(); 
     values.put(Images.Media.TITLE, "title"); 
     values.put(Images.Media.BUCKET_ID, "test"); 
     values.put(Images.Media.DESCRIPTION, "test Image taken"); 
     values.put(Images.Media.MIME_TYPE, "image/jpeg"); 

     Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 

     OutputStream imageFileOS; 
     try { 
      imageFileOS = getContentResolver().openOutputStream(uriTarget); 
      imageFileOS.write(arg0); 
      imageFileOS.flush(); 
      imageFileOS.close(); 

      Toast.makeText(CameraView.this, 
        "Image saved: " + uriTarget.toString(), 
        Toast.LENGTH_LONG).show(); 

     } catch (FileNotFoundException e) { 
      Log.d(TAG, "file not found " + e.getMessage()); 
      e.printStackTrace(); 
     } catch (IOException e) { 
      Log.d(TAG, "io exception " + e.getMessage()); 
      e.printStackTrace(); 
     } 

     //camera.startPreview(); 
     finish(); 
    } 
}; 

的问题是,对几种不同类型的手机,我得到了NullPointerException这行:

imageFileOS = getContentResolver().openOutputStream(uriTarget); 

有没有人碰到这个?

编辑 - 堆栈跟踪

04-24 11:52:03.979: E/AndroidRuntime(12695): FATAL EXCEPTION: main 
04-24 11:52:03.979: E/AndroidRuntime(12695): java.lang.NullPointerException 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:465) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.content.ContentResolver.openOutputStream(ContentResolver.java:361) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.content.ContentResolver.openOutputStream(ContentResolver.java:337) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at com.appfury.grafighters.CameraView$4.onPictureTaken(CameraView.java:234) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:536) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.os.Looper.loop(Looper.java:150) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at android.app.ActivityThread.main(ActivityThread.java:4263) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at java.lang.reflect.Method.invoke(Method.java:507) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-24 11:52:03.979: E/AndroidRuntime(12695): at dalvik.system.NativeStart.main(Native Method) 
+0

您是否检查'uriTarget'是否为空? – 2012-04-24 15:39:21

+0

我只是检查,它是空的。我怎样才能防止这一点?有关为什么ContentResolver不会为uri插入行的任何想法? – coder 2012-04-24 15:42:20

+0

http://stackoverflow.com/questions/9182022/android-getcontentresolver-insert-occasionally-returning-null – slayton 2012-04-24 15:48:19

回答

0

原来,问题是具体到HTC设备。我通过将图像文件保存在设备上的DCIM文件夹中解决了该问题,但未使用getContentResolver获取路径。

+0

那么用什么来获取URI? – Amaresh 2015-10-29 08:47:24

+0

你可以更具体,这样它会帮助我..我面临同样的问题,并试图解决在我的情况下,它是三星移动 – Amaresh 2015-10-29 08:48:04

1

它类似于this问题。检查logcat的,如果有媒体提供商和使用调试器引发的任何异常,以检查是否uriTarget为空当你调用 imageFileOS = getContentResolver().openOutputStream(uriTarget);