当前位置: 首页 > 知识库问答 >
问题:

再次单击同一ListView时,如何暂停和恢复音频?

詹杰
2023-03-14

我有一个ListView活动,显示我原始文件中的歌曲列表,当我单击其中一个ListView时,它会相应地播放歌曲,但如果我再次单击,它只会再次播放同一首歌曲。如何在同一曲目上暂停并再次恢复?以下是我迄今为止所做的代码。

<代码>主要活动。java

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

private ListView musicListView;
private Trackmodel[] tracklist;
private TrackAdapter adapter;
private MediaPlayer mediaPlayer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    musicListView = findViewById(R.id.musicListView);
    loadTracks();

    musicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            loadTracks();
            Trackmodel track = tracklist[i];

            if (mediaPlayer != null) {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    track.setPlaying(false);
                }
            }

            try {
                mediaPlayer = MediaPlayer.create(MainActivity.this, track.getId());
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.stop();
                    mediaPlayer.reset();
                    track.setPlaying(false);
                } else {
                    mediaPlayer.start();
                    track.setPlaying(true);
                }

            } catch (Exception e) {
                Log.e("Exception", e.getMessage());
            }
        }
    });
}

public void loadTracks() {
    tracklist = new Trackmodel[]{
            new Trackmodel(R.raw.decode, "Paramore - Decode", false),
            new Trackmodel(R.raw.thats_what_you_get, "Paramore - That's What You Get", false),
            new Trackmodel(R.raw.starstrukk, "30H!3 - Starstrukk", false),
            new Trackmodel(R.raw.we_are_young, "30H!3 - We Are Young", false)
    };
    adapter = new TrackAdapter(MainActivity.this, tracklist);
    musicListView.setAdapter(adapter);
    adapter.notifyDataSetChanged();
}

@Override
protected void onDestroy() {
    super.onDestroy();

    if (mediaPlayer != null) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.reset();
        }
    }
}}

<代码>轨迹模型。java

package com.example.myapplication;

public class Trackmodel {
private int id;
private String name;
private boolean isPlaying;

public Trackmodel(int id, String name, boolean isPlaying) {
    this.id = id;
    this.name = name;
    this.isPlaying = isPlaying;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public boolean isPlaying() {
    return isPlaying;
}

public void setPlaying(boolean playing) { isPlaying = playing; }
}

轨迹适配器。java

package com.example.myapplication;

import android.content.Context;
import android.view.ContentInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class TrackAdapter extends BaseAdapter {

private Context context;
private Trackmodel[] tracks;

TrackAdapter(Context context, Trackmodel[] tracks) {
    this.context = context;
    this.tracks = tracks;
}

@Override
public int getCount() {
    return tracks.length;
}

@Override
public Object getItem(int i) {
    return tracks[i];
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    Trackmodel track = (Trackmodel) getItem(i);
    ViewHolder holder;

    if (view == null) {
        view = LayoutInflater.from(context).inflate(R.layout.track_item, viewGroup, false);
        holder = new ViewHolder();
        holder.trackImage = view.findViewById(R.id.track_image);
        holder.titleText = view.findViewById(R.id.track_title);
        view.setTag(holder);
    } else {
        holder = (ViewHolder) view.getTag();
    }
    holder.titleText.setText(track.getName());

    if (track.isPlaying()) {
        holder.trackImage.setImageResource(R.drawable.ic_baseline_pause_circle);
    } else {
        holder.trackImage.setImageResource(R.drawable.ic_baseline_play_circle);
    }
    return view;
}

static class ViewHolder {
    ImageView trackImage;
    TextView titleText;
}
}

track_item.xml代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/sound_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="16sp"
android:paddingTop="10dp"
android:paddingRight="16sp">

<ImageView
    android:id="@+id/track_image"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_centerVertical="true"
    android:padding="5dp"
    app:tint="@android:color/black" />

<TextView
    android:id="@+id/track_title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginLeft="56dp"
    android:textAppearance="@style/TextAppearance.AppCompat.Body2" />
</RelativeLayout>

<代码>activity\u main。xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<ListView
    android:id="@+id/musicListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

共有1个答案

汪修诚
2023-03-14

在项目单击中,您可以停止MediaPlayer,但之后,每次都会创建一个新实例。您有一个if check,它检查MediaPlayer是否正在播放并停止播放。然后,创建一个新的MediaPlayer,并再次执行相同的检查。那么,当您第一次单击时发生了什么?首先,如果由于您的mediaplayer为空而未执行检查,则会创建一个新的mediaplayer并开始播放。第二次单击后,由于MediaPlayer不为null且显示为true,因此第一次执行if检查。您可以停止它,创建一个新的MediaPlayer实例,然后再次播放。这就是为什么在单击所有下一次后,您只需重播歌曲。因为单击可以停止歌曲,创建一个新实例并播放它。

所以你需要的是,我假设你的列表中有不同的曲目,当你点击另一个曲目时,你需要停止之前的曲目并开始新的曲目。但如果你点击同一首曲目,你会想暂停它。

在这种情况下,您需要当前正在播放/播放的曲目ID。下次单击后,如果曲目ID与正在播放的曲目相同,您只需暂停它。如果是另一首曲目,请停止它并开始新的曲目。这是下面的代码,您可以进行相应的更改并将其应用到您的代码中。

int currentTrackId = -1;
    musicListView.setOnItemClickListener(
            (AdapterView.OnItemClickListener) (adapterView, view, i, l) -> {
        loadTracks();
        Trackmodel track = tracklist[i];
        if (currentTrackId != -1 && track.getId() == currentTrackId) {
            // That was the same song, just pause it.
            if (mediaPlayer != null) {
                if (mediaPlayer.isPlaying()) {
                    mediaPlayer.pause();
                    track.setPlaying(false);
                } else {
                    mediaPlayer.start();
                    track.setPlaying(true);
                }
            }
        } else {
            // That's another song, stop the previous one and start the new one
            currentTrackId = track.getId();
            try {
                mediaPlayer = MediaPlayer.create(MainActivity.this, track.getId());
                mediaPlayer.start();
                track.setPlaying(true);

            } catch (Exception e) {
                Log.e("Exception", e.getMessage());
            }  
        }
    });
 类似资料:
  • 问题内容: 我在viewDidAppear中有一个图像,并用以下代码对其进行了动画处理: 我想在点击时暂停动画,如果再次点击它则继续播放动画。 问题答案: 暂停和恢复动画的2个功能,我从这里开始转换为Swift。 我有一个按钮可以暂停或恢复在中初始化的动画:

  • 我相信答案是否定的,但是Twilio提供暂停/恢复录音的能力吗?用例是记录一个呼叫,但在收集敏感信息时暂停记录。从REST文档来看,它似乎不是一个受支持的功能。我想有人可能已经为这个要求找到了一些选择。

  • 问题内容: 我有一个基本的Swing UI,带有一个标记为“播放”的按钮。按下按钮后,标签变为“暂停”。现在,当按下按钮时,它变为“继续”。 在“播放”中,我将实例化并执行一个SwingWorker。我想要的是能够暂停该线程(不要取消该线程),并根据上述按钮按下来恢复它。但是,我不想在doInBackground()中求助于Thread.sleep()。这似乎有点骇人听闻。有什么方法可以阻止运行d

  • 我要做的是暂停< code>KafkaConsumer,如果在使用消息的过程中出现错误。 这是我写的 然后我写了一个REST服务来恢复消费者 现在,我有两个问题。第一个问题:当我打电话给消费者时。来自<code>@KafkaListener</code>注释方法的pause()会发生什么?消费者立即暂停,或者我可以接收到同一主题分区的其他偏移量上的其他消息。例如,我有偏移量为3的“message1

  • 问题内容: 我正在开发游戏,我想创建一个暂停菜单。这是我的代码: 但 仍在运行… 我想在玩家单击暂停菜单时暂停计时器,并在玩家返回游戏时继续运行计时器,但是我如何暂停?请帮帮我。 问题答案: 您需要使其无效并重新创建。然后,如果您使用相同的按钮暂停和恢复计时器,则可以使用bool来跟踪状态:

  • 我正在构建具有恢复/暂停功能的m4a录制的Android应用程序。可能吗?如果是,请告诉我解决方案。 谢谢