OnLongClickListener — воспроизвести () музыку — вернуть стоп ()

я пытаюсь реализовать OnLongClickListener на MediaPlayer, но я не могу понять, как я могу управлять кнопкой Release, чтобы остановить музыку.

Это код, который у меня есть сейчас.

@Override
public boolean onLongClick(View v, MotionEvent event) {
     if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (v.getId() == R.id.play) {
                mp1.setLooping(true);
                mp1.start();             }
                                                         } 
     else if (event.getAction() == MotionEvent.ACTION_UP) {
            if (v.getId() == R.id.play) {
                if (mp1 != null) {
                    mp1.setLooping(false);
                    mp1.pause(); 
                    mp1 = null;
                }

}    }

        return false; }

но это дает мне ошибку Метод onLongClick(View, MotionEvent) типа MainActivity должен переопределить или реализовать метод супертипа мне удалось воспроизвести музыку при длительном нажатии, но при выпуске false или true она не остановилась музыка... как я могу управлять ею...


person George Lungu    schedule 03.03.2014    source источник
comment
Ошибка означает, что вы пытаетесь переопределить метод, который не завершается (или не может быть переопределен) в суперклассе. Activity не имеет onLongClick.   -  person Blackbelt    schedule 03.03.2014
comment
Я не думаю, что вы можете реализовать onLongClicklistener на MediaPlayer. Вы можете реализовать его в каком-то представлении. Реализуйте его для некоторого представления, например кнопки и т. Д.   -  person vs.thaakur    schedule 03.03.2014
comment
Вы пытаетесь сделать паузу/возобновить или остановить/воспроизвести?   -  person Adnan    schedule 03.03.2014


Ответы (2)


я заставил его работать с методом onTouch, он работает один раз, но при втором щелчке я получаю исключение nullpointerexception

    public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        if (v.getId() == R.id.play) {
            mp1.setLooping(true);
            mp1.start(); 
        }
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        if (v.getId() == R.id.play) {
            if (mp1 != null) {
                mp1.setLooping(false);
                mp1.pause(); 
                mp1 = null;
            }
        }
    }
    return false;
} }

вот ошибка

НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: основное java.lang.NullPointerException в app.technozed.dogwhistle.MainActivity.onTouch(MainActivity.java:68) в android.view.View.dispatchTouchEvent(View.java:3762) в android.view.ViewGroup.dispatchTouchEvent( ViewGroup.java:863) в android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) в android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) в com.android.internal.policy.impl.PhoneWindow$DecorView .superDispatchTouchEvent(PhoneWindow.java:1731) в com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1120) в android.app.Activity.dispatchTouchEvent(Activity.java:2086) в com.android. internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1715) в android.view.ViewRoot.handleMessage(ViewRoot.java:1787) в android.os.Handler.dispatchMessage(Handler.java:99) в android .os.Looper.loop(Looper.java:123) в android.app.ActivityThread.main(ActivityThread.java:4633) в java.lang.r eflect.Method.invokeNative(собственный метод) на java.lang.reflect.Method.invoke(Method.java:521) на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) на com. android.internal.os.ZygoteInit.main(ZygoteInit.java:616) в dalvik.system.NativeStart.main(собственный метод)

я думаю, это потому, что в паузе я установил mp1=null; не так ли?

да, я только что удалил mp1=null; и это работает нормально.

person George Lungu    schedule 03.03.2014
comment
Да, это потому, что mp1 равен нулю. Вы не инициализируете его после установки значения null в ACTION_UP. - person Adnan; 03.03.2014
comment
Вы пытаетесь сделать паузу/возобновить или остановить/воспроизвести? - person Adnan; 03.03.2014

Ваш код остановит ваш плеер сразу после запуска, потому что оба действия (Action Down и Action Up) запускаются соответственно при касании и отпускании.

Попробуй это:

@Override
public boolean onLongClick(View v, MotionEvent event) {
     if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (v.getId() == R.id.play) {
               if(mp1!=null && mp1.isPlaying())
                mp1.setLooping(false);
                    mp1.pause(); 
                    mp1 = null;

              }else{
                // initialize mp1 ... Initialize your player here
                //
                mp1.setLooping(true);
                mp1.start(); 

           }
       }
      return false;   
} 
person Adnan    schedule 03.03.2014
comment
он даже не играет. - person George Lungu; 03.03.2014
comment
Вы не вставили свой код, который инициализирует ваш плеер, поэтому я добавляю комментарий к этому месту. Инициализируйте свой плеер здесь: // инициализируйте mp1 ... - person Adnan; 03.03.2014
comment
я инициализировал плеер в onCreate, после этого у меня есть 5 кнопок, которые загружают 5 разных песен, и после всего этого у меня есть 1 кнопка воспроизведения с onLongClickListener. - person George Lungu; 03.03.2014
comment
Будет более полезно, если вы можете разместить свой полный код. - person Adnan; 03.03.2014