2017-09-13 9 views
0

MediaPlayer가 API 23에서 제대로 작동하도록하는 데 문제가 있습니다. 동일한 WiFI 네트워크 및/또는 셀룰러 네트워크에서이를 테스트했으며 그 결과는 같습니다. 내 스트림을 준비하려면 MediaPlayer.prepareAsync()을 사용하고 있습니다. onPreparedListener()에 디버거를 연결했는데 절대로 실행되지 않습니다. 아래의 그래프를보십시오. 안드로이드 API에 안드로이드 API 25안드로이드 API 23 대 안드로이드 API 25 in MediaPlayer 버퍼링 속도

Graph from Android API 23 네트워크 사용에 대한

Graph from Android API 25

네트워크 사용량이 23

안드로이드 스튜디오에서 모니터 탭에서 이미지가 있습니다. .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); 
} 

} 

답변

0

연구 시간이 지나면이 문제를 발견 한 사람에게이 질문을 알리는 데 매우 유용합니다.

내 파일 URL은 다음과 같습니다. example.com/company example/files/audio.mp3 Android API 23 이하의 문제는이 URL이 잘못된 URL로 간주된다는 것입니다. 귀하의 URL이 example.com/company%20example/files/audio.mp3 쉽게 수정 같이해야 할 것은이 같은 StringreplaceAll()를 사용하는 것입니다 : 당신의 URL가 무효 인 반면 안드로이드는 전혀 오류를 제공하지 않습니다

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

하는 것으로. 따라서 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(); 
:

편집 유효하지 않은 URL의이 더 많은 작업 후 길을 가야하는 것입니다