簡體   English   中英

Android mediaPlayer服務無法正常運作

[英]Android mediaPlayer service not working

我正在嘗試播放2種聲音中的1種(正確的.mp3或不正確的.mp3),這些聲音存儲在我的資產文件夾中。 這是我的服務代碼:

public class MinesweeperSound extends Service {

    MediaPlayer player;

    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            String audioFile = null;
            audioFile = intent.getStringExtra("filename");
            AssetFileDescriptor afd = getAssets().openFd(audioFile);
            player = new MediaPlayer();
            player.setDataSource(afd.getFileDescriptor());
            player.prepare();
            player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mediaPlayer.start();
                }
            });
            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    mediaPlayer.release();
                }
            });
        }catch (IOException e){
            e.printStackTrace();
        }
        return Service.START_STICKY;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

這是我在“活動”中的稱呼:

Intent correctIntent = new Intent(getApplicationContext(), MinesweeperSound.class);
                    correctIntent.putExtra("filename", "correct.mp3");
                    startService(correctIntent);

由於某種原因,它沒有播放任何聲音,任何幫助都很好,謝謝

您應該在調用prepare之前設置prepare監聽器

  player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { mediaPlayer.start(); } });
    player.prepare();

MediaPlayer.prepare()是一種同步方法。 如果使用它,則不需要onPrepareListener。

否則使用

prepareAsync() 

代替

prepare()

我終於弄明白了。 我需要將參數添加到.setDataSource方法。 這是工作代碼:

MediaPlayer player = null;

    public int onStartCommand(Intent intent, int flags, int startId){
        try {
            String audioFile = null;
            audioFile = intent.getStringExtra(PowerUpUtils.MINESWEEPER_TILE_RESULT);
            AssetFileDescriptor afd = getBaseContext().getAssets().openFd(audioFile);
            player = new MediaPlayer();
            player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
            player.prepare();
        }catch (IOException e){
            e.printStackTrace();
        }
        player.start();
        return Service.START_STICKY;
    }

同樣,在try-catch塊之后調用start()似乎是修復的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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