masmic
masmic

Reputation: 3574

Stop mediaplayer when touch screen

I'm developing an app which consists on a MainActivity which implements ViewPager and 3 fragments. I define all logic methods inside the MainActivity and the fragments just implement UI refered methods.

So in MainActivity I have a method where something hapens and it starts the MediaPlayer this way:

mp = MediaPlayer.create(MainActivity.this, R.raw.alarm);
try {
    mp.setLooping(true);
} catch (IllegalStateException e) {
    e.printStackTrace();
}
mp.start();

This gets the sound played into a loop. Now, I need to be able to stop it just touching the screen, for what I've implemented the onTouchEvent() method this way:

@Override
public boolean onTouchEvent (MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        /*If sound is playing, stops*/
        if (mp.isPlaying()) {
            mp.stop();
        }
        return true;
    }
    return super.onTouchEvent(event);
}

And here is the problem. I'm not able to make the sound stop, so I suppose that the method above isn't working. A SO member has sugested me to use dispatchTouchEvent() instead of onTouchEvent(), but doing this the app force closes without throwing any error message in the LogCat.

@Override
public boolean dispatchTouchEvent (MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        /*If sound is playing, stops*/
        if (mp.isPlaying()) {
            mp.stop();
        }
        return true;
    }
    return super.dispatchTouchEvent(event);
}

So I don't know what is wrong with that method. Or maybe the problem could be that this must be implemented in each fragment instead of in the MainAcitivity?

Update

I was having an issue with eclipse which dind't show the logCat info, but now is solved and this is what it throws:

09-01 16:43:15.591: E/InputEventReceiver(30873): Exception dispatching input event.
09-01 16:43:15.591: E/MessageQueue-JNI(30873): Exception in MessageQueue callback: handleReceiveCallback
09-01 16:43:15.591: E/MessageQueue-JNI(30873): java.lang.NullPointerException
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at com.itest.MainActivity.dispatchTouchEvent(MainActivity.java:818)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:260)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2228)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.View.dispatchPointerEvent(View.java:8315)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4596)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4464)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4076)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4045)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4156)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4053)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4213)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4076)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4045)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4053)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6403)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6307)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6278)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6243)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6483)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.os.MessageQueue.nativePollOnce(Native Method)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.os.MessageQueue.next(MessageQueue.java:138)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.os.Looper.loop(Looper.java:123)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at android.app.ActivityThread.main(ActivityThread.java:5356)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at java.lang.reflect.Method.invokeNative(Native Method)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at java.lang.reflect.Method.invoke(Method.java:515)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
09-01 16:43:15.591: E/MessageQueue-JNI(30873):  at dalvik.system.NativeStart.main(Native Method)
09-01 16:43:15.591: D/AndroidRuntime(30873): Shutting down VM
09-01 16:43:15.601: W/dalvikvm(30873): threadid=1: thread exiting with uncaught exception (group=0x4180bda0)
09-01 16:43:15.601: E/AndroidRuntime(30873): FATAL EXCEPTION: main
09-01 16:43:15.601: E/AndroidRuntime(30873): Process: com.itest, PID: 30873
09-01 16:43:15.601: E/AndroidRuntime(30873): java.lang.NullPointerException
09-01 16:43:15.601: E/AndroidRuntime(30873):    at com.itest.MainActivity.dispatchTouchEvent(MainActivity.java:818)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.dispatchTouchEvent(ActionBarActivityDelegateICS.java:260)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2228)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.View.dispatchPointerEvent(View.java:8315)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4596)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4464)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4076)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4045)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4156)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4053)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4213)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4076)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4045)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4053)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4022)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6403)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6307)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6278)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6243)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6483)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.os.MessageQueue.nativePollOnce(Native Method)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.os.MessageQueue.next(MessageQueue.java:138)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.os.Looper.loop(Looper.java:123)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at android.app.ActivityThread.main(ActivityThread.java:5356)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at java.lang.reflect.Method.invokeNative(Native Method)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at java.lang.reflect.Method.invoke(Method.java:515)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
09-01 16:43:15.601: E/AndroidRuntime(30873):    at dalvik.system.NativeStart.main(Native Method)

Where line 818 in MainActivity refers to onTouchEvent() or dispatchTouchEvent() method, exactly to this line:

if (mp.isPlaying()) {

Upvotes: 0

Views: 854

Answers (1)

MysticMagicϡ
MysticMagicϡ

Reputation: 28823

You are getting NullPointerException on line

if (mp.isPlaying()) {

mp must be null when you initially touch screen.

Add this:

if (mp != null && mp.isPlaying()) {

Hope this helps.

Upvotes: 1

Related Questions