Hier ist mein Problem: Ich schreibe ein Laravel-Backend, das eine mp3-Datei abliefern muss, die mit dem Android-Standard-Media-Player reproduziert werden muss.
Für das Laravel-Backend muss ich JWT verwenden, um die Authentifizierung zu handhaben, also muss ich bei jeder Anfrage das Feld "Authorization" auf "Bearer {token}" setzen.
Die Laravel Strecke ist „/Lieder/{id}“ und wird auf diese Weise behandelt:Serve mp3 stream für android mit Laravel
public function getSong(Song $song) {
$file = new File(storage_path()."/songs/".$song->path.".mp3");
$headers = array();
$headers['Content-Type'] = 'audio/mpeg, audio/x-mpeg, audio/x-mpeg-3, audio/mpeg3';
$headers['Content-Length'] = $file->getSize();
$headers['Content-Transfer-Encoding'] = 'binary';
$headers['Accept-Range'] = 'bytes';
$headers['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0';
$headers['Connection'] = 'Keep-Alive';
$headers['Content-Disposition'] = 'attachment; filename="'.$song->path.'.mp3"';
$user = \Auth::user();
if($user->activated_at) {
return Response::download($file, $song->path, $headers);
}
\App::abort(400);
}
Auf der Android-Seite ich den Mediaplayer bin mit der MP3-Datei auf diese Weise zu streamen:
media_player = new MediaPlayer();
try {
media_player.setAudioStreamType(AudioManager.STREAM_MUSIC);
String token = getSharedPreferences("p_shared", MODE_PRIVATE).getString("token", null);
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer " + token);
media_player.setDataSource(
getApplicationContext(),
Uri.parse(ConnectionHelper.SERVER + "/songs/" + song.getId()),
headers
);
} catch (IOException e) {
finish();
Toast.makeText(
Round.this,
"Some error occurred. Retry in some minutes.",
Toast.LENGTH_SHORT
).show();
}
media_player.setOnCompletionListener(this);
media_player.setOnErrorListener(this);
media_player.setOnPreparedListener(this);
Aber jedes Mal, wenn ich den Code ausführen ich eine Portion extra Code -1005 auf den Fehler-Listener, ERROR_CONNECTION_LOST bedeutet.