我需要在我的应用程序中连接我SeekBar的MediaPlayer。
我通过 xml 设置了 SeekBar,如下所示:
<SeekBar
android:id="@+id/song_seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"/>
Run Code Online (Sandbox Code Playgroud)
并按照这个SO 答案来实现它。
这是我的代码:
public class Song_main extends AppCompatActivity {
private final int SONG_REQUEST_CODE = 1;
private Uri song;
private TextView selectSong;
private SeekBar seekBar;
private Handler handler;
private MediaPlayer mediaPlayer;
private boolean repeatPressedTwice = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.app_bar_song_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.song_main_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
seekBar = (SeekBar) findViewById(R.id.song_seekbar);
handler = new Handler();
notSelected();
}
@Override
public boolean onCreateOptionsMenu(Menu …Run Code Online (Sandbox Code Playgroud) 我有一个MediaPlayer,它包含在一个自定义的ViewHolder中,由一个由Fragment运行的RecyclerViewAdapter创建.我试图每秒更新一次搜索栏,以显示MediaPlayer正在播放的音频的进度,使用这个问题的答案:
private Handler mHandler = new Handler();
//Make sure you update Seekbar on UI thread
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if(mMediaPlayer != null){
int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;
mSeekBar.setProgress(mCurrentPosition);
}
mHandler.postDelayed(this, 1000);
}
});
Run Code Online (Sandbox Code Playgroud)
但是,由于我是从一个片段中的一个适配器中运行它而不是直接在一个活动中运行它,我不能使用这一行:
MainActivity.this.runOnUiThread(new Runnable() {
Run Code Online (Sandbox Code Playgroud)
因此,我已经getActivity()使用适配器的构造函数从片段传递到RecyclerViewAdapter并将其设置为全局变量parentActivity.
然后我创建了代码来更新RecyclerViewAdapter的onBindViewHolder()中的搜索条,如下所示:
final Handler mHandler = new Handler();
this.parentActivity.runOnUiThread(new Runnable(){
@Override
public void run(){
if (mMediaPlayer != null){
int mCurrentPosition = mMediaPlayer.getCurrentPosition();
myViewHolder.seekBar.setProgress(mCurrentPosition);
}
mHandler.postDelayed(this, 1000);
}
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,现在当我播放音频时,虽然搜索栏正确更新,但音频会暂停或每秒"跳过".可能导致这种情况的原因以及如何解决?
编辑:每个ViewHolder都有自己的SeekBar,并mMediaPlayer在Adapter中定义为全局变量.
我正在开发一个媒体播放器应用程序.我正在尝试将其同步到搜索栏,以便在播放媒体时搜索栏自动进行.这是我的源代码:
public class MusicDroid extends ListActivity implements
SeekBar.OnSeekBarChangeListener, Runnable {
private int cur_time = 0;
private SeekBar seekbar;
int song_dur = 0;
GroveService gs;
public Chronometer timer;
int timer_time = 0;
@Override
public void onCreate(Bundle icicle) {
try {
super.onCreate(icicle);
setContentView(R.layout.songlist);
gs = new GroveService();
gs.updateSongList();
} catch (NullPointerException e) {
Log.v(getString(R.string.app_name), e.getMessage());
}
seekbar = (SeekBar) findViewById(R.id.SeekBar01);
timer = (Chronometer) findViewById(R.id.Chronometer01);
seekbar.setOnSeekBarChangeListener(this);
// this.bindService(new Intent(this, GroveService.class), conn,
// Context.BIND_AUTO_CREATE);
ArrayAdapter<String> songList = new ArrayAdapter<String>(this,
R.layout.song_item, gs.songs);
setListAdapter(songList);
timer.setOnChronometerTickListener(new OnChronometerTickListener() …Run Code Online (Sandbox Code Playgroud) 我可以使用 android 媒体播放器来播放音频文件。我可以显示进度条和附加的 2 个按钮来暂停和播放音轨。我的问题是我无法使用进度条控制轨道。我想播放音轨以根据我将进度条拖动到的位置进行更新。
下面是我的代码
public class MyMediaPlayerView extends AppCompatActivity implements View.OnClickListener {
/**
* var for controller
* restore timestamp today 12:11
*/
SeekBar seek_bar;
Button play_button, pause_button;
MediaPlayer player;
TextView text_shown;
Handler seekHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launch_webview);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getInit();
seekUpdation();
}
Runnable run = new Runnable() {
@Override public void run() {
seekUpdation();
}
};
public void seekUpdation() {
seek_bar.setProgress(player.getCurrentPosition());
seekHandler.postDelayed(run, 1000);
onProgressChanged(seek_bar, seek_bar.getProgress());
}
@Override
public void onClick(View view) …Run Code Online (Sandbox Code Playgroud)