RadioPlayerService Library for android不播放.m3u8链接。

时间:2017-05-18 15:59:58

标签: android android-mediaplayer

使用RadioPlayerService Library for android。它无法播放.m3u8链接。例如:http://airlive.nic.in/hls-live/livepkgr/definst/airmalayalam.m3u8

1 个答案:

答案 0 :(得分:0)

您可以随时尝试自己编写。这不是太难。虽然我的示例较旧,但不应针对较新的Android版本进行定位。

对于我自己的RadioService,我有类似的东西:

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnInfoListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;

import radioapp.pxl.be.radioapp.model.Track;
import radioapp.pxl.be.radioapp.playlist.PlaylistDbHelper;

public class RadioService extends Service implements OnInfoListener, OnErrorListener {
    public static final String PLAYER_ERROR = "radioapp.pxl.be.radioapp.PLAYER_ERROR";
    private final IBinder mBinder = new RadioBinder();
    public MediaPlayer mMediaPlayer;
    private Intent mIntent;

    private Handler timerHandler = new Handler();
    private Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            PlaylistUpdaterTask task = new PlaylistUpdaterTask();
            task.execute();
            timerHandler.postDelayed(this, 60000);
        }
    };

    private void handleError() {
        Intent intent = new Intent(PLAYER_ERROR);
        LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);
        stop();
    }

    synchronized public boolean play() {
        mMediaPlayer = new MediaPlayer();
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mMediaPlayer.setOnErrorListener(this);
        mMediaPlayer.setOnInfoListener(this);
        mMediaPlayer.setOnPreparedListener(new OnPreparedListener() {
            public void onPrepared(MediaPlayer mp) {
                mMediaPlayer.start();

            }
        });
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        String s = preferences.getString("servers", "http://stream.intronic.nl/rgrfm");
        try {
            mMediaPlayer.setDataSource(s);
        } catch (IllegalArgumentException e) {
            handleError();
        } catch (SecurityException e) {
            handleError();
        } catch (IllegalStateException e) {
            handleError();
        } catch (IOException e) {
            handleError();
        }
        try {
            mMediaPlayer.prepareAsync();
        } catch (IllegalStateException e) {
            handleError();
        }
        timerHandler.postDelayed(timerRunnable, 0);
        return true;
    }

    synchronized public void stop() {
        if (mMediaPlayer != null) {
            try {
                mMediaPlayer.stop();
            } catch (IllegalStateException ex) {
                ex.printStackTrace();
            }
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        stopForeground(true);
        timerHandler.removeCallbacks(timerRunnable);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopForeground(true);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
            public void onCallStateChanged(int state, String incomingNumber) {
                switch (state) {
                    case TelephonyManager.CALL_STATE_RINGING:
                        if (mMediaPlayer != null) {
                            try {
                                if (mMediaPlayer.isPlaying()) {
                                    stop();
                                }
                            } catch (IllegalStateException e) {
                                stop();
                            }
                        }
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK:
                        break;
                    case TelephonyManager.CALL_STATE_IDLE:
                        break;
                    default:
                        break;
                }


            }
        };
        mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        mIntent = new Intent(getApplicationContext(), MainActivity.class);
        mIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    }

    @Override
    public boolean onError(MediaPlayer arg0, int arg1, int arg2) {
        handleError();
        return true;
    }

    @Override
    public boolean onInfo(MediaPlayer player, int arg1, int arg2) {
        if (arg1 == 703 && arg2 == 0) {
            if (mMediaPlayer == null) {
                play();
            } else {
                if (!mMediaPlayer.isPlaying()) {
                    play();
                } else {
                    handleError();
                }
            }
            return true;
        }
        return false;
    }

    public class RadioBinder extends Binder {
        RadioService getService() {
            return RadioService.this;
        }
    }

    public class PlaylistUpdaterTask extends AsyncTask<Void, ArrayList<Track>, ArrayList<Track>> {

        @Override
        protected ArrayList<Track> doInBackground(Void... voids) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet("http://www.rgrfm.be/rgrsite/maxradio/android_json.php");
            String jsonResult = null;
            try {
                HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 5000);
                HttpResponse response = httpclient.execute(httpGet);
                jsonResult = Conversion.inputStreamToString(response.getEntity().getContent()).toString();
            } catch (ClientProtocolException e) {
                return new ArrayList<Track>();
            } catch (IOException e) {
                return new ArrayList<Track>();
            }
            ArrayList<Track> items = new ArrayList<Track>();
            try {
                JSONObject jsonResponse;
                if (jsonResult != null) {
                    jsonResponse = new JSONObject(jsonResult);
                    JSONArray jsonMainNode = jsonResponse.optJSONArray("playlist");
                    for (int i = 0; i < jsonMainNode.length(); i++) {
                        JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                        Track item = new Track();
                        item.setArtist(jsonChildNode.optString("artist"));
                        item.setTitle(jsonChildNode.optString("title"));
                        item.setTime(jsonChildNode.optString("time"));
                        items.add(item);
                    }
                } else {
                    return new ArrayList<Track>();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return items;
        }

        @Override
        protected void onPostExecute(ArrayList<Track> tracks) {
            if (tracks.size() == 3) {
                PlaylistDbHelper helper = new PlaylistDbHelper(getApplicationContext());
                helper.addPlaylistItem(tracks.get(0));
                helper.addPlaylistItem(tracks.get(1));
                helper.addPlaylistItem(tracks.get(2));
                helper.cleanPlaylist();
            }
        }
    }
}
相关问题