안 드 로 이 드 음악 재생 기 진도 바 효과 구현
효과 도
3 개체 의존
MediaPlayer:음악 재생,일시 정지,버퍼 링 을 실현 합 니 다.
SeekBar:미 끄 러 지 는 진도.
java.util.Timer:타이머,진도 바 를 수시로 업데이트 합 니 다.
main.xml 스타일 파일
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<EditText
android:id="@+id/mediaFileName"
android:layout_width="match_parent"
android:text="gangstabop.mp3"
android:layout_height="wrap_content" >
<requestFocus />
</EditText>
<LinearLayout
android:id="@+id/linearButton"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/playButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/stop" />
<SeekBar
android:id="@+id/playSeekBar"
android:layout_width="140px"
android:layout_height="wrap_content"
android:layout_marginLeft="3px"
android:layout_marginTop="5px" />
<Button
android:id="@+id/replayButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="3px"
android:text="@string/replay" />
</LinearLayout>
Activity 구현 코드
/**
* @CreateDate 2015-2-3
* @Author hubiao
* @Title
*/
public class MediaActivity extends Activity {
private MediaPlayer mediaPlayer;//
private Button playButton;
private Button replayButton ;
private boolean isCellPlay;/* , */
private boolean isSeekBarChanging;// , 。
private int currentPosition;//
private SeekBar seekBar;
private Timer timer;
private static final String TAG = "MediaActivity";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//
mediaPlayer = new MediaPlayer();
//
seekBar = (SeekBar) findViewById(R.id.playSeekBar);
seekBar.setOnSeekBarChangeListener(new MySeekBar());
// [ ]
playButton= (Button) findViewById(R.id.playButton);
playButton.setOnClickListener(new PalyListener());
// [ ]
replayButton= (Button) findViewById(R.id.replayButton);
replayButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mediaPlayer.reset();
currentPosition = 0;
play();
}
});
//
TelephonyManager phoneyMana = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phoneyMana.listen(new myPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
}
/* */
@Override
protected void onDestroy() {
mediaPlayer.release();
timer.cancel();
timer = null;
mediaPlayer = null;
super.onDestroy();
}
/* */
private class PalyListener implements OnClickListener {
public void onClick(View v) {
if(playButton.getText().toString().equals(" "))
{
currentPosition = mediaPlayer.getCurrentPosition();//
mediaPlayer.stop();//
playButton.setText(R.string.stop);
timer.purge();// ;
}
else{
mediaPlayer.reset();
play();
}
}
}
/* */
private void play() {
File media = new File("/mnt/sdcard/files/","bewithyou.mp3");// , mp3
Log.i(TAG, media.getAbsolutePath());
if(media.exists())
{
try {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//
mediaPlayer.setDataSource(media.getAbsolutePath());// mp3
mediaPlayer.prepareAsync();//
/* , , */
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
public void onPrepared(MediaPlayer mp) {
mp.start();
mp.seekTo(currentPosition);
playButton.setText(R.string.play);
seekBar.setMax(mediaPlayer.getDuration());
}
});
//
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
if(!isSeekBarChanging){
seekBar.setProgress(mediaPlayer.getCurrentPosition());
}
}
},0,50);
} catch (Exception e) {
Toast.makeText(getApplicationContext(), R.string.playError, Toast.LENGTH_LONG).show();
e.printStackTrace();
System.out.println(e);
}
}
else{
Toast.makeText(getApplicationContext(), R.string.fileError, Toast.LENGTH_LONG).show();
}
}
/* */
private class myPhoneStateListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// ,
if(mediaPlayer.isPlaying() && playButton.getText().toString().equals(" ")){
currentPosition = mediaPlayer.getCurrentPosition();//
mediaPlayer.stop();
isCellPlay = true;//
playButton.setText(R.string.stop);
timer.purge();// ;
}
break;
case TelephonyManager.CALL_STATE_IDLE://
if(isCellPlay){
isCellPlay = false;
mediaPlayer.reset();
play();
}
break;
}
}
}
/* */
public class MySeekBar implements OnSeekBarChangeListener{
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
/* , */
public void onStartTrackingTouch(SeekBar seekBar) {
isSeekBarChanging = true;
}
/* , */
public void onStopTrackingTouch(SeekBar seekBar) {
isSeekBarChanging = false;
mediaPlayer.seekTo(seekBar.getProgress());
}
}
}
보충:1.mp3 가 sd 에서 재생 에 실패 하면 sd 접근 권한 이나 mp3 파일 이 존재 하 는 지 여부 입 니 다.
2.MediaPlayer 는 개별 오디 오 를 지원 하지 않 는 것 같 습 니 다.경로 가 정확 하고 재생 할 수 없 는 권한 이 있 으 면 오디 오 문 제 를 고려 하 십시오.
3.본 사례 에 사용 되 는 권한.
<!-- SD -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- SD -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.