Android Media Stream Error? java.io.FileNotFoundException: No content provider :http://

前端 未结 4 576
南方客
南方客 2021-02-06 21:26

I followed this to Play Stream Radio In android

Here Its working Fine But Player Loading Bit Slow after clicking I need to wait for 30+ seconds time

But I am ge

4条回答
  •  [愿得一人]
    2021-02-06 21:55

    java.io.FileNotFoundException: No content provider: http://www.example.com:8000/live.ogg

    Because its trying load as a file from device contentprovider based on the context and you are passing as a URL.

    Seems your issue is in setting datasource to mediaplayer. As you are trying to play url or streaming which required to setDataSource method without context.

    I was facing same issue while playing live streaming. and below code resolved my issue.

    PlayerScreen

            public class PlayerScreen extends Activity {
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.player);
                startService(new Intent(this, MediaPlayerService.class));
                findViewById(R.id.btnChangeTrack).setOnClickListener(clickListener);
                findViewById(R.id.btnStartMediaPlayer).setOnClickListener(clickListener);
                findViewById(R.id.btnStopMediaPlayer).setOnClickListener(clickListener);
                ToggleButton toggleButton = (ToggleButton) findViewById(R.id.togglePauseResume);
                toggleButton.setOnCheckedChangeListener(checkedChangeListener);
                /*
                * To get url which is passing from the previous activity listitem click.
                * If url which is pass from listitem click is not empty it will start player
                * */
                String url = getIntent().getStringExtra("url");
                if (!TextUtils.isEmpty(url))
                    startMediaPlayer(url);
    
            }
    
            private ToggleButton.OnCheckedChangeListener checkedChangeListener = new ToggleButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (!isChecked) {
                        Intent intent = new Intent();
                        intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE);
                        intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PAUSE_MEDIA_PLAYER);
                        sendBroadcast(intent);
                    } else {
                        Intent intent = new Intent();
                        intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE);
                        intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.RESUME_MEDIA_PLAYER);
                        sendBroadcast(intent);
                    }
                }
            };
            private View.OnClickListener clickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent;
                    switch (v.getId()) {
                        case R.id.btnChangeTrack:
                            intent = new Intent();
                            intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE);
                            intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.CHANGE_PLAYER_TRACK);
                            intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, "http://www.example.com:8000/live");
                            sendBroadcast(intent);
                            break;
                        case R.id.btnStartMediaPlayer:
                            startMediaPlayer("http://www.example.com:8000/beet.ogg");
    //startMediaPlayer("http://108.163.197.114:8071/listen.pls");
                            break;
                        case R.id.btnStopMediaPlayer:
                            intent = new Intent();
                            intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE);
                            intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.STOP_MEDIA_PLAYER);
                            sendBroadcast(intent);
                            break;
    
                    }
                }
            };
    
            @Override
            protected void onResume() {
                super.onResume();
                registerReceiver(receiverFromservice, new IntentFilter(MediaPlayerService.SERVICE_TO_ACTIVITY));
            }
    
            private String currentPlayerStatus = "N/A";
            private BroadcastReceiver receiverFromservice = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    String action = intent.getAction();
                    if (MediaPlayerService.SERVICE_TO_ACTIVITY.equalsIgnoreCase(action)) {
                        /*
                        * To get current status of player
                        * */
                        currentPlayerStatus = intent.getStringExtra(MediaPlayerService.PLAYER_STATUS_KEY);
                        Log.e("Player Mode", "" + currentPlayerStatus);
                    }
                }
            };
    
            @Override
            protected void onPause() {
                super.onPause();
                unregisterReceiver(receiverFromservice);
            }
    
            /**
             * TO start media player.It will send broadcast to Service & from service player will start
             *
             * @param url
             */
            public void startMediaPlayer(String url) {
                Intent intent = new Intent();
                intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE);
                intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PLAY_MEDIA_PLAYER);
                intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, url);
                sendBroadcast(intent);
            }
        }
    

    MediaPlayerService

    public class MediaPlayerService extends Service {
        public static final String BROADCAST_TO_SERVICE = "com.mediaplayer.playerfunction";
        public static final String SERVICE_TO_ACTIVITY = "com.mediaplayer.currentPlayerStatus";
        public static final String PLAYER_FUNCTION_TYPE = "playerfunction";
        public static final String PLAYER_TRACK_URL = "trackURL";
        public static final int PLAY_MEDIA_PLAYER = 1;
        public static final int PAUSE_MEDIA_PLAYER = 2;
        public static final int RESUME_MEDIA_PLAYER = 3;
        public static final int STOP_MEDIA_PLAYER = 4;
        public static final int CHANGE_PLAYER_TRACK = 5;
        public static final String PLAYER_STATUS_KEY = "PlayerCurrentStatus";
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            IntentFilter intentFilter = new IntentFilter(BROADCAST_TO_SERVICE);
            registerReceiver(playerReceiver, intentFilter);
            if (mPlayer != null && mPlayer.isPlaying()) {
                sendPlayerStatus("playing");
            }
            return START_STICKY;
        }
    
        private BroadcastReceiver playerReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (BROADCAST_TO_SERVICE.equalsIgnoreCase(action)) {
                    String trackURL = intent.hasExtra(PLAYER_TRACK_URL) ? intent.getStringExtra(PLAYER_TRACK_URL) : "";
                    int function = intent.getIntExtra(PLAYER_FUNCTION_TYPE, 0);
                    switch (function) {
                        case CHANGE_PLAYER_TRACK:
                            changeTrack(trackURL);
                            break;
                        case STOP_MEDIA_PLAYER:
                            stopPlayer();
                            break;
                        case PLAY_MEDIA_PLAYER:
                            startMediaPlayer(trackURL);
                            break;
                        case PAUSE_MEDIA_PLAYER:
                            pausePlayer();
                            break;
                        case RESUME_MEDIA_PLAYER:
                            resumePlayer();
                            break;
                    }
    
                }
            }
        };
        private MediaPlayer mPlayer;
    
        private void pausePlayer() {
            if (mPlayer != null && mPlayer.isPlaying()) {
                mPlayer.pause();
                sendPlayerStatus("pause");
            }
        }
    
        private void resumePlayer() {
            if (mPlayer != null && !mPlayer.isPlaying()) {
                mPlayer.start();
                sendPlayerStatus("playing");
            }
        }
    
        private void changeTrack(String url) {
            stopPlayer();
            startMediaPlayer(url);
    
        }
    
        private void stopPlayer() {
            if (mPlayer != null) {
                mPlayer.stop();
                mPlayer.release();
                mPlayer = null;
                sendPlayerStatus("stopped");
    
            }
        }
    
        public void startMediaPlayer(String url) {
            if (TextUtils.isEmpty(url))
                return;
            if (mPlayer == null)
                mPlayer = new MediaPlayer();
            try {
                mPlayer.setDataSource(url);
                mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    
                    @Override
                    public boolean onError(MediaPlayer mp, int what, int extra) {
                        if (extra == MediaPlayer.MEDIA_ERROR_SERVER_DIED
                                || extra == MediaPlayer.MEDIA_ERROR_MALFORMED) {
                            sendPlayerStatus("erroronplaying");
                        } else if (extra == MediaPlayer.MEDIA_ERROR_IO) {
                            sendPlayerStatus("erroronplaying");
                            return false;
                        }
                        return false;
                    }
                });
                mPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
    
                    public void onBufferingUpdate(MediaPlayer mp, int percent) {
                        Log.e("onBufferingUpdate", "" + percent);
    
                    }
                });
                mPlayer.prepareAsync();
                mPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    
                    public void onPrepared(MediaPlayer mp) {
                        mPlayer.start();
                        sendPlayerStatus("playing");
                    }
                });
                mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        Log.e("onCompletion", "Yes");
                        sendPlayerStatus("completed");
                    }
                });
                mPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
                    @Override
                    public boolean onInfo(MediaPlayer mp, int what, int extra) {
                        return false;
                    }
                });
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private void sendPlayerStatus(String status) {
            Intent intent = new Intent();
            intent.setAction(SERVICE_TO_ACTIVITY);
            intent.putExtra(PLAYER_STATUS_KEY, status);
            sendBroadcast(intent);
        }
    }
    

    player.xml

    
    
        
    
        

    Manifest

    
    
        
            
    
    
            
        
    
    
    

    To get data from streaming url header data you can [check this answer][2]

    For testing purpose here i have used two urls

    UPDATE PlayerActivity

    public class PlayerScreen extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.player);
            startService(new Intent(this, MediaPlayerService.class));
            /*
            * To get url which is passing from the previous activity listitem click.
            * If url which is pass from listitem click is not empty it will start player
            * */
            String url = getIntent().getStringExtra("url");
            if (!TextUtils.isEmpty(url))
                startMediaPlayer(url);
    
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            registerReceiver(receiverFromservice, new IntentFilter(MediaPlayerService.SERVICE_TO_ACTIVITY));
        }
    
        private String currentPlayerStatus = "N/A";
        private BroadcastReceiver receiverFromservice = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (MediaPlayerService.SERVICE_TO_ACTIVITY.equalsIgnoreCase(action)) {
                    /*
                    * To get current status of player
                    * */
                    currentPlayerStatus = intent.getStringExtra(MediaPlayerService.PLAYER_STATUS_KEY);
                    Log.e("Player Mode", "" + currentPlayerStatus);
                }
            }
        };
    
        @Override
        protected void onPause() {
            super.onPause();
            unregisterReceiver(receiverFromservice);
        }
    
        /**
         * TO start media player.It will send broadcast to Service & from service player will start
         *
         * @param url
         */
        public void startMediaPlayer(String url) {
            Intent intent = new Intent();
            intent.setAction(MediaPlayerService.BROADCAST_TO_SERVICE);
            intent.putExtra(MediaPlayerService.PLAYER_FUNCTION_TYPE, MediaPlayerService.PLAY_MEDIA_PLAYER);
            intent.putExtra(MediaPlayerService.PLAYER_TRACK_URL, url);
            sendBroadcast(intent);
        }
    }
    

    let me know if anything.

提交回复
热议问题