J'ai suivi ceci Lire la radio en streaming sur Android
Ici, ça marche bien, mais le chargement du lecteur est lent après avoir cliqué, il faut attendre plus de 30 secondes
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 flux est lent. S'il vous plaît, aidez-moi sur ce type
Ici, cette erreur ne concerne pas le fichier .ogg
que 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 est en cours de lecture, mais après cette erreur, cela prend environ 30 secondes. Parfois, cela prend trop de temps .... Lorsque je joue, il affiche cette erreur, puis sa connexion au serveur ..
aidez-moi s'il vous plaît à résoudre ce problème
Java.io.FileNotFoundException: Aucun fournisseur de contenu: http://www.example.com:8000/live.ogg
Parce que sa tentative de chargement en tant que fichier de fournisseur de contenu de périphérique en fonction du contexte et que vous passez en tant qu'URL.
Il semble que votre problème réside dans la définition de la source de données sur mediaplayer. Pendant que vous essayez de lire l’URL ou la diffusion qui nécessite la méthode setDataSource sans contexte.
Je faisais face au même problème lorsque je jouais en streaming en direct. et ci-dessous le code a 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>
Manifeste
<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 transmission de données d'en-tête d'URL en streaming, vous pouvez [vérifier cette réponse] [2]
À des fins de test ici, j'ai utilisé deux URL
UPDATEPlayerActivity
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);
}
}
laissez-moi savoir si quelque chose.
Accéder à ce fichier https://github.com/Old-Geek/Radio/blob/master/app/src/main/Java/org/oucho/radio/Player.Java#L234 et modifier
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 (chemin du fichier ou URL http/rtsp) à utiliser.
path String: le chemin du fichier ou l'URL http/rtsp du flux que vous souhaitez lire.
le code github utilise void setDataSource (Context context, Uri uri)
qui suppose que uri
est d'une forme quelconque de ContentProvider
contexte contexte: le contexte à utiliser lors de la résolution de l'URI
uri Uri: l'URI de contenu des données que vous voulez lire
Sur Android 9+, le trafic http net en réseau peut être à l'origine de ce problème. Cochez cette case: Android 8: Le trafic HTTP Cleartext n'est pas autorisé
Cette erreur se produit également si cette autorisation Internet n'est pas dans le fichier Manifest.xml.
<uses-permission Android:name="Android.permission.INTERNET" />