2017-02-08 2 views
16

J'ai suivi this jouer Radio Stream dans AndroidErreur de flux de médias Android? java.io.FileNotFoundException: Aucun fournisseur de contenu: http: //

Ici Son fonctionne bien mais le joueur en cours de chargement peu lent après avoir cliqué sur je dois attendre plus de 30 secondes de temps

Mais je reçois cette erreur dans la console

MediaPlayer: setDataSource IOException happend : 
java.io.FileNotFoundException: No content provider: http://www.example.com:8000/live.ogg 
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1074) 
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:927) 
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:854) 
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1087) 
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1061) 
at org.oucho.radio.Player.playLaunch(Player.java:237) 
at org.oucho.radio.Playlist.onPostExecute(Playlist.java:98) 
at org.oucho.radio.Playlist.onPostExecute(Playlist.java:35) 
at android.os.AsyncTask.finish(AsyncTask.java:632) 
at android.os.AsyncTask.access$600(AsyncTask.java:177) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5951) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 

Dans le lien, vous pouvez voir tous les fichiers comme player etc

En raison de cette erreur Mon s Tream est lent. S'il vous plaît quelqu'un me aider sur ce type

Ici cette erreur est pas .ogg fichier J'ai essayé avec .mp3 et Just /live

http://www.example.com:8000/beet.ogg 
http://www.example.com:8000/mouthorgan.mp3 
http://www.example.com:8000/live 

Le son joue, mais après cette erreur, il est prendre quelque 30 secondes de temps Parfois, il prend trop de temps .... Quand je joue Son montrant cette erreur, puis sa connexion au serveur .. et en cours de lecture

s'il vous plaît aidez-moi à résoudre ce problème

Répondre

11

java.io.FileNotFoundException: Aucun fournisseur de contenu: http://www.example.com:8000/live.ogg

Parce que sa charge en essayant comme un fichier à partir du périphérique ContentProvider en fonction du contexte et vous passez sous forme d'URL.

Votre problème est lié à la définition de datasource sur mediaplayer. Comme vous essayez de lire l'URL ou le streaming qui requis pour la méthode setDataSource sans contexte. J'étais confronté au même problème lors de la diffusion en direct. et ci-dessous le code résolu mon problème.

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/section_label" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/ab_tool" 
     android:text="Home" /> 

    <Button 
     android:id="@+id/btnStartMediaPlayer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/section_label" 
     android:text="Start Player" /> 


    <ToggleButton 
     android:id="@+id/togglePauseResume" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/btnStartMediaPlayer" 
     android:checked="true" 
     android:textOff="Resume" 
     android:textOn="Pause" /> 

    <Button 
     android:id="@+id/btnChangeTrack" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/togglePauseResume" 
     android:text="Chanage Track" /> 

    <Button 
     android:id="@+id/btnStopMediaPlayer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/btnChangeTrack" 
     android:text="STOP" /> 
</RelativeLayout> 

Manifest

<activity android:name=".PlayerScreen"> 

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 


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

Pour obtenir des données de diffusion des données d'en-tête url vous pouvez [vérifier cette réponse] [2]

Pour des fins de test ici i ont utilisé deux urls

MISE À JOUR 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); 
    } 
} 

me faire savoir si quoi que ce soit.

+0

merci @ user1140237 monsieur ... Je pense que c'est bien Mais j'ai besoin de vérifier mon service de radio maintenant Son bas .. Il prendra 2 jours pour renouveler .... jusqu'à ce que possible si vous pouvez me suggérer comment utiliser [ceci dans TabLayout] (http://stackoverflow.com/questions/42153697/android-changing-a-normal-layout-to -tab-layout erreur en images-boutons-et-autres) – MLN

+0

@MLN vous pouvez tester code ci-dessus avec une URL de streaming comme de shoutcast [url de streaming] (http://91.121.164.210:8380/stream). URL qui a un codec mp3 ou ogg. – user1140237

+0

merci Y at-il exemple de code à git-hub ou quelque chose comme ça de votre code ... Ici, j'ai essayé quelques fichiers manquants ... En fait, mon code fait délai de 30 secondes est donc il un code – MLN

16

Aller à ce fichier https://github.com/Old-Geek/Radio/blob/master/app/src/main/java/org/oucho/radio/Player.java#L234 et changer

player.setDataSource(context, Uri.parse(url)); 

à

player.setDataSource(url) 

Le problème est que void setDataSource (String path) Définit la source de données (fichier-chemin ou http/rtsp URL) à utiliser.

String path: le chemin du fichier ou l'URL http/rtsp du flux que vous voulez jouer

le code GitHub utilise void setDataSource (Context context, Uri uri) qui suppose uri être d'une certaine forme de ContentProvider

contexte contexte: le contexte à utiliser pour résoudre le Uri
Uri uri: le contenu URI des données que vous voulez jouer

+0

Merci @Anurag Singh .. erreur de Disparues Mais je reçois de cet avertissement '02-13 15: 24: 20,233 16769 -16787/org.sss.text.liveradio D/MediaHTTPConnection: filterOutInternalHeaders: key = User-Agent, val = stagefright/1.2 (Linux, Android 5.1.1) 02-13 15: 24: 20,243 16769-16786/org. sss.text.liveradio D/MediaHTTPConnection: port nulle proxy 0 02-13 15: 24: 38,203 16769-16769/org.sss.text.liveradio E/MediaPlayer: Il devrait y avoir contrôleur de sous-titre déjà défini 02-13 15:24 : 54.743 16769-16769/org.sss.text.liveradio E/MediaPlayer-JNI: QCMedia Joueur MediaPlayer Inexistant 'et son jeu même ** 30sec Dilay ** Merci – MLN

+0

Votre réponse a travaillé .... Mais encore son retard de littlebit Je vais vérifier et confirmer la générosité ,,,, – MLN

+0

que je dois à la justice tous les deux donc presque les deux vous m'ont aidé Donc je leur ai distribué la générosité et répondez merci pour passer votre effort et votre temps sur ma question – MLN

0

Cette erreur se produit également si cette autorisation internet est pas dans le Manifest.xml

<uses-permission android:name="android.permission.INTERNET" />