Android 媒体播放器没有停止,当我点击一首歌曲时 link 它播放了多次

Android Media Player does not stopped, when I click on a song link it playing multiple times

当我单击 html 文件中的 html href link 时,即会播放歌曲。但我再次点击相同的 link 它开始播放歌曲而不停止之前的 activity。我无法通过单击 link.
两次来停止这首歌 请有人帮助我,当我一次又一次地点击歌曲 link 时,它会同时播放多次。我想停止这首歌并从头开始。

这是我的 MainActivity

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.SeekBar;

public class MainActivity extends Activity {
WebView webView;
Button btnstart;
SeekBar seekbar;
RelativeLayout frame;
    @SuppressLint({ "SetJavaScriptEnabled", "NewApi" })
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


            webView=(WebView)findViewById(R.id.webView1);
            webView.setWebViewClient(new MyWebViewClient(this));
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setBuiltInZoomControls(true);
            webView.getSettings().setDisplayZoomControls(false);
            webView.loadUrl("file:///android_asset/puretest.html");

            btnstart  = (Button) findViewById(R.id.button1);

            frame = (RelativeLayout) findViewById(R.id.rl02);
            frame.setVisibility(View.GONE);

            seekbar = (SeekBar)findViewById(R.id.SeekBarTestPlay);
    }

    @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) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

这是我的 MyWebViewClient class

import android.content.Context;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MyWebViewClient extends WebViewClient {

    Context cxt;

public MyWebViewClient(Context cxt) {
        // TODO Auto-generated constructor stub
    this.cxt = cxt;
    }

  @Override 
  public boolean shouldOverrideUrlLoading(WebView view, String url) { 

      if(url.contains("tune")){ 
        //view.loadUrl(url); 
          new AudioPlayer(cxt).stopPlaying();
        new playTunes(cxt).tune1(url);  
        return true;
      }

      if(url.contains("stop")){ 
            //view.loadUrl(url); 
              new AudioPlayer(cxt).stopPlaying();

            return true;
          }

      if(url.contains("song")){ 
            //view.loadUrl(url); 
            //new AudioPlayer(cxt).stopPlaying();
            new playTunes(cxt).song1(url);  
     }
    return true;

  }
}

这是我的 PlayTune Class

import android.content.Context;
import android.media.MediaPlayer;

public class playTunes {

    Context cxt;
    MediaPlayer player;
public playTunes(Context cxt) {
        // TODO Auto-generated constructor stub
    this.cxt = cxt;
    }

public void tune1(String url) {
        // TODO Auto-generated method stub
    new AudioPlayer(cxt).stopPlaying();
           int tuneUrl=R.raw.e0007;
           new AudioPlayer(cxt).player(tuneUrl);  


        }
public void song1(String url) {
    // TODO Auto-generated method stub
   new AudioPlayer(cxt).stopPlaying();
       int tuneUrl=R.raw.test; 
       new AudioPlayer(cxt).player(tuneUrl);  

    }

    }

这是我的音频播放器 class。虽然在 stopPlaying 方法中的 Toast 工作,但是在 if 语句中的 toast 不工作以及停止和重置命令。

import java.io.IOException;
import android.content.Context;
import android.media.MediaPlayer;
import android.widget.Toast;

public class AudioPlayer {
    MediaPlayer mplayer;
    Context cxt;


    public AudioPlayer(Context cxt) {
        // TODO Auto-generated constructor stub
        this.cxt = cxt;
    }

    public void player(int tuneUrl){
        stopPlaying();
          mplayer = MediaPlayer.create(cxt, tuneUrl);
          try {

            mplayer.prepare();

        } catch (IllegalStateException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

          mplayer.start();

    }

    public void stopPlaying() {
        // TODO Auto-generated method stub
        Toast.makeText(cxt, "working stop playing", Toast.LENGTH_SHORT).show();

        if (mplayer != null) {
                Toast.makeText(cxt, "it seems not working", Toast.LENGTH_LONG).show();
                mplayer.stop();
                mplayer.pause();
                mplayer.release();
                mplayer = null;
            }

    }
    }

这是我的 HTML - puretest.html

<html> 
<head>
SELECT TUNE
</head>

<br><br><body> 
<a href="tune">plays</a>

<a href="song"><br><br>Tune</a><form>
        <a href="stop"><input type="" style="color: Black; background-color: Green"></a>
    </form>

<form name="form1" method="post" action="">
  testong
    <a href="stop"><input type="submit" name="testing" id="testing" value="Submit" onClick="testing" ></a>
</form>
</body>

</html>

这是我的布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <WebView
        android:id="@+id/webView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/rl02"
        android:animateLayoutChanges="true"
        android:fitsSystemWindows="false"
        android:scrollbarAlwaysDrawVerticalTrack="false"
        android:scrollbars="none" />

    <RelativeLayout
        android:id="@+id/rl02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:background="#000000"
        android:gravity="center" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#000000"
            android:gravity="center"
            android:minHeight="30dp"
            android:onClick="onClick"
            android:singleLine="true"
            android:text="STOP"
            android:textAllCaps="true"
            android:textColor="#FFFFFF"
            android:textSize="12dp"
            android:textStyle="bold" />

       <SeekBar
           android:id="@+id/SeekBarTestPlay"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_toRightOf="@+id/button1"
           android:background="#000000"
           android:fadingEdge="horizontal"
           android:indeterminate="false"
           android:minHeight="10dp"
           android:paddingLeft="20dp"
           android:paddingRight="20dp"
           android:scrollbarStyle="outsideOverlay" />

</RelativeLayout>


</RelativeLayout>

您每次都在 PlayTune class 和 MyWebViewClient class 中创建新的 AudioPlayer 实例,并且每次都在 MyWebViewClient 中创建新的 PlayTune 实例。每次这样做都会创建一个新玩家。

对于 PlayTune,我会将 MediaPlayer player 更改为 AudioPlayer player。在构造函数中,我将删除 this.ctx=ctx; 并将其替换为 player = new AudioPlayer(ctx);。此外,在 Java 中,class 以大写字母开头,因此我会将 class 名称从 playTune 更改为 PlayTune。我还将更改您的方法:

public void tune1(String url) {
        // TODO Auto-generated method stub
        new AudioPlayer(cxt).stopPlaying();
        int tuneUrl=R.raw.e0007;
        new AudioPlayer(cxt).player(tuneUrl);  


}
public void song1(String url) {
        // TODO Auto-generated method stub
        new AudioPlayer(cxt).stopPlaying();
        int tuneUrl=R.raw.test; 
        new AudioPlayer(cxt).player(tuneUrl);  
}

public void tune1(String url) {
        // TODO Auto-generated method stub
        int tuneUrl=R.raw.e0007;

        player.stopPlaying();
        player.player(tuneUrl);  


}
public void song1(String url) {
        // TODO Auto-generated method stub
        int tuneUrl=R.raw.test;

        player.stopPlaying();
        player.player(tuneUrl);  
}
public void stop() {
        player.stopPlaying();
}

对于 AudioPlayer,在 stopPlaying() 方法内,删除 mp.pause(); 否则您将得到一个异常。

对于您的 MyWebViewClient class,您需要将其更改为:

public class MyWebViewClient extends WebViewClient {

    PlayTune player;

public MyWebViewClient(Context cxt) {
        // TODO Auto-generated constructor stub
    player = new PlayTune(ctx);
    }

  @Override 
  public boolean shouldOverrideUrlLoading(WebView view, String url) { 

      if (url.contains("tune")){ 
          //view.loadUrl(url); 
          player.tune1(url);  
          return true;
      }

      if (url.contains("stop")){ 
          //view.loadUrl(url); 
          player.stop();

          return true;
      }

      if (url.contains("song")){ 
          //view.loadUrl(url); 
          player.song1(url);  
     }
    return true;
  }
}

这应该可以解决您遇到的问题。