From f7b39c42a3676b0c355b5d4cf3d99a1fa600599c Mon Sep 17 00:00:00 2001 From: xufuji456 <839789740@qq.com> Date: Fri, 28 May 2021 08:50:34 +0800 Subject: [PATCH] add audio player component --- app/src/main/AndroidManifest.xml | 4 +- .../ffmpeg/activity/AudioHandleActivity.kt | 7 +- .../ffmpeg/activity/AudioPlayActivity.kt | 119 ++++++++++++++++++ app/src/main/res/drawable-xhdpi/ic_pause.png | Bin 0 -> 8775 bytes app/src/main/res/drawable-xhdpi/ic_play.png | Bin 0 -> 9457 bytes .../main/res/layout/activity_audio_play.xml | 73 +++++++++++ 6 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt create mode 100644 app/src/main/res/drawable-xhdpi/ic_pause.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_play.png create mode 100644 app/src/main/res/layout/activity_audio_play.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index eefed6c..a9278df 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -51,8 +51,10 @@ - + \ No newline at end of file diff --git a/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt b/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt index 51c88da..94d5cac 100644 --- a/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt +++ b/app/src/main/java/com/frank/ffmpeg/activity/AudioHandleActivity.kt @@ -1,6 +1,8 @@ package com.frank.ffmpeg.activity import android.annotation.SuppressLint +import android.content.Intent +import android.net.Uri import android.os.Environment import android.os.Handler import android.os.Message @@ -177,7 +179,10 @@ class AudioHandleActivity : BaseActivity() { } R.id.btn_play_audio//use AudioTrack to play audio -> { - Thread { AudioPlayer().play(srcFile) }.start() +// Thread { AudioPlayer().play(srcFile) }.start() + val audioIntent = Intent(this@AudioHandleActivity, AudioPlayActivity::class.java) + audioIntent.data = Uri.parse(srcFile) + startActivity(audioIntent) return } R.id.btn_play_opensl//use OpenSL ES to play audio diff --git a/app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt b/app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt new file mode 100644 index 0000000..199bc0b --- /dev/null +++ b/app/src/main/java/com/frank/ffmpeg/activity/AudioPlayActivity.kt @@ -0,0 +1,119 @@ +package com.frank.ffmpeg.activity + +import android.annotation.SuppressLint +import android.media.MediaPlayer +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.text.TextUtils +import android.util.Log +import android.widget.ImageView +import android.widget.SeekBar +import android.widget.TextView +import com.frank.ffmpeg.R +import com.frank.ffmpeg.util.TimeUtil + +class AudioPlayActivity : AppCompatActivity() { + + companion object { + private val TAG = AudioPlayActivity::class.java.simpleName + + private const val MSG_TIME = 123 + private const val MSG_DURATION = 234 + } + + private var txtTitle: TextView? = null + private var txtArtist: TextView? = null + private var txtTime: TextView? = null + private var txtDuration: TextView? = null + private var audioBar: SeekBar? = null + + private lateinit var audioPlayer:MediaPlayer + + private val mHandler: Handler = @SuppressLint("HandlerLeak") + object : Handler() { + override fun handleMessage(msg: Message?) { + super.handleMessage(msg) + when (msg?.what) { + MSG_TIME -> { + audioBar?.progress = audioPlayer.currentPosition + txtTime?.text = TimeUtil.getVideoTime(audioPlayer.currentPosition.toLong()) + sendEmptyMessageDelayed(MSG_TIME, 1000) + } + MSG_DURATION -> { + val duration = msg.obj as Int + txtDuration?.text = TimeUtil.getVideoTime(duration.toLong()) + audioBar?.max = duration + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_audio_play) + + initView() + initAudioPlayer() + } + + private fun initView() { + txtTitle = findViewById(R.id.txt_title) + txtArtist = findViewById(R.id.txt_artist) + txtTime = findViewById(R.id.txt_time) + txtDuration = findViewById(R.id.txt_duration) + val btnPlay: ImageView = findViewById(R.id.img_play) + btnPlay.setOnClickListener { + if (isPlaying()) { + audioPlayer.pause() + btnPlay.setImageResource(R.drawable.ic_play) + } else { + audioPlayer.start() + btnPlay.setImageResource(R.drawable.ic_pause) + } + } + audioBar = findViewById(R.id.audio_bar) + audioBar?.setOnSeekBarChangeListener(object :SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if (!fromUser) return + audioBar?.progress = progress + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + audioPlayer.seekTo(audioBar?.progress!!) + } + }) + } + + private fun initAudioPlayer() { + val path = intent.data?.path + Log.e(TAG, "path=$path") + if (TextUtils.isEmpty(path)) return + audioPlayer = MediaPlayer() + audioPlayer.setDataSource(path) + audioPlayer.prepareAsync() + audioPlayer.setOnPreparedListener { + Log.e(TAG, "onPrepared...") + audioPlayer.start() + val duration = audioPlayer.duration + mHandler.obtainMessage(MSG_TIME).sendToTarget() + mHandler.obtainMessage(MSG_DURATION, duration).sendToTarget() + } + } + + private fun isPlaying() :Boolean { + return audioPlayer.isPlaying + } + + override fun onStop() { + super.onStop() + audioPlayer.stop() + audioPlayer.release() + } + +} diff --git a/app/src/main/res/drawable-xhdpi/ic_pause.png b/app/src/main/res/drawable-xhdpi/ic_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..dedce6a93da183cead95971ca224761e2bbc083c GIT binary patch literal 8775 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 O0#KIMkgJuk2>(AAVSp9@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_play.png b/app/src/main/res/drawable-xhdpi/ic_play.png new file mode 100644 index 0000000000000000000000000000000000000000..72dc5a491146716058e0167b443e4f648eaa34c4 GIT binary patch literal 9457 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 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file