2011-01-31 13 views
7

मैं कैमरे का उपयोग करने वाले ऐप को कोड करने का प्रयास कर रहा हूं। सतह प्राप्त करने की कोशिश करते समय मुझे एक नलपोइंटर एक्सेप्शन मिल रहा हैहोल्डर जो मैं अंततः सतह पर जाता हूं क्रिएटेड() जो कैमरे को शुरू करता है। क्या कोई स्थिति है जब GetHolder() न्यूल देता है?surfaceView.getHolder SurfaceHolder वापस नहीं कर रहा है

धन्यवाद।

package com.tecmark; 

import java.io.IOException; 

import android.app.Activity; 

import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.Window; 
import android.view.WindowManager; 

public class cameraView extends Activity implements SurfaceHolder.Callback{ 

    SurfaceView mSurfaceView; 
    SurfaceHolder mSurfaceHolder; 
    Camera mCamera; 
    boolean mPreviewRunning; 

/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


     getWindow().setFormat(PixelFormat.TRANSLUCENT); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 

     WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     //setContentView(R.layout.camera_surface); 

     mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); 
     Log.i("surfaceholder = ", "about to get surface holder"); 
     try{ 
     mSurfaceHolder = mSurfaceView.getHolder(); 
     }catch(Exception e){ 
     e.printStackTrace(); 
     } 

     Log.i("surfaceholder = ", ""+mSurfaceHolder.toString()); 

     mSurfaceHolder.addCallback(this); 

     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     setContentView(R.layout.camera_surface); 

     surfaceCreated(mSurfaceHolder); 







    } 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    if (mPreviewRunning) { 

    mCamera.stopPreview(); 

    } 

    Camera.Parameters p = mCamera.getParameters(); 

    p.setPreviewSize(w, h); 

    mCamera.setParameters(p); 

    try { 

    mCamera.setPreviewDisplay(holder); 

    } catch (Exception e) { 

    e.printStackTrace(); 

    } 

    mCamera.startPreview(); 

    mPreviewRunning = true; 

    } 






@Override 
public void surfaceCreated(SurfaceHolder holder) { 




    try{ 
    Log.i("camera ", "about to open camera"); 
     mCamera = Camera.open(); 
     Log.i("camera ", " camera opened"); 
     mCamera.getParameters(); 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } catch (IOException e) { 

    e.printStackTrace(); 
    } 
    Log.i("camera ", "ok"); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    mCamera.stopPreview(); 

    mPreviewRunning = false; 

    mCamera.release(); 

} 




}//end of activity 



01-31 15:29:17.773: WARN/System.err(9144): java.lang.NullPointerException 
01-31 15:29:17.778: WARN/System.err(9144):  at com.tecmark.cameraView.onCreate(cameraView.java:42) 
01-31 15:29:17.778: WARN/System.err(9144):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-31 15:29:17.778: WARN/System.err(9144):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.os.Looper.loop(Looper.java:123) 
01-31 15:29:17.783: WARN/System.err(9144):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
01-31 15:29:17.783: WARN/System.err(9144):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 15:29:17.788: WARN/System.err(9144):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 15:29:17.788: WARN/System.err(9144):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-31 15:29:17.788: WARN/System.err(9144):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
01-31 15:29:17.788: WARN/System.err(9144):  at dalvik.system.NativeStart.main(Native Method) 
01-31 15:29:17.793: DEBUG/AndroidRuntime(9144): Shutting down VM 
01-31 15:29:17.793: WARN/dalvikvm(9144): threadid=3: thread exiting with uncaught exception (group=0x4001b180) 
01-31 15:29:17.793: ERROR/AndroidRuntime(9144): Uncaught handler: thread main exiting due to uncaught exception 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tecmark/com.tecmark.cameraView}: java.lang.NullPointerException 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.os.Handler.dispatchMessage(Handler.java:99) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.os.Looper.loop(Looper.java:123) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at dalvik.system.NativeStart.main(Native Method) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144): Caused by: java.lang.NullPointerException 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at com.tecmark.cameraView.onCreate(cameraView.java:47) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
01-31 15:29:17.803: ERROR/AndroidRuntime(9144):  ... 11 more 

उत्तर

15

उम्मीद के लिए एक नया उत्तर शुरू करना अधिक स्पष्ट होना चाहिए। दोबारा, मुझे लगता है कि मूल मुद्दा यह है कि आप क्रिएट बनाम ऑनस्यूम पर कर रहे सामानों की मात्रा है।

मुझे लगता है कि आपके पास मूल समस्या यह है कि दृश्य/गतिविधि जीवन चक्र के कुछ हिस्सों को सतह से निपटना शुरू करने से पहले अपना कोर्स चलाने की आवश्यकता है और इसके साथ पूर्ववत करना शुरू करें।

मुझे लगता है कि के कुछ नहीं कर रहा हूँ, लेकिन यहाँ विभिन्न स्थानों एक संवर्धित वास्तविकता अनुप्रयोग में मैं विभिन्न कैमरा और सतह दृश्य सामान के साथ सौदा है कि काम करता है के टूटने है:

onCreate() 
{ 
    // just set content view. do nothing with the camera or surfaceView yet 
    setContentView(R.layout.main); 
} 

onResume() 
{ 
     // open camera 
    mCamera = Camera.open(); 

    // init surface view 
    sv = (SurfaceView)this.findViewById(R.id.SurfaceView01); 
      mHolder = sv.getHolder(); 
      mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      mHolder.setSizeFromLayout(); 
      mHolder.addCallback(this); 
} 

surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
{ 
    mCamera.setPreviewDisplay(holder); 
    // set any cam params you need... 

    mCamera.startPreview(); 
} 

समान करने के लिए अपने कोड के पुनर्गठन की कोशिश करो । मेरी आँखों से बाहर गिनती करने के लिए जहां एनपीई अपने स्रोत से हो रहा था की कोशिश कर रहा अस्पष्ट मिला लेकिन मुझे लगता है कुछ समस्याएं हैं:

  • आप पहले youve setContentView()
  • बुलाया SurfaceView के संदर्भ में प्राप्त करने की कोशिश कर रहे आप कॉलबैक के माध्यम से इसे कॉल करने के बजाए सीधे सतह की विधि को बुला रहे हैं।

आशा है कि मदद करता है। हम अभी तक यह पता लगाएंगे!

+0

अरे बहुत बहुत धन्यवाद, मैं वास्तव में आपकी मदद की प्रशंसा करता हूं। कैमरा अब काम कर रहा है। मैं ऐप को चेहरा पहचान शामिल करने की कोशिश कर रहा हूं, इसलिए अब इसे देखने के लिए जा रहा हूं। मुझे सतह के दृश्य और सतहधारक कॉलबैक कक्षाओं को बेहतर ढंग से देखने की आवश्यकता है ताकि यह समझने के लिए कि किन तरीकों को कार्यान्वित करने की आवश्यकता है और मेरा कोड कहां रखा जाए। दोबारा धन्यवाद – turtleboy

+0

अगर मैं नया कोड पोस्ट करना चाहता हूं तो मैं यह कैसे करूं? क्या मुझे मूल प्रश्न संपादित करने की आवश्यकता है या क्या मैं टिप्पणी में कोड पोस्ट कर सकता हूं? धन्यवाद – turtleboy

+0

भयानक !!! मैं कल्पना नहीं कर सकता कि इस त्रुटि को इस तरह ठीक किया जा सकता है। धन्यवाद :) – hqt

0

मेरे सिर के ऊपर बंद, मुझे लगता है कि आप onResume में बजाय onCreate में SurfaceView सामान करने की आवश्यकता होगी, अन्यथा यह ठीक लग रहा है।

इसके अलावा, आप बुला प्रयास करना चाहिए:

mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
mSurfaceHolder.setSizeFromLayout(); 

सही होने के बाद आप धारक को एक रेफरी मिलता है, लेकिन पूर्वावलोकन शुरू करने से पहले।

+0

ठीक है मैंने सतह की सामग्री को रेस्यूम() में रखा है; अभी भी काम नहीं कर रहा है। मैंने सतही धारक और सतही दृश्य वस्तु को लॉग कर दिया है और उन्हें तुरंत चालू कर दिया गया है। Camera.open() विधि ठीक के रूप में लॉग है। मुझे त्रुटियां मिल रही हैं कि कैमरा सेवा से कनेक्ट नहीं हो सकता है, ऐप पास की गई शून्य सेवा और सतह अभी तक सेट नहीं है। एक सतह भी है। आउटऑफ संसाधन स्रोत अपवाद। ऐसा लगता है कि सतह को xml – turtleboy

+0

से सेट नहीं किया जा रहा है PUSH_BUFFERS के बारे में अद्यतन उत्तर देखें। अगर यह काम नहीं करता है, तो मैं एक गहरी नजर डालें और कुछ एआर ऐप्स की तुलना करूंगा जो मैं काम कर रहा हूं। – mmeyer

+0

ठीक है setSizeFromLayout() के संबंध में पहले। यहां डीबग थूक रहा है। धन्यवाद। – turtleboy

संबंधित मुद्दे