簡體   English   中英

從 URL 流媒體播放器然后傳遞給另一個活動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM