繁体   English   中英

使用相同按钮停止Android MediaPlayer的方法?

[英]Method to stop Android MediaPlayer using the same button?

我想使用与启动Android MediaPlayer相同的按钮来停止其应用中的Android MediaPlayer。 从下面的源中可以看到,我在activity_main.xml中声明了按钮的onClick函数。 单击时,按钮的值从三角形变为正方形,如果再次单击它,则它又变回原来的位置,因此没有问题。 tick(); 功能被配置为根据按下的按钮版本来获取字符串“ start”或字符串“ stop”。

也是玩家非常 laggy。 它应该每秒播放一次喀嗒声(用于测试它是否还能正常工作),但是它非常缓慢。

这是我的MainActivity

package net.k40s.metronome;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.PowerManager;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.NumberPicker;
import android.widget.Toast;
import android.os.Handler;

import java.util.Timer;
import java.util.TimerTask;


public class MainActivity extends Activity {
    NumberPicker inputBPM;
    ImageView outputFlash;
    Button buttonPlay;
    protected PowerManager.WakeLock mWakeLock;
    final Handler metronomeHandler = new Handler();
    MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
        inputBPM = (NumberPicker) findViewById(R.id.inputBPM);
        outputFlash = (ImageView) findViewById(R.id.imageClick);
        buttonPlay = (Button) findViewById(R.id.buttonPlay);
        inputBPM.setMinValue(20);
        inputBPM.setMaxValue(150);
        inputBPM.setValue(120);
        inputBPM.setWrapSelectorWheel(true);
        SharedPreferences sp0 = PreferenceManager.getDefaultSharedPreferences(this);
        Boolean pref_display = sp0.getBoolean("pref_display", false);
        if (pref_display) {
            final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Metronome Active");
            this.mWakeLock.acquire();
        }
    }

    @Override
    public void onDestroy() {
        SharedPreferences sp0 = PreferenceManager.getDefaultSharedPreferences(this);
        Boolean pref_display = sp0.getBoolean("pref_display", false);
        if (pref_display) {
            this.mWakeLock.release();
        }
        super.onDestroy();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            Intent startActivity = new Intent(this, SettingsActivity.class);
            startActivity(startActivity);
            return true;
        }
        if (id == R.id.action_mail){
            sendMailToMe();
        }
        return super.onOptionsItemSelected(item);
    }

    public static class SettingsFragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.preferences);
        }
    }

    public static class SettingsActivity extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Display the fragment as the main content.
            getFragmentManager().beginTransaction()
                    .replace(android.R.id.content, new SettingsFragment())
                    .commit();
        }
    }

    private void tick(String what) {
        if (what.equals("start")) {
            metronomeHandler.post(metronomeRunnable);
        }
        if (what.equals("stop")){
            if(mp.isPlaying())
            {
                // TODO stop media playback
            }
        }
    }

    final Runnable metronomeRunnable = new Runnable() {
        public void run(String what) {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.click);
            mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    // TODO Auto-generated method stub
                    mp.release();
                }

            });
            mp.start();
        }
    };

    public void playBeat(final View v) {
        String activeText = (String) buttonPlay.getText();
        if (activeText.equals(getResources().getString(R.string.value_button_play))) {
            buttonPlay.setText(R.string.value_button_stop);
            inputBPM.setValue(121);
            int bpm = inputBPM.getValue();
            SharedPreferences sp1 = PreferenceManager.getDefaultSharedPreferences(this);
            String pref_measure = sp1.getString("pref_measure", "");
            if (pref_measure.equals("4")) {
                Timer myTimer = new Timer();
                myTimer.schedule(new TimerTask() {
                    @Override
                    public void run() {tick("start");}
                }, 0, 1000);
            }
            if (pref_measure.equals("3")) {
                /*
                    Dreivierteltakt start
                 */
            }
            if (pref_measure.equals("2")) {
                /*
                    Zweivierteltakt start
                 */
            }
            if (pref_measure.equals("6")) {
                /*
                    Sechsachteltakt start
                 */
            }
        }
        else if (activeText.equals(getResources().getString(R.string.value_button_stop))) {
            buttonPlay.setText(R.string.value_button_play);
            tick("stop");
        }


    }

    public void sendMailToMe(){
        Intent i = new Intent(Intent.ACTION_SEND);
        i.setType("message/rfc822");
        i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"lukas@k40s.net"});
        i.putExtra(Intent.EXTRA_SUBJECT, "I want to say hello.");
        i.putExtra(Intent.EXTRA_TEXT   , "Hey,");
        try {
            startActivity(Intent.createChooser(i, getResources().getString(R.string.choose_mail)));
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(MainActivity.this, getResources().getString(R.string.no_clients), Toast.LENGTH_SHORT).show();
        }
    }
}

这是我的activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:soundEffectsEnabled="true"
    tools:context=".MainActivity">

    <NumberPicker
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/inputBPM"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/value_button_play"
        android:id="@+id/buttonPlay"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="playBeat" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/bpm"
        android:id="@+id/textView"
        android:layout_above="@+id/inputBPM"
        android:layout_centerHorizontal="true" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageClick"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/flash0" />
</RelativeLayout>

您可以在GitHub上找到整个代码

谢谢你的帮助。 很抱歉,如果我真的愚蠢的和被忽视的东西真的很明显。

因此,请尝试以下代码,基本上,您需要将计时器设为字段成员,然后在他们想要停止时将其取消,然后在他们单击播放时将其重新初始化。 我测试了它,对我有用。 (省略了不相关的代码)

MediaPlayer mp;
Timer myTimer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
    inputBPM = (NumberPicker) findViewById(R.id.inputBPM);
    outputFlash = (ImageView) findViewById(R.id.imageClick);
    buttonPlay = (Button) findViewById(R.id.buttonPlay);
    inputBPM.setMinValue(20);
    inputBPM.setMaxValue(150);
    inputBPM.setValue(120);
    inputBPM.setWrapSelectorWheel(true);

    mp = MediaPlayer.create(getApplicationContext(), R.raw.click);

    SharedPreferences sp0 = PreferenceManager.getDefaultSharedPreferences(this);
    Boolean pref_display = sp0.getBoolean("pref_display", false);
    if (pref_display) {
        final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        this.mWakeLock = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Metronome Active");
        this.mWakeLock.acquire();
    }
}

@Override
public void onDestroy() {
    SharedPreferences sp0 = PreferenceManager.getDefaultSharedPreferences(this);
    Boolean pref_display = sp0.getBoolean("pref_display", false);
    if (pref_display) {
        this.mWakeLock.release();
    }

    if (mp != null) {
        mp.release();
    }

    super.onDestroy();
}

private void tick(String what) {
    if (what.equals("start")) {
        mp.start();
    }
    else if (what.equals("stop")) {
        mp.pause();
    }
}

public void playBeat(final View v) {
    String activeText = (String) buttonPlay.getText();
    if (activeText.equals(getResources().getString(R.string.value_button_play))) {
        buttonPlay.setText(R.string.value_button_stop);
        inputBPM.setValue(121);
        int bpm = inputBPM.getValue();

        myTimer = new Timer();

        SharedPreferences sp1 = PreferenceManager.getDefaultSharedPreferences(this);
        String pref_measure = sp1.getString("pref_measure", "");
        if (pref_measure.equals("4")) {
            myTimer.schedule(new TimerTask() {
                @Override
                public void run() {tick("start");}
            }, 0, 1000);
        }
    }
    else if (activeText.equals(getResources().getString(R.string.value_button_stop))) {
        buttonPlay.setText(R.string.value_button_play);
        myTimer.cancel();
        myTimer.purge();
        myTimer = null;
        tick("stop");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM