Android的MediaPlayer的斩波背景 [英] Android MediaPlayer chopping in background

查看:123
本文介绍了Android的MediaPlayer的斩波背景的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现服务使用媒体播放器后台类一些电话(银河标签和一些LG型号)时,我的应用程序是在后台,声音挑起大梁当我打开另一个应用程序来播放流..反正。 .. 为什么这个?下面的一些教程中,我实现这样的服务:

I'm trying to implement a service to play a stream in background using mediaplayer class.. anyway in some phone (galaxy tab and some LG model) when my app is in background, the sound chops when I open another application... why this? following some tutorial I implemented the service in this way:

import com.somafm.api.PlayListFile;
import com.somafm.api.Playlist;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;

public class PlayerBackgroundService extends Service {

    static MediaPlayer.OnPreparedListener prepared_listener;
    static MediaPlayer.OnBufferingUpdateListener buffering_listener;
    static MediaPlayer.OnCompletionListener completion_listener;
    static MediaPlayer.OnErrorListener error_listener;

    private static Playlist playlist;
    private static PlayerController player;
    private static StreamProxy proxy;
    private static MediaPlayer mp = new MediaPlayer();

    static boolean canPlay;
    static boolean clean;
    static boolean cancelRequest;
    static boolean buffering;
    static boolean isPlaying;

    private static PowerManager.WakeLock powerLock;

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

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

    public void init()
    {
        PowerManager pM = (PowerManager) getSystemService(Context.POWER_SERVICE);
        powerLock = pM.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Prevent sleeping");
        powerLock.acquire();

        prepared_listener = new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                canPlay = true;
                clean = true;
            }
        };

        error_listener = new MediaPlayer.OnErrorListener() {

            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                Log.i("!!MEDIAERROR!!", "WHAT " + what + " - " + extra);
                canPlay = true;
                clean = false;
                isPlaying = false;
                return true;
            }
        };

        buffering_listener = new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mp, int percent) {
                Log.i("BUFFERING", "" + percent);
                if(percent > 0)
                {
                    if(mp.isPlaying() && !buffering)
                    {
                        player.notifyAllBuffering();
                        buffering = true;
                    }
                }
                else
                {
                    if(buffering)
                    {
                        player.notifyAllNotBuffering();
                        buffering = false;
                    }
                }
            }
        };

        completion_listener = new MediaPlayer.OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                //stop();
                Log.i("COMPLETED", "COMPLETED");
            }
        };

    }

    public synchronized static void start(){
        mp.start();
        isPlaying = true;
    }

    public synchronized static void prepare(){

        canPlay = false;
        clean = true;

        proxy = new StreamProxy();
        proxy.init();
        proxy.start();

        if (playlist == null)
        {
            clean = false;
            proxy.stop();
            return;
        }

        int i = 0;

        String proxyUrl = "";

        playlist.fetchContent();
        PlayListFile[] urlsToPlay = playlist.getFiles();

        if (urlsToPlay == null)
        {
            clean = false;
            proxy.stop();
            return;
        }

        if (urlsToPlay.length == 0)
        {
            clean = false;
            proxy.stop();
            return;
        }

        do{
            try{

                proxyUrl = String.format("http://127.0.0.1:%d/%s", proxy
                        .getPort(), Uri.parse(urlsToPlay[i].getUrl()));
                i++;
                Log.i("Trying link", "" + urlsToPlay.length);
                mp = new MediaPlayer();
                mp.setOnPreparedListener(prepared_listener);
                mp.setOnBufferingUpdateListener(buffering_listener);
                mp.setOnErrorListener(error_listener);
                mp.setOnCompletionListener(completion_listener);
                mp.setDataSource(proxyUrl);
                mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp.prepare();


            }catch(Exception ex)
            {
                clean = false;                 
                ex.printStackTrace();
            }

            if(cancelRequest == true)
            {
                clean = true;
                return;
            }

            if(i >= urlsToPlay.length)
                canPlay = true;   

        }while(canPlay == false);

        if(clean == false && proxy != null)
            proxy.stop();

    }


    public synchronized static void stop() {
        if(proxy != null)
            proxy.stop();
        if(mp != null)
            mp.stop(); 
        isPlaying = false;
    }

    public synchronized static void loadPlaylist(Playlist playlist) {
        PlayerBackgroundService.playlist = playlist;
    }

    public synchronized static void registerPlayer(PlayerController player) {
        PlayerBackgroundService.player = player;
    }

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

        if (powerLock != null && powerLock.isHeld())
            powerLock.release(); 
    }


}

并启动它是这样的:

And launch it in this way:

this.startService(new Intent(appcontext, PlayerBackgroundService.class));

也许我的课是错的..你能帮助我吗?

maybe my class is wrong.. can you help me?

在此先感谢

推荐答案

您需要手动停止使用暂停恢复已在媒体播放器中播放的音频和恢复活动的方法,看看这个,

You need to manually stop and resume the audio which has been played in Media player using pause and resume Method of activity , take a look at this,

 @Override
protected void onResume() {
    super.onResume();
    if (mediaPlayer != null) {
        mediaPlayer.start();
    }
}

protected void onPause() {
    super.onPause();
    if (mediaPlayer != null) {
        mediaPlayer.pause();
        if (isFinishing()) {
            mediaPlayer.stop();
            mediaPlayer.release();
        }
    }

这篇关于Android的MediaPlayer的斩波背景的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆