簡體   English   中英

MediaPlayer緩沖速度下的Android API 23與Android API 25

[英]Android API 23 vs Android API 25 in MediaPlayer buffering speed

我在使MediaPlayer在API 23上正常工作時遇到一些問題。我已經在SAME WiFI網絡和/或蜂窩網絡上對此進行了測試,結果是相同的。 我正在使用MediaPlayer.prepareAsync()准備流。 我已經將調試器附加到onPreparedListener()並且它永遠不會運行。 請看下面的圖表。

來自Android API 25的圖表

Android API 25上的網絡使用情況

來自Android API 23的圖表 Android API 23上的網絡使用情況

Android Studio的“監視器”選項卡中有圖像。 .mp3文件大約10秒長。 就像您看到的那樣,Android API 23每2到3秒僅緩慢加載一小部分歌曲。

當Android API 25在2秒內立即加載時。

主要問題是無限花費很長的時間才能將歌曲加載到Android API 23上。有人遇到類似的問題並且知道如何解決嗎? 我的部分代碼將在下面的代碼示例中

public class CustomMediaPlayer implements MediaPlayer.OnPreparedListener {

private Context context;

private MediaPlayer mediaPlayer;
private boolean mediaPlayerReady;
private MaterialDialog loadingDialog;
private MaterialDialog playingDialog;
private TextView textTime;
private SeekBar seekBar;
private Handler handler;
private Runnable updateSongTime;

private String audioFileTitle;
private String audioFileUrl;
private int customPlayerView;


public CustomMediaPlayer(Context context) {
    this.context = context;
    this.mediaPlayerReady = false;
}

public void setSongName(String audioFileTitle) {
    this.audioFileTitle = audioFileTitle;
}

public void setSongUrl(String audioFileUrl) {
    this.audioFileUrl = audioFileUrl;
}

public void setCustomView(int customPlayerView) {
    this.customPlayerView = customPlayerView;
}

public void show() {
    PrepareDialogs();
    MediaPlayerCreate();
    HandlerRunnableCreate();
    MediaPlayerPrepare();
}

private void PrepareDialogs() {
    this.loadingDialog = new MaterialDialog.Builder(this.context)
            .title("Loading...")
            .content("Please wait")
            .progress(true, 0)
            .cancelable(true)
            .build();

    this.loadingDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
        @Override
        public void onCancel(DialogInterface dialog) {
            mediaPlayer.release();
            handler.removeCallbacks(updateSongTime);
            dialog.dismiss();
        }
    });

    this.playingDialog = new MaterialDialog.Builder(this.context)
            .title(this.audioFileTitle)
            .customView(this.customPlayerView, false)
            .neutralText("Close")
            .onNeutral(new MaterialDialog.SingleButtonCallback() {
                @Override
                public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                    mediaPlayer.release();
                    handler.removeCallbacks(updateSongTime);
                    dialog.dismiss();
                }
            })
            .cancelable(false)
            .build();

    this.playingDialog.getCustomView().findViewById(R.id.image_play_pause).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ImageView image = (ImageView) v;
            if(mediaPlayer.isPlaying()) {
                image.setImageResource(R.drawable.ic_play);
                mediaPlayer.pause();
            } else {
                image.setImageResource(R.drawable.ic_pause);
                mediaPlayer.start();
            }
            v = image;
        }
    });

    this.textTime = (TextView) this.playingDialog.getCustomView().findViewById(R.id.text_time);
    this.seekBar = (SeekBar) this.playingDialog.getCustomView().findViewById(R.id.seek_bar);

    this.seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            mediaPlayer.pause();
            handler.removeCallbacks(updateSongTime);
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mediaPlayer.seekTo(seekBar.getProgress());
            mediaPlayer.start();
            handler.postDelayed(updateSongTime, 100);
        }
    });
}

private void MediaPlayerCreate() {
    this.mediaPlayer = new MediaPlayer();
    this.mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    try {
        this.mediaPlayer.setDataSource(this.audioFileUrl);
        this.mediaPlayerReady = true;
    } catch(IOException e) {
        e.printStackTrace();
    }

    this.mediaPlayer.setOnPreparedListener(this);
}

private void HandlerRunnableCreate() {
    this.handler = new Handler();
    this.updateSongTime = new Runnable() {
        public void run() {
            try {
                if (mediaPlayer.isPlaying()) {
                    int startTime = mediaPlayer.getCurrentPosition();
                    seekBar.setProgress(startTime);
                    seekBar.setMax(mediaPlayer.getDuration());
                }
                handler.postDelayed(this, 100);
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }
    };
}

private void MediaPlayerPrepare() {
    if (this.mediaPlayerReady) {
        this.loadingDialog.show();
        this.mediaPlayer.prepareAsync();
    } else {
        Toast.makeText(this.context, "Media Player not ready", Toast.LENGTH_LONG).show();
    }
}

@Override
public void onPrepared(MediaPlayer mp) {
    loadingDialog.dismiss();
    mediaPlayer.start();
    playingDialog.show();
    handler.postDelayed(updateSongTime, 100);
}

}

經過HOURS的研究,我發現了這個問題,這對遇到此問題的任何人都非常有用。

我的文件URL如下所示: example.com/company example/files/audio.mp3 Android API 23及以下example.com/company example/files/audio.mp3的問題在於,這被視為無效的URL。 您的網址應類似於以下example.com/company%20example/files/audio.mp3一個簡單的解決方法是在String上使用replaceAll() ,如下所示:

String url = oldUrl.replaceAll(" ", "%20")

請注意,當您的網址無效時,Android完全不會給出任何錯誤。 因此,請確保您的URL不包含任何空格。

編輯在使用無效的URL之后,這是可行的方法:

URL url = new URL(oldURL);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String encodedUrl = uri.toASCIIString();

暫無
暫無

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

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