minghongyan 2015-04-14 07:46 采纳率: 0%
浏览 3130

ios音频后台播放,怎么实现(在线)

ios音频后台播放,怎么实现,在线播放的
最好有直接执行的代码

  • 写回答

6条回答 默认 最新

  • 91program 博客专家认证 2015-04-14 08:18
    关注

    使用服务,即Service就可以满足你的要求。
    给你我以前自己写的示例:

    
    import java.util.List;
    
    import android.annotation.SuppressLint;
    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.media.MediaPlayer.OnPreparedListener;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Message;
    import android.util.Log;
    
    import com.hs.leozheng.phonelinkhs.MusicListActivity;
    import com.hs.leozheng.phonelinkhs.AudioMediaInfo;
    import com.hs.leozheng.phonelinkhs.AppConstant;
    
    /***
     * leo
     * 音乐播放服务
     */
    @SuppressLint("NewApi")
    public class PlayerService extends Service {
        private MediaPlayer mediaPlayer;    // 媒体播放器对象
        private String path;                // 音乐文件路径
        private int msg;
        private boolean isPause;            // 暂停状态
        private int current = 0;            // 记录当前正在播放的音乐
        private List<AudioMediaInfo> mp3Infos;      // 存放 AudioMediaInfo 对象的集合
        private int status = 3;             // 播放状态,默认为顺序播放
        private MyReceiver myReceiver;      // 自定义广播接收器
        private int currentTime;            // 当前播放进度
        private int duration;               // 播放长度
    
        /**
         * handler 用来接收消息,来发送广播更新播放时间
         */
        @SuppressLint("HandlerLeak")
        private Handler handler = new Handler() {
    
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    if(mediaPlayer != null) {
                        currentTime = mediaPlayer.getCurrentPosition(); // 获取当前音乐播放的位置
                        duration = mediaPlayer.getDuration();
    
                        Intent intent = new Intent();
                        intent.setAction(AppConstant.AUDIO_SEND_CURRENT);
                        intent.putExtra("currentTime", currentTime);
                        intent.putExtra("totalTime", duration);
                        sendBroadcast(intent); // 给 PlayerActivity 发送广播
                        handler.sendEmptyMessageDelayed(1, 100);
                    }
                }
            };
        };
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i("service", "service created");
            mediaPlayer = new MediaPlayer();
            mp3Infos = MusicListActivity.getMp3Infos(PlayerService.this);
    
            myReceiver = new MyReceiver();
            IntentFilter filter = new IntentFilter();
            filter.addAction(AppConstant.AUDIO_CTRL_ACTION);
            registerReceiver(myReceiver, filter);
    
            /**
             * 设置音乐播放完成时的监听器
             */
            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
    
                @Override
                public void onCompletion(MediaPlayer mp) {
                    if (1 == status) {          // 单曲循环
                        mediaPlayer.start();
                    } else if (2 == status) {   // 全部循环
                        current++;
                        if(current > mp3Infos.size() - 1) { // 变为第一首的位置继续播放
                            current = 0;
                        }
                        path = mp3Infos.get(current).GetUrl();
    
                        Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
                        sendIntent.putExtra("current", current);
                        sendIntent.putExtra("url", path);
                        sendIntent.putExtra("total", mp3Infos.size());
                        // 发送广播,将被 Activity 组件中的 BroadcastReceiver 接收到
                        sendBroadcast(sendIntent);
                        play(0);
                    } else if (3 == status) {   // 顺序播放
                        current++;              // 下一首位置
                        if (current <= mp3Infos.size() - 1) {
                            path = mp3Infos.get(current).GetUrl();
                            Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
                            sendIntent.putExtra("current", current);
                            sendIntent.putExtra("url", path);
                            sendIntent.putExtra("total", mp3Infos.size());
    
                            sendBroadcast(sendIntent);
                            play(0);
                        }else {
                            mediaPlayer.seekTo(0);
                            current = 0;
                            path = mp3Infos.get(current).GetUrl();
                            Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
                            sendIntent.putExtra("current", current);
                            sendIntent.putExtra("url", path);
                            sendIntent.putExtra("total", mp3Infos.size());
    
                            sendBroadcast(sendIntent);
                        }
                    } else if (4 == status) {   // 随机播放
                        current = getRandomIndex(mp3Infos.size() - 1);
                        path = mp3Infos.get(current).GetUrl();
                        Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
                        sendIntent.putExtra("current", current);
                        sendIntent.putExtra("url", path);
                        sendIntent.putExtra("total", mp3Infos.size());
    
                        sendBroadcast(sendIntent);
                        play(0);
                    }
                }
            });
        }
    
        /**
         * 获取随机位置
         */
        protected int getRandomIndex(int end) {
            int index = (int) (Math.random() * end);
            return index;
        }
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
        @SuppressWarnings("deprecation")
        @Override
        public void onStart(Intent intent, int startId) {
            path = intent.getStringExtra("url");                // 歌曲路径
            current = intent.getIntExtra("listPosition", -1);   // 当前播放歌曲的在 mp3Infos 的位置
            Log.i("Play Service", "onStart current is: " + Integer.toString(current));
            msg = intent.getIntExtra("MSG", 0);                 // 播放信息
            AppConstant.PlayerMsg msgEnum = AppConstant.PlayerMsg.values()[msg];
            if (AppConstant.PlayerMsg.PLAY_MSG == msgEnum) {    // 直接播放音乐
                Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
                sendIntent.putExtra("current", current);
                sendIntent.putExtra("url", path);
                sendIntent.putExtra("total", mp3Infos.size());
                // 发送广播,将被 Activity 组件中的 BroadcastReceiver 接收到
                sendBroadcast(sendIntent);
    
                play(0);
            }
            else if (AppConstant.PlayerMsg.PAUSE_MSG == msgEnum) {          // 暂停
                pause();
            }
            else if (AppConstant.PlayerMsg.STOP_MSG == msgEnum) {           // 停止
                stop();
            }
            else if (AppConstant.PlayerMsg.CONTINUE_MSG == msgEnum) {       // 继续播放
                resume();
            }
            else if (AppConstant.PlayerMsg.PRIVIOUS_MSG == msgEnum) {       // 上一首
                previous();
            }
            else if (AppConstant.PlayerMsg.NEXT_MSG == msgEnum) {           // 下一首
                next();
            }
            else if (AppConstant.PlayerMsg.PROGRESS_CHANGE == msgEnum) {    // 进度更新
                currentTime = intent.getIntExtra("progress", -1);
                play(currentTime);
            }
            else if (AppConstant.PlayerMsg.PLAYING_MSG == msgEnum) {
                handler.sendEmptyMessage(1);
            }
    
            super.onStart(intent, startId);
        }
    
        /**
         * 播放音乐
         *
         * @param position
         */
        private void play(int currentTime) {
            try {
                mediaPlayer.reset();                // 把各项参数恢复到初始状态
                mediaPlayer.setDataSource(path);
    
                Intent commonCtrl_intent = new Intent();
                commonCtrl_intent.setAction(AppConstant.COMMON_UI_MSG);
                commonCtrl_intent.putExtra("ACTION", "UIPlayingFilename");
                // 对 URL 进行处理: 保显示文件名,不显示目录
                int find = path.lastIndexOf('/') + 1;
                String strFilename = null;
                if(-1 != find)
                {
                    strFilename = path.substring(find);
                    commonCtrl_intent.putExtra("filename", strFilename);
                    sendBroadcast(commonCtrl_intent);
                }
    
                mediaPlayer.prepare();              // 进行缓冲
                mediaPlayer.setOnPreparedListener(new PreparedListener(currentTime));   // 注册一个监听器
                handler.sendEmptyMessage(1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 暂停音乐
         */
        private void pause() {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                isPause = true;
    
                Intent commonCtrl_intent = new Intent();
                commonCtrl_intent.setAction(AppConstant.COMMON_UI_MSG);
                commonCtrl_intent.putExtra("ACTION", "UIPlayingStatus");
                commonCtrl_intent.putExtra("playingStatus", 2);
                sendBroadcast(commonCtrl_intent);
            }
        }
    
        private void resume() {
            if (isPause) {
                mediaPlayer.start();
                isPause = false;
    
                Intent commonCtrl_intent = new Intent();
                commonCtrl_intent.setAction(AppConstant.COMMON_UI_MSG);
                commonCtrl_intent.putExtra("ACTION", "UIPlayingStatus");
                commonCtrl_intent.putExtra("playingStatus", 1);
                sendBroadcast(commonCtrl_intent);
            }
        }
    
        /**
         * 上一首
         */
        private void previous() {
            int size = mp3Infos.size();
            if((current - 1) >= 0) {
                current--;
            }
            else {
                current = size - 1;
            }
            path = mp3Infos.get(current).GetUrl();
    
            Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
            sendIntent.putExtra("current", current);
            sendIntent.putExtra("url", path);
            sendIntent.putExtra("total", size);
            // 发送广播,将被 Activity 组件中的 BroadcastReceiver 接收到
            sendBroadcast(sendIntent);
            play(0);
        }
    
        /**
         * 下一首
         */
        private void next() {
            int size = mp3Infos.size();
            if((current + 1) <= (size - 1)) {
                current++;
            }
            else {
                current = 0;
            }
            path = mp3Infos.get(current).GetUrl();
    
            Intent sendIntent = new Intent(AppConstant.AUDIO_SEND_UPDATE);
            sendIntent.putExtra("current", current);
            sendIntent.putExtra("url", path);
            sendIntent.putExtra("total", size);
            // 发送广播,将被 Activity 组件中的 BroadcastReceiver 接收到
            sendBroadcast(sendIntent);
            play(0);
        }
    
        /**
         * 停止音乐
         */
        private void stop() {
            if (mediaPlayer != null) {
                mediaPlayer.stop();
                try {
                    mediaPlayer.prepare(); // 在调用 stop 后如果需要再次通过 start 进行播放,需要之前调用 prepare 函数
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                Intent commonCtrl_intent = new Intent();
                commonCtrl_intent.setAction(AppConstant.COMMON_UI_MSG);
                commonCtrl_intent.putExtra("ACTION", "UIPlayingStatus");
                commonCtrl_intent.putExtra("playingStatus", 3);
                sendBroadcast(commonCtrl_intent);
            }
        }
    
        @Override
        public void onDestroy() {
            if (mediaPlayer != null) {
                mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        }
    
        /**
         *
         * 实现一个 OnPrepareLister 接口,当音乐准备好的时候开始播放
         *
         */
        private final class PreparedListener implements OnPreparedListener {
            private int currentTime;
    
            public PreparedListener(int currentTime) {
                this.currentTime = currentTime;
            }
    
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.start();    // 开始播放
                if (currentTime > 0) {  // 如果音乐不是从头播放
                    mediaPlayer.seekTo(currentTime);
                }
                Intent intent = new Intent();
                intent.setAction(AppConstant.AUDIO_SEND_DURATION);
                duration = mediaPlayer.getDuration();
                intent.putExtra("duration", duration);  // 通过 Intent 来传递歌曲的总长度
                sendBroadcast(intent);
            }
        }
    
        public class MyReceiver extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                AppConstant.PlayerMsg msgEnum = AppConstant.PlayerMsg.APP_CONSTANT_MAX;
                String action = intent.getAction();
                int msg = intent.getIntExtra("MSG", -1);
                int mode = intent.getIntExtra("mode", 3);
                if(msg > 0) {
                    msgEnum = AppConstant.PlayerMsg.values()[msg];
                }
                if(action.equals(AppConstant.AUDIO_CTRL_ACTION)) {
                    Log.v("Play Service", "Control: " + Integer.toString(msg));
                    if(msgEnum == AppConstant.PlayerMsg.PRIVIOUS_MSG)
                    {
                        Log.v("Play Service", "Control.Prev");
                        previous();
                    }
                    else if(msgEnum == AppConstant.PlayerMsg.NEXT_MSG)
                    {
                        Log.v("Play Service", "Control.Next");
                        next();
                    }
                    else if(msgEnum == AppConstant.PlayerMsg.PLAY_MODE)
                    {
                        Log.v("Play Service", "Control.Mode: " + Integer.toString(mode));
                    }
                    else if(msgEnum == AppConstant.PlayerMsg.CONTINUE_MSG)
                    {
                        Log.v("Play Service", "Control.Continue");
                        resume();
                    }
                    else if(msgEnum == AppConstant.PlayerMsg.PAUSE_MSG)
                    {
                        Log.v("Play Service", "Control.Pause");
                        pause();
                    }
                }
            }
        }
    
    }
    

    调用 方式:

    Intent intent = new Intent();
    intent.putExtra("url", audioMediaInfo.GetUrl());   // 参数可要、可不要
    intent.putExtra("listPosition", positionSelected/*getPlayingIndex(audioMediaInfo.GetUrl())*/);
    intent.putExtra("MSG", AppConstant.PlayerMsg.PLAY_MSG.ordinal());
    intent.setClass(MusicListActivity.this, PlayerService.class);
    startService(intent); 
    
    评论

报告相同问题?

悬赏问题

  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决