android - 当我触摸屏幕时,我的应用程序崩溃 - OnTouch 方法失败

标签 android crash touch

我创建了一个可以进行相机预览的应用程序。我正在尝试创建一个触摸事件,这样当我触摸预览时,就会发生一些事情(比如说,会出现一个 toast )。 问题是,当我触摸预览时,2 秒后应用程序崩溃。 我有两门课:

相机 Activity :

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

谢谢

最佳答案

您对上下文有疑问

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

您无法通过这种方式获取上下文。在您的构造函数中,您传递上下文:

Preview(Context context) {

我将创建上下文的私有(private)实例

private Context ctx;

然后在构造函数中添加

this.ctx = context;

然后将 toast 消息更改为

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

这也将为您提供类里面大多数其他地方的背景信息,从而使生活变得更加轻松。

关于android - 当我触摸屏幕时,我的应用程序崩溃 - OnTouch 方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9599063/

相关文章:

java - android 4.0+版本读取文件的外部SD卡路径

Android BLE 连接成功后有一些延迟

android - 如何将可绘制的形状与图像一起使用?

用于触摸设备的 Javascript 拖放

屏幕上的 Android Touch 事件

android - 如何部署可以从我的应用程序加载的 android 插件

ios - 滑动以查看 UITableViewCells 崩溃时的操作

ios - 如何调试 iOS 应用程序默认优先级调度队列中的崩溃?

android - 在 CardBoard 和 Rajawali VR Android 中使用触摸事件移动相机

php - php继续在服务器上崩溃