Android 之路72---MediaPlayer播放音乐

导读

1.简单实现
2.引入Service实现
3.AudioManager
4.音乐播放器案例实现

这里写图片描述
这里写图片描述

简单实现

从sdcard和网络获取播放源

Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hala.mediaplayer">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>

</manifest>

MainActivity.java

package com.hala.mediaplayer;

import android.media.MediaPlayer;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //1.创建MediaPlayer对象,此时处于idel对象
        MediaPlayer player=new MediaPlayer();
//          重置,使得MediaPlayer重回idel状态
//        player.reset();
        try {
            //2.设置播放源,此时处于Initialized状态
            //可以是SDcard下面的文件,也可以是网络文件
            player.setDataSource(Environment.getExternalStorageDirectory()+"/Have A Heart.mp3");
              //player.setDataSource("http://192.168.10.148:8080/music/Victoria.mp3");
            //3.进入prepare状态
            player.prepare();
            //4.start状态
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

从资源文件中获取资源

这里写图片描述

这里要创建一个raw型的资源文件夹,并放入资源

package com.hala.mediaplayer;

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


public class MainActivity extends AppCompatActivity {

    private MediaPlayer player;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //参数二:播放源,存放于资源文件raw中
        player = MediaPlayer.create(this, R.raw.victoria);
        //通过create不再需要调用prepare方法了,因为create中已经包括了
        //如果再调用,会引发错误
        player.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
    }
}

引入Service实现

⚠️不要忘记相应权限

MyService.java

package com.hala.mediaplayer;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Environment;
import android.os.IBinder;

import java.io.IOException;

public class MyService extends Service {

    private MediaPlayer player;

    public MyService() {
    }

    //这里与上例MainActivity中onCreate一致
    @Override
    public void onCreate() {
        super.onCreate();
        //1.创建MediaPlayer对象,此时处于idel对象
        player = new MediaPlayer();
//          重置,使得MediaPlayer重回idel状态
//        player.reset();
        try {
            //2.设置播放源,此时处于Initialized状态
            //可以是SDcard下面的文件,也可以是网络文件
            player.setDataSource(Environment.getExternalStorageDirectory()+"/Have A Heart.mp3");
//            player.setDataSource("http://192.168.10.148:8080/music/Victoria.mp3");
            //3.进入prepare状态
            player.prepare();
            //4.start状态
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //重写这个方法的返回值为START_NOT_STICKY,原因是
    //默认情况下,程序被杀死时service会再次onCreate,
    //START_NOT_STICKY作用是让service不再onCreate
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }

    //作用为关闭service时音乐会停止
    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

MainActivity.java

package com.hala.mediaplayer;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //启动服务
        startService(new Intent(this,MyService.class));

    }
}

AudioManager

这里写图片描述

这里写图片描述

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hala.mediaplayer">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>
    </application>

</manifest>

activity_main.xml

<?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="com.hala.mediaplayer.MainActivity"
    android:gravity="center_vertical">


    <Button
        android:id="@+id/up"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="up"
        android:onClick="voiceControll"/>
    <Button
        android:id="@+id/down"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="down"
        android:onClick="voiceControll"/>
    <Button
        android:id="@+id/mute"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="mute"
        android:onClick="voiceControll"/>
    <Button
        android:id="@+id/unmute"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="unmute"
        android:onClick="voiceControll"/>

</LinearLayout>

MyService.java

package com.hala.mediaplayer;

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

import java.io.IOException;

public class MyService extends Service {

    private MediaPlayer player;

    public MyService() {
    }

    //这里与上例MainActivity中onCreate一致
    @Override
    public void onCreate() {
        super.onCreate();
        //1.创建MediaPlayer对象,此时处于idel对象
        player = new MediaPlayer();
//          重置,使得MediaPlayer重回idel状态
//        player.reset();
        try {
            //2.设置播放源,此时处于Initialized状态
            //可以是SDcard下面的文件,也可以是网络文件
            player.setDataSource(String.valueOf(getExternalFilesDir(Environment.DIRECTORY_MUSIC))+"/heart.mp3");
//            player.setDataSource("http://bd.kuwo.cn/yinyue/512985?from=baidu");
            //3.进入prepare状态
            player.prepare();
            //4.start状态
            player.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //重写这个方法的返回值为START_NOT_STICKY,原因是
    //默认情况下,程序被杀死时service会再次onCreate,
    //START_NOT_STICKY作用是让service不再onCreate
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }

    //作用为关闭service时音乐会停止
    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

MainActivity.java

package com.hala.mediaplayer;

import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //启动服务
        startService(new Intent(this,MyService.class));

    }

    public void voiceControll(View view){
        //1.获取声音管理器
        AudioManager manager= (AudioManager) getSystemService(Service.AUDIO_SERVICE);
        //2.操作
        switch (view.getId()){
            //增大
            case R.id.up:
                //参数1:声音类型
//                AudioManager.STREAM_ALARM 警报闹钟
//                AudioManager.STREAM_MUSIC 媒体
//                AudioManager.STREAM_NOTIFICATION 通知
//                AudioManager.STREAM_RING 铃声
//                AudioManager.STREAM_VOICE_CALL 通话
//                AudioManager.STREAM_SYSTEM 系统
                //参数2:调整声音变化方向 变大/变小/不变
//                AudioManager.ADJUST_RAISE
//                AudioManager.ADJUST_LOWER
//                AudioManager.ADJUST_SAME
                //参数3:按键时出现的动作
//                FLAG_PLAY_SOUND 发出声音 FLAG_SHOW_UI 显示音量进度条 0什么也没有
                manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_RAISE,AudioManager.FLAG_SHOW_UI);
                break;

                //减小
            case R.id.down:
                manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_LOWER,AudioManager.FLAG_PLAY_SOUND);
                break;

                //静音
            case R.id.mute:
                //如果API>=23 手机版本>6.0
                //如果手机版本过低会报错 IlleagalArguementException:Bad deriction -100
                manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_MUTE,AudioManager.FLAG_SHOW_UI);
                //如果API<23 手机版本<6.0
//                manager.setStreamMute(AudioManager.STREAM_MUSIC,true);
                break;

                //还原静音
            case R.id.unmute:
                manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,AudioManager.ADJUST_UNMUTE,AudioManager.FLAG_SHOW_UI);
                break;
        }
    }
}

音乐播放器案例实现

这里写图片描述

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hala.mediaplayer">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"></activity>

        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true" />

        <activity android:name=".MusicActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name=".MusicService"
            android:enabled="true"
            android:exported="true"></service>
    </application>

</manifest>

activity_music.xml

<?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:id="@+id/activity_main"
    android:layout_width="match_parent" android:layout_height="match_parent"
    tools:context="com.hala.mediaplayer.MusicActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="▶"
            android:id="@+id/playpause"
            android:onClick="controll"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="■"
            android:id="@+id/stop"
            android:onClick="controll"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="◁"
            android:id="@+id/last"
            android:onClick="controll"/>
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="▷"
            android:id="@+id/next"
            android:onClick="controll"/>
    </LinearLayout>

    <ProgressBar
        android:id="@+id/music_pro"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_margin="5dp"/>

    <ListView
        android:id="@+id/music_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

MusicService.java

package com.hala.mediaplayer;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

import java.io.IOException;

public class MusicService extends Service {
    public MusicService() {
    }

    MediaPlayer player;

    @Override
    public void onCreate() {
        super.onCreate();
        player = new MediaPlayer();

        new Thread() {
            @Override
            public void run() {
                super.run();
                while (true) {
                    try {
                        sleep(200);
                        //如果player被释放掉,这个进度线程也就没必要进行了
                        if (player != null) {
                            MusicActivity.musicPro.setProgress(player.getCurrentPosition());
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    int isStarting = -1;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String tag = intent.getStringExtra("tag");
        if (tag.equals("play")) {
            int index = intent.getIntExtra("index", 0);
            play(index);
            isStarting = 1;
        } else if (tag.equals("pause")) {
            player.pause();
            isStarting = 1;
        } else if (tag.equals("start")) {
            if (isStarting == -1) {
                play(0);
            } else {
                player.start();
            }

        }
        return START_NOT_STICKY;

    }

    public void play(int index) {
        String path = MusicActivity.pathList.get(index);
        try {
            //如果音乐正在播放,先停止
            if (player.isPlaying()) {
                player.stop();
            }
            player.reset();
            player.setDataSource(path);
            player.prepare();
            player.start();
            //获取歌曲进度条
            MusicActivity.musicPro.setMax(player.getDuration());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
        player.release();
        isStarting = -1;
        player = null;
    }


    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

MusicActivity.java

package com.hala.mediaplayer;

import android.content.Intent;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;

import java.io.File;
import java.util.ArrayList;

public class MusicActivity extends AppCompatActivity {

    private ListView musicView;
    //存放所有音乐曲目的名字
    private ArrayList<String> nameList=new ArrayList<>();
    //存放歌曲的路径,要被Service调用,所以是public static
    public static ArrayList<String> pathList=new ArrayList<>();
    private int index=0;//当前播放的曲目
    private Button playpause;
    public static ProgressBar musicPro;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_music);

        playpause=(Button)findViewById(R.id.playpause);
        musicPro=(ProgressBar)findViewById(R.id.music_pro);

        getMusic("/netease/cloudmusic/Music");
        musicView=(ListView)findViewById(R.id.music_view);
        ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,nameList);
        musicView.setAdapter(adapter);

        musicView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent it=new Intent(MusicActivity.this,MusicService.class);
                it.putExtra("index",i);
                it.putExtra("tag","play");
                startService(it);
                index=i;
                playpause.setText("||");
            }
        });


    }

    public void controll(View view){
        switch (view.getId()){
            case R.id.playpause:
                Intent it1 = new Intent(MusicActivity.this,MusicService.class);
                if(playpause.getText().equals("▶")){
                    it1.putExtra("tag","start");
                    playpause.setText("||");
                }else {
                    it1.putExtra("tag","pause");
                    playpause.setText("▶");
                }
                startService(it1);

                break;
            case R.id.stop:
                Intent it2=new Intent(MusicActivity.this,MusicService.class);
                stopService(it2);
                playpause.setText("▶");
                break;
            case R.id.last:
                //如果是第一首,跳到最后一首
                if(index==0){
                    index=pathList.size()-1;
                }else{
                    index--;
                }
                Intent it3=new Intent(MusicActivity.this,MusicService.class);
                it3.putExtra("index",index);
                it3.putExtra("tag","play");
                startService(it3);
                playpause.setText("||");
                break;
            case R.id.next:
                //如果是最后一首,跳到第一首
                if(index==pathList.size()-1){
                    index=0;
                }else{
                    index++;
                }
                Intent it4=new Intent(MusicActivity.this,MusicService.class);
                it4.putExtra("index",index);
                it4.putExtra("tag","play");
                startService(it4);
                playpause.setText("||");
                break;

        }
    }

    public void getMusic(String path){
        path=Environment.getExternalStorageDirectory()+path;
        File f=new File(path);
        //获取该文件夹下的所有文件集合
        File[] fs=f.listFiles();
        for(int i=0;i<fs.length;i++){
            String name=fs[i].getName();
            //获取其后缀看他是否为mp3
            String suffix=name.substring(name.length()-3,name.length());
            if(suffix.equalsIgnoreCase("mp3")){
                nameList.add(name);
                pathList.add(fs[i].getAbsolutePath());
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37527943/article/details/80490872