在service中播放音乐

MainActivity:

public class MainActivity extends Activity {
    private MyReceiver receiver;
    private Button btnStartOrPause;
    private String receiverAction = "com.pepelu.musicplayer";

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

        // 动态注册广播,不需要再在Manifest中注册
        receiver = new MyReceiver();
        IntentFilter filter = new IntentFilter(receiverAction);
        registerReceiver(receiver, filter);
        // button
        btnStartOrPause = (Button) findViewById(R.id.button1);
    }

    public void clickHandle(View view) {
        int id = view.getId();
        if (id == R.id.button1) {//播放,暂停
            Intent intent = new Intent(this, MusicPlayerService.class);
            Bundle bundle = new Bundle();
            File file = new File(Environment.getExternalStorageDirectory(), "残酷天使.mp3");
            bundle.putString("audioPath", file.getPath());
            bundle.putString("receiverAction", receiverAction);
            intent.putExtras(bundle);
            startService(intent);
        } else if (id == R.id.button2) {//停止
            Intent intent = new Intent(this, MusicPlayerService.class);
            stopService(intent);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 解除注册
        unregisterReceiver(receiver);
    }

    public class MyReceiver extends BroadcastReceiver {
        /**
         * 更新UI
         */
        @Override
        public void onReceive(Context context, Intent intent) {
//            String name = intent.getStringExtra("name");
//            Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
//            btnStartOrPause.setText("暂停");
            int backFlag=intent.getIntExtra("backFlag", 0);
            switch (backFlag) {
            case 0:
                btnStartOrPause.setText("暂停");
                break;
            case 1:
            case 2:
            case 3:
                btnStartOrPause.setText("播放");
                break;
            default:
                break;
            }
        }

    }
}

Service:

public class MusicPlayerService extends Service {
    private MediaPlayer player;
    private Intent mIntent;
    private Bundle bundle;
    private String audioPath;
    private String receiverAction;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

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

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // super.onStartCommand(intent, flags, startId);
        if (mIntent == null) {
            mIntent = intent;
        }
        audioPath = mIntent.getExtras().getString("audioPath");
        receiverAction = mIntent.getExtras().getString("receiverAction");
        // 正在播放
        if (player != null && player.isPlaying()) {
            player.pause();
            sendBC4UpdateUI(1);
        } else {
            // 第一次播放
            if (player == null) {
                player = new MediaPlayer();
                try {
                    player.setDataSource(audioPath);
                    player.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    player.prepare();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (SecurityException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 异步缓冲
            // player.prepareAsync();
            // player.setOnPreparedListener(new OnPreparedListener() {
            // @Override
            // public void onPrepared(MediaPlayer mp) {
            // player.start();
            // }
            // });
            //开始播放
            player.start();
            sendBC4UpdateUI(0);
            //一曲播放结束
            player.setOnCompletionListener(new OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    //播放器重置
                    player.reset();
                    player = null;
                    sendBC4UpdateUI(3);
                }
            });
        }
        return START_STICKY;

    }

    @Override
    public void onDestroy() {
        // 释放掉player资源
        if (player != null) {
            player.release();
            sendBC4UpdateUI(2);
        }
        super.onDestroy();
    }

    /**
     * 更新界面
     *
     * @param flag
     */
    private void sendBC4UpdateUI(int flag) {
        Intent intent = new Intent(receiverAction);
        // 如果缺少下面这句,关掉再重新打开播放器里点“停止”并不能停掉
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        bundle = new Bundle();
        bundle.putInt("backFlag", flag);
        intent.putExtras(bundle);
        sendBroadcast(intent);
    }
}

布局文件:

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.pepelu.musicplayer.MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="clickHandle"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="16dp"
        android:text="播放" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="clickHandle"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_marginLeft="52dp"
        android:layout_toRightOf="@+id/button1"
        android:text="停止" />

</RelativeLayout>

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.pepelu.musicplayer"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

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

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

        <service android:name="com.pepelu.musicplayer.service.MusicPlayerService" >
        </service>

    </application>

</manifest>

参考博客:

简易mp3播放器:http://blog.csdn.net/ouyang_peng/article/details/8777709

使用service播放MP3:http://www.cnblogs.com/giuz/archive/2010/10/31/1865470.html

service的使用:http://segmentfault.com/a/1190000000507084

时间: 2024-10-27 18:12:02

在service中播放音乐的相关文章

相对完美的后台Service实现播放音乐功能

对于用Context.startService()启动的service生命周期为onCreate()-onStartCommand()-onDestroy();如果多次用context.startService启动service只会多次执行onStartCommand()方法.根据音乐播放器的特性使用Context.startService()调用在合适不过了. public class MyMusicPlayer extends Service implements MediaPlayer.O

如何在Ubuntu QML应用中播放音乐

昨天我看见一个开发者发了一个问题,询问如何播放声音.目前由于一些原因在模拟器中没法测试.其实,播放声音很容易.如果使用qmake的话,可能需要做一些修改才可以正确地在手机上播放. 我们首先使用SDK来创建一个简单的项目(QML app with Simple UI "qmake").我们记得修改我们的Main.qml如下: import QtQuick 2.0 import Ubuntu.Components 1.1 import QtMultimedia 5.0 /*! \brief

关于使用AssetManager 解析assets 中的MP3 在service中播放

代码如下: str是assets下面文件的路径 例如 bear.mp3 的路径就是Str = "animal/bear.mp3" ; 然后利用 AssetManager 读取MP3文件 用MediaPlayer播放 AssetManager am = getAssets(); AssetFileDescriptor afd = am.openFd(str); mMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStart

手机影音第十五天,利用service实现后台播放音乐,在通知栏显示当前音乐信息等

代码已经托管到码云上,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 先来一张目前的音乐播放器的效果图,当播放时,手机的状态通知栏也会有音乐信息显示. 这里可以看到有歌名.演唱者,还有歌曲的总时间,当前播放时间,当前播放进度,音乐暂停.下一首,上一首,音乐循环模式(单曲循环,顺序播放.循环播放)功能的实现.下一步就是把中间空白的部分填充歌词,然后做成根据进度显示歌词. 由于这次的内容有点多,是写了一天半的代码,讲的没那么细,

利用video PreviewWidget在Ubuntu Scope中播放video

在先前的例程中,我们探讨了如何利用audio PreviewWidget在Scope中播放音乐.在这篇文章中,我们将介绍如何使用videoPreviewWidget来播放一个video. 我们首先来下载我在上一篇文章中的例程: git clone https://gitcafe.com/ubuntu/scopetemplates_audio.git 为了加入video PreviewWidget,我在我们的例程中加入了如下的句子: query.cpp r["videoSource"]

安卓中的音乐播放

在Android平台下,要实现声音的播放是十分容易实现的,只要生成一个MediaPlayer对象,并调用它的相关方法,就能改变对声音播放进行控制.MediaPlayer对象有一下各种状态: 熟悉了MediaPlayer对象的各种状态后以及转换条件,就能很好的控制媒体播放. 例如:播放res/raw文件夹中的歌曲十分简单,只需写如下代码: MediaPlayer mp = MediaPlayer.create(context, R.raw.sound_file_1); mp.start();  

Android(java)学习笔记234: 服务(service)之音乐播放器

1.我们播放音乐,希望在后台长期运行,不希望因为内存不足等等原因,从而导致被gc回收,音乐播放终止,所以我们这里使用服务Service创建一个音乐播放器. 2.创建一个音乐播放器项目(使用服务) (1)首先新建一个Android项目,命名为"Mp3音乐播放器",如下: (2)创建服务MusicService,如下: 1 package com.himi.Mp3player; 2 3 import android.app.Service; 4 import android.content

Android使用Service播放音乐

像音乐这种耗时的和适合后台操作的应当放在Service中进行操作,而不是放在Activity,下面就介绍使用Service的音乐播放器 先创建一个MusicService 配置清单中会自动生成 改Service的声明 在MusicService中的Java代码,里面包含了音乐的相关操作 public class MusicService extends Service { private String path = "mnt/sdcard/123.mp3"; private Media

AVAudioPlayer播放音乐文件及读取ipod库中的音乐文件

下面是ipad上的调试效果 下面是代码,代码中都有注释: #import <UIKit/UIKit.h>  #import <AVFoundation/AVFoundation.h>  #import <MediaPlayer/MediaPlayer.h>   @interface RootViewController : UIViewController <AVAudioPlayerDelegate> {     AVAudioPlayer *player