2013-04-16 95 views
0

我已經使用android相機代碼教程http://developer.android.com/guide/topics/media/camera.html#custom-camera爲android創建了相機應用程序。它適用於XperiaZ - LgoptimusBlack - GalaxyNexus4和其他一些設備。但是Nexus-7 android 4.2.2給了我一個surfaceview錯誤,它不能在表面上創建相機預覽。我試過其他一些樣品,但沒有結果。 這裏是logcat:Android相機預覽代碼與Nexus7不兼容-surfaceView錯誤

FATAL EXCEPTION: main 
     java.lang.NullPointerException 
    at com.test.mycamera.CameraPreview.surfaceCreated(CameraPreview.java:33) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:569) 
at android.view.SurfaceView.access$000(SurfaceView.java:86) 
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:174) 
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:680) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1842) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
at android.view.Choreographer.doFrame(Choreographer.java:532) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
at android.os.Handler.handleCallback(Handler.java:725) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5041) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
at dalvik.system.NativeStart.main(Native Method) 
+0

你也可以發佈一些代碼? – Shade

回答

1

Nexus 7只有一個前置攝像頭。

Google代碼無法處理這個事實。它使用:

public static Camera getCameraInstance(){ 
    Camera c = null; 
    try { 
     c = Camera.open(); // attempt to get a Camera instance 
    } 
    catch (Exception e){ 
     // Camera is not available (in use or does not exist) 
    } 
    return c; // returns null if camera is unavailable 
} 

但後來:

mCamera = getCameraInstance(); 

而且沒有檢查是否是有效。

的問題是,Camera.open()將返回null如果沒有後置攝像頭:

創建一個新的Camera對象訪問第一個朝後相機的設備上。如果設備沒有後置攝像頭,則返回null。

具有諷刺意味的是,Camera.open(0);應該工作,但盲目選擇ID爲0的相機絕對不是你想要的真實產品。此外,請注意這是open(int cameraId)但沒有說明爲open()如下:

注意:在某些設備上,這種方法可能需要很長的時間才能完成。最好從工作者線程調用此方法(可能使用AsyncTask)以避免阻塞主應用程序UI線程。

然後,您不一定希望在實際產品中使用谷歌代碼片段,因爲它們的成熟度水平。正如我們剛剛看到的。

祝你好運。

+0

謝謝,它的作品 – bob

+0

很高興我能幫到你。接受我的回答? –