Android播放mp3
網頁
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btnPlay"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="播放"
/>
<Button
android:id="@+id/btnPause"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="暫停"
/>
<Button
android:id="@+id/btnStop"
android:layout_width="100dp"
android:layout_height="50dp"
android:text="停止"
/>
</LinearLayout>
Activity
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.cloudcenter.day05.services.MusicService;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private MusicService.MyBinder myBinder;
private MyConnection mCon;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
private void init() {
initView();
// todo activity 與 service綁定啟動
Intent intent = new Intent(this, MusicService.class);
//創建鏈接
mCon = new MyConnection();
//設置連接
bindService(intent, mCon, BIND_AUTO_CREATE);
// startService();
// 權限判斷,如果沒有權限就請求權限(動態)
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
Toast.makeText(this, "權限已獲取!", Toast.LENGTH_SHORT).show();
// initMediaPlayer();//初始化播放器 MediaPlayer
}
}
private void initView() {
Button btnPlay = (Button) findViewById(R.id.btnPlay);
Button btnPause = (Button) findViewById(R.id.btnPause);
Button btnStop = (Button) findViewById(R.id.btnStop);
btnPlay.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnStop.setOnClickListener(this);
}
@Override
public void onClick(View view) {
//根據按鈕,設置對應的service方法
switch (view.getId()) {
case R.id.btnPlay:
if (null != myBinder) myBinder.onPlay();
break;
case R.id.btnPause:
if (null != myBinder) myBinder.onPause();
break;
case R.id.btnStop:
if (null != myBinder) myBinder.onStop();
break;
default:
break;
}
}
/**
* todo 連接通道:連接Activity和service
* 創建之后生成這兩個方法就行了,不需要其他操作。
*/
private class MyConnection implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
//創建一個全局變量,獲取service中的Binder
myBinder = ((MusicService.MyBinder) iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}
/**
* app獲取權限回掉
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// initMediaPlayer();
} else {
Toast.makeText(this, "拒絕權限,將無法使用程序。", Toast.LENGTH_LONG).show();
finish();
}
break;
default:
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != myBinder) myBinder.onDestroy();
//斷開service連接
unbindService(mCon);
}
}
Service
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import java.io.IOException;
/**
* todo Service有兩種啟動方式:
* onStart:停用了
* onBind:
*/
public class MusicService extends Service {
//媒體播放
private MediaPlayer mMediaPlayer = new MediaPlayer();
private static final String TAG = "MusicService";
private boolean isPrepared = false; // 是否准備完畢
public MusicService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return new MyBinder();
}
@Override
public void onCreate() {
super.onCreate();
//播放
initMusicPlayer();
}
/**
* 播放本地
*/
private void initMusicPlayer() {
try {
//設置播放地址
mMediaPlayer.setDataSource("/sdcard/1.mp3");
//播放。
mMediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 播放線上的媒體文件
*/
private void initNetMusicPlayer() {
try {
//Android9開始,不能直接播放http了,所以若是低於Android的手機,直接這樣播放沒有問題,但是高版本的Android就不能播放了
mMediaPlayer.setDataSource("http://test-web-back.findmaster.cn:13389/static/good.mp3");
//使用異步播放
mMediaPlayer.prepareAsync();
//添加監聽,監聽媒體流的加載情況
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
//加載了內容
isPrepared = true;
//直接播放
mMediaPlayer.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
//TODO 創建Binder進行Activity和service的交互
public class MyBinder extends Binder {
/**
* 播放
*/
public void onPlay() {
//若是播放網絡資源,需要加載好之后才能播放
// if (!isPrepared) {
// Toast.makeText(MusicService.this, "還未准備好!", Toast.LENGTH_SHORT).show();
// return ;
// }
if (!mMediaPlayer.isPlaying()) {
mMediaPlayer.start();
}
}
public void onPause() {
if (mMediaPlayer.isPlaying()) {
mMediaPlayer.pause();
}
}
public void onStop() {
if (mMediaPlayer.isPlaying()) {
//重新設置
mMediaPlayer.reset();
//播放
initMusicPlayer();
}
}
//銷毀
public void onDestroy() {
if (null != mMediaPlayer) {
mMediaPlayer.stop();
mMediaPlayer.release(); // 釋放資源
mMediaPlayer = null;
}
}
}
}
權限
<!-- 獲取本地的寫權限。 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 獲取本地的讀權限。 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
播放網絡mp3異常
播放的時候,網絡不能播放,原因是Android9開始,不能直接播放http了,所以若是低於Android的手機,直接這樣播放沒有問題,但是高版本的Android就不能播放了.
解決方法:
- 方法1:在
AndroidManifest.xml
的application
標簽添加android:usesCleartextTraffic="true"
- 方法2:在訪問http之前,調用
setCleartextTrafficPermitted(true)