[英]Stream Mediaplayer from URL then pass to another activity
我創建了一個加載活動,它在從我自己的 URL 獲取 MP3 文件時顯示加載 GIF。 當媒體播放器准備好后,我將它放入我的單例中,然后轉到意圖(以便我可以在這個新活動中使用該 MP3)。
問題是這很少順利並且通常長時間閑置(甚至沒有調用 onListener )
請幫忙。
package com.example.songguessapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent; import android.media.AudioAttributes;
import android.media.MediaPlayer; import android.os.Bundle; import
android.util.Log; import android.view.View; import
android.widget.Toast;
import java.io.IOException;
public class LoadingActivity extends AppCompatActivity {
SongGame game;
static public MediaPlayer mpTemp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_screen);
game = SongGame.getInstance();
String songCode = String.valueOf(game.getRound() + 1);
String url = "https://mp3stream.herokuapp.com/code=song" + songCode ;
final MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes
.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
try {
mediaPlayer.setDataSource(url);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this,e.toString(),Toast.LENGTH_LONG).show();
}
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
Log.d("1001","Song downloaded");
toGameScreen(mp)
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.d("1002","Error here");
return false;
}
});
}
public void toGameScreen(MediaPlayer mp) {
SongGame.getInstance().setMediaPlayer(mp);
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
}
}
編輯這里是我編輯的版本(終於工作了),但我不知道線程問題與我以前的工作有什么關系。
package com.example.songguessapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import java.io.IOException;
public class LoadingActivity extends AppCompatActivity {
SongGame game;
public MediaPlayer mpTemp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loading_screen);
// final MediaPlayer mediaPlayer = new MediaPlayer();
// mediaPlayer.setAudioAttributes(
// new AudioAttributes
// .Builder()
// .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
// .build());
// try {
// mediaPlayer.setDataSource(url);
//
// } catch (IOException e) {
// e.printStackTrace();
// Toast.makeText(this,e.toString(),Toast.LENGTH_LONG).show();
// }
// mediaPlayer.prepareAsync();
//
// mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mp) {
// toGameScreen(mp);
//
// }
// });
//
// mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
// @Override
// public boolean onError(MediaPlayer mp, int what, int extra) {
//
// return false;
// }
// });
new Thread(new Runnable() {
@Override
public void run() {
game = SongGame.getInstance();
String songCode = String.valueOf(game.getRound() + 1);
String url = "https://mp3stream.herokuapp.com/code=song" + songCode ;
final MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
new AudioAttributes
.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
try {
mediaPlayer.setDataSource(url);
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
toGameScreen(mediaPlayer)
}).start();
}
public void toGameScreen(MediaPlayer mp) {
SongGame.getInstance().setMediaPlayer(mp);
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
}
}
我對媒體播放沒有經驗,但您使用線程的解決方案提醒我,在 Android 中,您必須始終盡量不要阻塞UI 線程。 從這個鏈接https://developer.android.com/guide/topics/media/mediaplayer主要文檔:
原則上使用 MediaPlayer 可以很簡單。 但是,重要的是要記住,要將其與典型的 Android 應用程序正確集成,還需要做一些其他事情。 例如,對 prepare() 的調用可能需要很長時間才能執行,因為它可能涉及獲取和解碼媒體數據。 因此,對於任何可能需要很長時間執行的方法,您永遠不應該從應用程序的 UI 線程調用它。 . . . 為避免掛起 UI 線程,請生成另一個線程來准備 MediaPlayer 並在完成后通知主線程。
所以我的建議是嘗試在前台服務https://developer.android.com/guide/components/services上運行播放
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.