Android8.0以上音樂播放示例

1、編寫佈局文件

<?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"
    tools:context=".MainActivity"
    android:orientation="vertical"
    android:background="@drawable/bg">

    <EditText
        android:id="@+id/et_inputPath"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Music/a.mp3"/><!--data/data/com.examplehq.musicplay-->

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_marginTop="50dp"
    android:layout_gravity="center_vertical"
    android:gravity="center"
    >
   <TextView
       android:id="@+id/tv_play"
       android:layout_width="0dp"
       android:layout_height="wrap_content"
       android:layout_weight="1"
       android:drawableTop="@drawable/play"
       android:drawablePadding="3dp"
       android:gravity="center"
       android:text="播放"/>
    <TextView
        android:id="@+id/tv_pause"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableTop="@drawable/pause"
        android:drawablePadding="3dp"
        android:gravity="center"
        android:text="暫停"/>
</LinearLayout>

</LinearLayout>

2、創建服務編寫MusicService服務實現音樂播放

package com.examplehq.musicplay;

import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;

import java.io.IOException;

public class MusicService extends Service {
    private MediaPlayer mPlayer;
    /* 綁定服務的實現流程:
     * 1.服務 onCreate, onBind, onDestroy 方法
     * 2.onBind 方法需要返回一個 IBinder 對象
     * 3.如果 Activity 綁定,Activity 就可以取到 IBinder 對象,可以直接調用對象的方法
     */

    public MusicService(){}
    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        if (mPlayer!=null){
            mPlayer.stop();
            mPlayer.release();
            mPlayer=null;
        }
        super.onDestroy();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        //第一步執行onBinder方法
        return new MyBinder();
    }
//定義內部類繼承Binder類
     class MyBinder extends Binder {
        //播放音樂
    public void  play(String path) {
        try {
        if (mPlayer==null){
            //創建一個MediaPlayer播放器
            mPlayer =new MediaPlayer();
            //指參數爲音頻文件
            mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            //指定播放路徑
                mPlayer.setDataSource(path);
            //準備播放
            mPlayer.prepare();
            //開始播放
            mPlayer.start();
            Log.i("play","播放音樂");
        }else {
            if (!mPlayer.isPlaying()){
                mPlayer.start();
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //暫停播放
    public void  pause(){
        if (mPlayer!=null && mPlayer.isPlaying()){
            mPlayer.pause();
        }else  if (mPlayer!=null && (mPlayer.isPlaying())){
            mPlayer.start();
        }
    }
    }
}

編寫Activity編寫邏輯代碼傳遞數據

package com.examplehq.musicplay;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;


import android.Manifest;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private EditText etInputPath;
    private TextView tvplay;
    private TextView tvPause;
    private Intent intent;
    private MyConn myConn;
    MusicService.MyBinder binder;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final int EXTERNAL_STORAGE_REQ_CODE = 10 ;

        int permission = ActivityCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 請求權限
           ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    EXTERNAL_STORAGE_REQ_CODE);
        }
        etInputPath = (EditText) findViewById(R.id.et_inputPath);
        tvplay = (TextView) findViewById(R.id.tv_play);//播放
        tvPause = (TextView) findViewById(R.id.tv_pause);//按鈕
        tvplay.setOnClickListener(this);
        tvPause.setOnClickListener(this);

        intent =new Intent(this,MuiscService.class);
        myConn =new MyConn();
        bindService(intent,myConn,BIND_AUTO_CREATE);

    }
    //實現播放暫停功能

public  void  onClick(View view){
    String txPath =etInputPath.getText().toString().trim();
    File sd_path = Environment.getExternalStorageDirectory();
    File file =new File(sd_path,txPath);
    String path =file.getAbsolutePath();
    Log.i("路徑",txPath+file.exists());
    switch (view.getId()){
        case R.id.tv_play:
            if (file.exists()&&file.length()>0){
                binder.play(path);
                Log.i("play2","播放了"+txPath);
            }
            Log.i("play1","播放了"+sd_path);
            break;
        case R.id.tv_pause:
            binder.pause();
            break;
        default:
            break;
    }
}
   private class MyConn implements ServiceConnection {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            binder =(MuiscService.MyBinder)service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }
    protected void onDestory(){
        unbindService(myConn);
        super.onDestroy();
    }

  
}

MainActivity.java代碼塊

8.0以上版本需手動註冊權限

    final int EXTERNAL_STORAGE_REQ_CODE = 10 ;

        int permission = ActivityCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if (permission != PackageManager.PERMISSION_GRANTED) {
            // 請求權限
           ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    EXTERNAL_STORAGE_REQ_CODE);
        }


AndroidManifest.xml代碼

/**/
    <!--增加請求安裝權限-->
  <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <!--從sdcard讀取數據的權限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!--往sdcard中寫入數據的權限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--在sdcard中創建/刪除文件的權限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />

推入mp3文件

在這裏插入圖片描述
選中文件夾 右鍵—>upload ---->選擇推入文件---->確定

最後,注意啦!

一定要在AndroidManifest.xml清單文件中加入
android:requestLegacyExternalStorage=“true”
在這裏插入圖片描述
初學者還有諸多不足還望海涵!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章