2012-03-07 143 views
0

我創建了一個應用程序,我有一個相機預覽。我試圖創建一個觸摸事件,當我觸摸預覽時,會發生一些事情(比方說,會出現一個敬酒)。 問題是,當我觸摸預覽,2秒後應用程序崩潰。 我有兩個類:當我觸摸屏幕時,我的應用程序崩潰 - OnTouch方法失敗

CameraActivity:

public class CameraActivity extends Activity { 
    private static final String TAG = "CameraDemo"; 
    Preview preview; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     preview = new Preview(this); 
     ((FrameLayout) findViewById(R.id.preview)).addView(preview); 
     ((FrameLayout) findViewById(R.id.preview)).setOnTouchListener(preview); 

     Log.d(TAG, "Camera Activity Created."); 
    } 
} 

和預覽:

class Preview extends SurfaceView implements SurfaceHolder.Callback, OnTouchListener { 
private static final String TAG = "Preview"; 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

// Called once the holder is ready 
public void surfaceCreated(SurfaceHolder holder) { 
    camera = Camera.open(); 
    try { 
     camera.setDisplayOrientation(90); 

     camera.setPreviewDisplay(holder); 

     camera.setPreviewCallback(new PreviewCallback() { 
      // Called for each frame previewed 
      public void onPreviewFrame(byte[] data, Camera camera) { 
       Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis()); 
       Preview.this.invalidate(); 
      } 
     }); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


} 



// Called when the holder is destroyed 
public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
} 

// Called when holder has changed 
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    camera.startPreview(); 
} 

public boolean onTouch(View v, MotionEvent event) { 
      Toast.makeText(findViewById(R.id.preview).getContext(), "BEFORE SHUTTER", Toast.LENGTH_LONG).show(); 
    return false; 
} 
} 

能有人請幫助,告訴我什麼,我做錯了什麼?

這裏是logcat的(其中出現崩潰的部分):

03-08 12:11:48.335: D/AndroidRuntime(1167): Shutting down VM 
03-08 12:11:48.335: W/dalvikvm(1167): threadid=1: thread exiting with uncaught exception (group=0x40015578) 
03-08 12:11:48.343: E/AndroidRuntime(1167): FATAL EXCEPTION: main 
03-08 12:11:48.343: E/AndroidRuntime(1167): java.lang.NullPointerException 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at com.marakana.Preview.onTouch(Preview.java:80) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at  android.view.View.dispatchTouchEvent(View.java:3934) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:903) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:869) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1733) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1151) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.app.Activity.dispatchTouchEvent(Activity.java:2096) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1717) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2215) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1886) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.os.Looper.loop(Looper.java:123) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at android.app.ActivityThread.main(ActivityThread.java:3687) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at java.lang.reflect.Method.invoke(Method.java:507) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
03-08 12:11:48.343: E/AndroidRuntime(1167):  at dalvik.system.NativeStart.main(Native Method) 
03-08 12:11:48.378: D/dalvikvm(1167): GC_FOR_MALLOC freed 943K, 59% free 2633K/6407K, external 1596K/2108K, paused 15ms 
03-08 12:11:48.531: D/dalvikvm(1167): GC_CONCURRENT freed 21K, 52% free 3084K/6407K, external 1596K/2108K, paused 2ms+26ms 
03-08 12:11:56.109: I/Process(1167): Sending signal. PID: 1167 SIG: 9 

感謝

+1

請發送logcat詳細信息 – Nishant 2012-03-07 09:53:12

+0

您應該在代碼中查找錯誤的第一件事是看看logcat。 – Egor 2012-03-07 09:55:53

+0

Thaks迴應!我已將LogCat附加到原始文章 – Eyal 2012-03-07 10:22:10

回答

2

你有一個問題與上下文

Toast.makeText(findViewById(R.id.preview).getContext(), "BEFORE SHUTTER", Toast.LENGTH_LONG).show(); 

你不能獲取上下文這種方式。在你的構造函數傳遞上下文:

Preview(Context context) { 

我想創建上下文的私有實例

private Context ctx; 

,然後在構造函數中添加

this.ctx = context; 

,然後更改敬酒消息

Toast.makeText(ctx, "BEFORE SHUTTER", Toast.LENGTH_LONG).show(); 

這也會讓你在班上大多數其他地方的語境,因此使生活更容易一些。

+0

太棒了!非常感謝你...現在它工作:) – Eyal 2012-03-07 10:34:18

+1

真棒!您是否可以將其勾選爲正確的,以便其他用戶知道這是所選解決方案。 – 2012-03-07 10:37:24

+0

打勾! :) 做得好 – Eyal 2012-03-07 14:26:48

相關問題