parent
afb268ea5a
commit
f7b39c42a3
@ -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() |
||||||
|
} |
||||||
|
|
||||||
|
} |
After Width: | Height: | Size: 8.6 KiB |
After Width: | Height: | Size: 9.2 KiB |
@ -0,0 +1,73 @@ |
|||||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="match_parent"> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/txt_title" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginTop="50dp" |
||||||
|
android:layout_centerHorizontal="true" |
||||||
|
android:textColor="@color/colorPrimary" |
||||||
|
android:textSize="18sp"/> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/txt_artist" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_below="@id/txt_title" |
||||||
|
android:layout_marginTop="10dp" |
||||||
|
android:layout_centerHorizontal="true" |
||||||
|
android:textColor="@color/colorPrimary" |
||||||
|
android:textSize="18sp"/> |
||||||
|
|
||||||
|
<androidx.recyclerview.widget.RecyclerView |
||||||
|
android:id="@+id/list_lyrics" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_centerInParent="true"/> |
||||||
|
|
||||||
|
<RelativeLayout |
||||||
|
android:id="@+id/layout_control" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginStart="16dp" |
||||||
|
android:layout_marginEnd="16dp" |
||||||
|
android:layout_alignParentBottom="true" |
||||||
|
android:layout_marginBottom="30dp"> |
||||||
|
|
||||||
|
<SeekBar |
||||||
|
android:id="@+id/audio_bar" |
||||||
|
android:layout_width="match_parent" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_marginBottom="10dp"/> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/txt_time" |
||||||
|
android:layout_below="@id/audio_bar" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_alignStart="@id/audio_bar" |
||||||
|
android:textColor="@color/colorPrimary"/> |
||||||
|
|
||||||
|
<TextView |
||||||
|
android:id="@+id/txt_duration" |
||||||
|
android:layout_below="@+id/audio_bar" |
||||||
|
android:layout_width="wrap_content" |
||||||
|
android:layout_height="wrap_content" |
||||||
|
android:layout_alignEnd="@id/audio_bar" |
||||||
|
android:textColor="@color/colorPrimary"/> |
||||||
|
|
||||||
|
<ImageView |
||||||
|
android:id="@+id/img_play" |
||||||
|
android:layout_below="@+id/audio_bar" |
||||||
|
android:layout_width="40dp" |
||||||
|
android:layout_height="40dp" |
||||||
|
android:layout_centerHorizontal="true" |
||||||
|
android:src="@drawable/ic_pause" |
||||||
|
android:contentDescription="@string/audio_play" /> |
||||||
|
|
||||||
|
</RelativeLayout> |
||||||
|
|
||||||
|
</RelativeLayout> |
Loading…
Reference in new issue