Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 触摸屏时停止mediaplayer_Android_Touch_Media Player - Fatal编程技术网

Android 触摸屏时停止mediaplayer

Android 触摸屏时停止mediaplayer,android,touch,media-player,Android,Touch,Media Player,我正在开发一个应用程序,它包含一个MainActivity,它实现了ViewPager和3个片段。我在MainActivity中定义了所有逻辑方法,而片段只实现了UI引用的方法 因此,在MainActivity中,我有一个方法,其中出现了一些东西,它以这种方式启动MediaPlayer: mp = MediaPlayer.create(MainActivity.this, R.raw.alarm); try { mp.setLooping(true); } catch (IllegalS

我正在开发一个应用程序,它包含一个MainActivity,它实现了ViewPager和3个片段。我在MainActivity中定义了所有逻辑方法,而片段只实现了UI引用的方法

因此,在MainActivity中,我有一个方法,其中出现了一些东西,它以这种方式启动MediaPlayer:

mp = MediaPlayer.create(MainActivity.this, R.raw.alarm);
try {
    mp.setLooping(true);
} catch (IllegalStateException e) {
    e.printStackTrace();
}
mp.start();
@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);
}
这样可以将声音播放成一个循环。现在,我需要能够通过触摸屏幕来阻止它,因为我以这种方式实现了onTouchEvent()方法:

mp = MediaPlayer.create(MainActivity.this, R.raw.alarm);
try {
    mp.setLooping(true);
} catch (IllegalStateException e) {
    e.printStackTrace();
}
mp.start();
@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);
}
这就是问题所在。我无法使声音停止,因此我认为上述方法不起作用。SO成员建议我使用
dispatchTouchEvent()
而不是
onTouchEvent()
,但这样做,应用程序强制关闭时不会在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);
}
所以我不知道这个方法有什么问题。或者问题可能是这必须在每个片段中实现,而不是在MainActivity中实现

更新

我在eclipse中遇到了一个无法显示logCat信息的问题,但现在已经解决了,这就是它抛出的问题:

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)
其中,MainActivity中的第818行引用onTouchEvent()或dispatchTouchEvent()方法,正好是这一行:

if (mp.isPlaying()) {

您正在联机获取
NullPointerException

if (mp.isPlaying()) {
最初触摸屏幕时,
mp
必须为空

添加以下内容:

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

希望这有帮助。

什么是line MainActivity.java:818?它抛出NPE@Dhruti,问题更新见答案
mp
最初可能为空。设置一个条件来处理这个问题。现在,当使用dispatchTouchEvent()时,它不会强制关闭,但屏幕触摸不起作用。我需要能够选择一个编辑文本写入那里,不做任何事情时,触摸那里可能是你已经返回了真正的dispatchTouchEvent。仅当mp.isplay返回true时才返回true。类似于
if(mp!=null&&mp.isPlaying()){mp.stop();return true;}
@masmic@masmic有什么进展吗?是的,Dhruti,我刚刚尝试过,现在我可以触摸屏幕并与之交互,也可以停止触摸屏幕上的音频,所以效果很好。谢谢