You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio Java音频计时器实现与下拉选项跳转Activity问题

一、添加音频时长显示控件(已播放/剩余时长)

1. 在布局文件(activity_main2.xml)中添加时长显示TextView

添加两个TextView分别显示已播放时长和总时长(或剩余时长):

<TextView
    android:id="@+id/tv_current_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="00:00"/>
<TextView
    android:id="@+id/tv_total_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="00:00"/>
<!-- 可选:添加剩余时长TextView -->
<TextView
    android:id="@+id/tv_remaining_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="-00:00"/>

2. 编写时间格式化工具方法

在播放Activity中添加毫秒转mm:ss格式的方法:

private String formatTime(long milliseconds) {
    int minutes = (int) (milliseconds / 1000) / 60;
    int seconds = (int) (milliseconds / 1000) % 60;
    return String.format("%02d:%02d", minutes, seconds);
}

3. 关联音频与时长控件,实时更新

在Activity中声明TextView实例,并在TimerTask中同步更新(注意必须在UI线程操作控件):

// 新增TextView声明
private TextView tvCurrentTime;
private TextView tvTotalTime;
private TextView tvRemainingTime; // 如需显示剩余时长

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    // 初始化TextView
    tvCurrentTime = findViewById(R.id.tv_current_time);
    tvTotalTime = findViewById(R.id.tv_total_time);
    tvRemainingTime = findViewById(R.id.tv_remaining_time);
    
    mediaPlayer = MediaPlayer.create(this, R.raw.mixkit);
    // 初始化总时长显示
    String totalTime = formatTime(mediaPlayer.getDuration());
    tvTotalTime.setText(totalTime);
    
    // 原有SeekBar初始化代码...
    
    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            final int currentPos = mediaPlayer.getCurrentPosition();
            // 更新SeekBar
            seekbar.setProgress(currentPos);
            // 更新时长显示,必须在UI线程执行
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tvCurrentTime.setText(formatTime(currentPos));
                    // 计算并显示剩余时长
                    long remaining = mediaPlayer.getDuration() - currentPos;
                    tvRemainingTime.setText("-" + formatTime(remaining));
                }
            });
        }
    }, 0, 500);
    
    // 原有SeekBar监听代码...
}
二、实现Spinner选项对应音频播放/页面跳转

1. 定义选项与目标的映射关系

假设strings.xml中的time数组为:

<string-array name="time">
    <item>5分钟</item>
    <item>10分钟</item>
    <item>15分钟</item>
</string-array>

在Spinner所在Activity中定义对应资源或Activity类:

// 对应5、10、15分钟的音频资源ID
private int[] audioResIds = {R.raw.audio5, R.raw.audio10, R.raw.audio15};
// 或者对应跳转的Activity类
private Class<?>[] targetActivities = {Activity5.class, Activity10.class, Activity15.class};

2. 在按钮点击时处理选中项

修改startButton的点击事件,根据Spinner选中位置执行对应逻辑:

startButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int selectedPos = spinner.getSelectedItemPosition();
        // 方案1:跳转至播放Activity并传递音频ID
        Intent intent = new Intent(Main3Activity.this, Main2Activity.class);
        intent.putExtra("AUDIO_RES_ID", audioResIds[selectedPos]);
        startActivity(intent);
        
        // 方案2:直接跳转至对应时长的Activity
        // Intent intent = new Intent(Main3Activity.this, targetActivities[selectedPos]);
        // startActivity(intent);
    }
});

3. 在播放Activity中接收音频ID(方案1需执行)

修改播放Activity的onCreate方法,根据传递的ID初始化MediaPlayer:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);
    
    // 获取传递的音频ID,默认使用原音频
    int audioResId = getIntent().getIntExtra("AUDIO_RES_ID", R.raw.mixkit);
    mediaPlayer = MediaPlayer.create(this, audioResId);
    
    // 后续SeekBar、时长显示初始化代码...
}

内容的提问来源于stack exchange,提问作者chiwi.chiwi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:22:50