[Lesson8] MediaPlayer

activity_main:
在LinearLayout中加入播放/暂停、停止、循环的按钮

<?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">

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnPlayPause"
        android:src="@android:drawable/ic_media_play"/>
    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnStop"
        android:src="@android:drawable/ic_menu_close_clear_cancel"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnloop"
        android:text="Repeat"/>
</LinearLayout>

MainActivity:
实作MediaPlayer,并搭配生命周期完成三个按钮的功能

public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {

    private ImageButton btnPlayPause,btnStop;
    private MediaPlayer mediaPlayer = null;
    private boolean isInit = true;
    private Button repeat;

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

    private void findViews(){
        btnPlayPause = findViewById(R.id.btnPlayPause);
        btnStop = findViewById(R.id.btnStop);
        repeat = findViewById(R.id.btnloop);

        btnPlayPause.setOnClickListener(PlayPauseListener);
        btnStop.setOnClickListener(StopListener);

        repeat.setOnClickListener(v->{
            mediaPlayer.setLooping(true); //Repeat,False取消
        });
    }

    protected void onResume(){
        super.onResume();
        mediaPlayer = new MediaPlayer();
        Uri uri = Uri.parse("android.resource://"+ getPackageName() + "/" + R.raw.chain);
        try{
            mediaPlayer.setDataSource(this,uri);
        }catch(Exception e){
            Toast.makeText(getApplicationContext(),"档案读取错误",Toast.LENGTH_SHORT).show();
        }
        mediaPlayer.setOnPreparedListener(this);
        mediaPlayer.setOnErrorListener(this);
        mediaPlayer.setOnCompletionListener(this);
    }

    protected void onStop(){
        super.onStop();
        mediaPlayer.release();
        mediaPlayer = null;
    }

    private View.OnClickListener PlayPauseListener = v -> {
        if (mediaPlayer.isPlaying()) {
            btnPlayPause.setImageResource(android.R.drawable.ic_media_play);
            mediaPlayer.pause();
        } else {
            btnPlayPause.setImageResource(android.R.drawable.ic_media_pause);
            if (isInit) {
                mediaPlayer.prepareAsync();
                isInit = false;
            } else {
                mediaPlayer.start();
            }
        }
    };

    private View.OnClickListener StopListener = v->{
        mediaPlayer.stop();
        isInit = true;
        btnPlayPause.setImageResource(android.R.drawable.ic_media_play);
    };

    @Override
    public void onCompletion(MediaPlayer mp) {
        btnPlayPause.setImageResource(android.R.drawable.ic_media_play);
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        mp.release();
        mp = null;
        Toast.makeText(getApplicationContext(),"Error!!",Toast.LENGTH_SHORT).show();
        return true;
    }

    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.seekTo(0);
        mp.start();
    }
}

谢谢大家愿意花时间阅读,小弟弟我在此鞠躬/images/emoticon/emoticon41.gif


<<:  浏览器物件模型 BOM

>>:  Day 9:1046. Last Stone Weight

【DAY 22】为什麽每天可以有这麽多问题? Microsoft Power Virtual Agents 智慧虚拟助理帮帮我~

哈罗大家好~ 昨天介绍了 Microsoft Power Virtual Agents 智慧虚拟助理...

[NestJS 带你飞!] DAY19 - Module Reference

前面有提过,注入 Provider 的方式只需要在 constructor 设计参数并附上对应的型别...

[Tableau Public] day 28:制作台湾姓氏分布-数据仪表板

今天我们来把前面做的五张工作表合成一张仪表板吧! 首先新增一张仪表板,名称为「107年6月_台湾各姓...

历行性邮件_范本建立

历行性的邮件报告,主旨和内容,一样的都要再打一次,要找之前那封,不好找.很花时间. 想到一个方法 历...

Day 27 利用transformer自己实作一个翻译程序(九) Point wise feed forward network

Point wise feed forward network 在两层全连阶层中加入一个relu的激...