我也尝试过Runnable,但没有用。这是我的代码,这里可以做些什么? 我已经使用Parecelable方法将我当前选择的歌曲从主要活动中获取到此播放屏幕活动。现在我想将搜索栏附加到那个' currsong'我的媒体播放器mPlayer启动时收到了
package com.musicplayer;
import android.content.ContentUris;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.PowerManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.util.Random;
public class PlayScreen extends ActionBarActivity {
private Song currsong;
public MainActivity mainActivity;
private MediaPlayer mPlayer;
public TextView songTitle , songArtist;
public ImageView playPause, next, prev;
public SeekBar seekbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_screen);
currsong = (Song)getIntent().getParcelableExtra("currSong");
final RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.playScreen);
Drawable drawable=new BitmapDrawable(getResources(), currsong.getAlbumart(getApplicationContext()));
relativeLayout.setBackground(drawable);
songTitle=(TextView)findViewById(R.id.stitle);
songArtist=(TextView)findViewById(R.id.artist);
playPause= (ImageView)findViewById(R.id.playPause);
next= (ImageView)findViewById(R.id.next);
prev= (ImageView)findViewById(R.id.prev);
seekbar=(SeekBar)findViewById(R.id.progress);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer.isPlaying()){
mPlayer.stop();
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
mainActivity.songPos++;
currsong=mainActivity.songList.get(mainActivity.songPos);
Drawable drawable=new BitmapDrawable(getResources(), currsong.getAlbumart(getApplicationContext()));
relativeLayout.setBackground(drawable);
seekbar.setMax(mPlayer.getDuration());
playSong();
}
});
prev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer.isPlaying()){
mPlayer.stop();
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
mainActivity.songPos--;
currsong=mainActivity.songList.get(mainActivity.songPos);
Drawable drawable=new BitmapDrawable(getResources(), currsong.getAlbumart(getApplicationContext()));
relativeLayout.setBackground(drawable);
seekbar.setMax(mPlayer.getDuration());
playSong();
}
});
playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer.isPlaying() ){
mPlayer.pause();
playPause.setImageResource(R.drawable.play);
}
else {
mPlayer.start();
playPause.setImageResource(R.drawable.pause);
}
}
});
playSong();
}
public void playSong(){
mPlayer= new MediaPlayer();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
songTitle.setText(currsong.getTitle());
songArtist.setText(currsong.getArtist());
//set uri
Uri trackUri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,currsong.getID());
//set the data source
try{
mPlayer.setDataSource(getApplicationContext(), trackUri);
}
catch(Exception e){
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
}
//seekbar.setMax(mPlayer.getDuration());
mPlayer.start();
playPause.setImageResource(R.drawable.pause);
}
public void initMusicPlayer(){
//set player properties
mPlayer.setWakeMode(getApplicationContext(),
PowerManager.PARTIAL_WAKE_LOCK);
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mPlayer.setOnPreparedListener((MediaPlayer.OnPreparedListener) this);
mPlayer.setOnCompletionListener((MediaPlayer.OnCompletionListener) this);
mPlayer.setOnErrorListener((MediaPlayer.OnErrorListener) this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_play_screen, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
答案 0 :(得分:2)
经过大量搜索,我找到了一种方法来做到这一点,因为没有人回答这个问题所以为了帮助其他人解决同样的问题,我提供下面解决的java文件代码 -
package com.musicplayer;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.PowerManager;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.text.StaticLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.view.View.OnClickListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Random;
public class PlayScreen extends ActionBarActivity implements Runnable,
OnClickListener, OnSeekBarChangeListener, MediaPlayer.OnCompletionListener {
protected static Song currsong ;
protected TextView songTitle , songArtist;
protected ImageView playPause, next, prev, loop ,shuffle;
protected SeekBar seekbar;
protected RelativeLayout relativeLayout;
protected Uri trackpath;
protected static boolean looping=false, shuffling=false;
protected ArrayList<Song> shuffleSong;
protected MediaPlayerSingleton mPlayer = MediaPlayerSingleton.getInstance();
protected ArrayList<Song> songList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_play_screen);
currsong = (Song)getIntent().getParcelableExtra("currSong");
songList =new ArrayList<Song>();
Bundle b = this.getIntent().getExtras();
songList = b.getParcelableArrayList("categories");
relativeLayout = (RelativeLayout) findViewById(R.id.playScreen);
Drawable drawable=new BitmapDrawable(getResources(), currsong.getAlbumart(getApplicationContext()));
relativeLayout.setBackground(drawable);
songTitle=(TextView)findViewById(R.id.stitle);
songArtist=(TextView)findViewById(R.id.artist);
playPause= (ImageView)findViewById(R.id.playPause);
next= (ImageView)findViewById(R.id.next);
prev= (ImageView)findViewById(R.id.prev);
loop = (ImageView)findViewById(R.id.loop);
shuffle = (ImageView)findViewById(R.id.shuffle);
seekbar=(SeekBar)findViewById(R.id.progress);
next.setOnClickListener(this);
prev.setOnClickListener(this);
playPause.setOnClickListener(this);
loop.setOnClickListener(this);
shuffle.setOnClickListener(this);
seekbar.setOnSeekBarChangeListener(this);
seekbar.setEnabled(true);
loop.setImageResource(R.drawable.loop);
shuffle.setImageResource(R.drawable.shuffle);
shuffleSong = new ArrayList<Song>();
playSong();
}
public void getSongList() {
shuffleSong.addAll(songList);
Collections.shuffle(shuffleSong);
}
public void playSong(){
mPlayer.reset();
int minute = 60*1000;
Toast.makeText(getApplicationContext(), "Can't play this song: "+ currsong.getPath(), Toast.LENGTH_LONG).show();
mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
TextView totaltime =(TextView)findViewById(R.id.timeleft);
//set uri
Uri trackUri = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,currsong.getID());
trackpath=trackUri;
//set the data source
try{
mPlayer.setDataSource(getApplicationContext(), trackUri);
}
catch(Exception e){
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
Toast.makeText(getApplicationContext(), "Can't play this song: "+ currsong.getTitle(), Toast.LENGTH_LONG).show();
next.performClick();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Can't play this song: "+ currsong.getTitle(), Toast.LENGTH_LONG).show();
next.performClick();
}
songTitle.setText(currsong.getTitle());
songArtist.setText(currsong.getArtist());
seekbar.setMax(mPlayer.getDuration());
seekbar.setEnabled(true);
new Thread(this).start();
if(mPlayer.getDuration()<minute) {
totaltime.setText(String.format("0:%1$tS", new Date(mPlayer.getDuration()-60*1000*30)));
}else{
totaltime.setText(String.format("%1$tM:%1$tS", new Date(mPlayer.getDuration()-60*1000*30)));
}
mPlayer.start();
playPause.setImageResource(R.drawable.pause);
mPlayer.setOnCompletionListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_play_screen, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if (v.equals(playPause)){
if(mPlayer == null){
try{
mPlayer.setDataSource(getApplicationContext(), trackpath);
}
catch(Exception e){
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "You might not set the URI correctly!", Toast.LENGTH_LONG).show();
}
seekbar.setEnabled(true);
}
if (mPlayer.isPlaying()) {
mPlayer.pause();
playPause.setImageResource(R.drawable.play);
}
else {
mPlayer.start();
playPause.setImageResource(R.drawable.pause);
seekbar.setMax(mPlayer.getDuration());
new Thread(this).start();
}
}
if(v.equals(next) && mPlayer != null){
if(shuffling==false) {
if (mPlayer.isPlaying()) {
mPlayer.stop();
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
if (looping == true) {
if (AllSongs.songPos == songList.size() - 1) {
AllSongs.songPos = 0;
currsong = songList.get(AllSongs.songPos);
} else {
AllSongs.songPos++;
currsong = songList.get(AllSongs.songPos);
}
} else {
if (AllSongs.songPos == songList.size() - 1) {
Toast.makeText(getApplicationContext(), "List Ended", Toast.LENGTH_SHORT).show();
//currsong=mainActivity.songList.get(mainActivity.songPos);
} else {
AllSongs.songPos++;
currsong = songList.get(AllSongs.songPos);
}
}
}else{
if (mPlayer.isPlaying()) {
mPlayer.stop();
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
/*Random rand = new Random();
int randomNum = mainActivity.songPos;
while(randomNum==mainActivity.songPos) {
randomNum = rand.nextInt(shuffleSong.size());
}
currsong = shuffleSong.get(randomNum);
shuffleSong.remove(randomNum);*/
if (looping == true) {
if (AllSongs.songPos == shuffleSong.size() - 1) {
AllSongs.songPos = 0;
currsong = shuffleSong.get(AllSongs.songPos);
} else {
AllSongs.songPos++;
currsong = shuffleSong.get(AllSongs.songPos);
}
} else {
if (AllSongs.songPos == shuffleSong.size() - 1) {
Toast.makeText(getApplicationContext(), "List Ended", Toast.LENGTH_SHORT).show();
//currsong=mainActivity.songList.get(mainActivity.songPos);
} else {
AllSongs.songPos++;
currsong = shuffleSong.get(AllSongs.songPos);
}
}
}
Drawable drawable=new BitmapDrawable(getResources(), currsong.getAlbumart(getApplicationContext()));
relativeLayout.setBackground(drawable);
seekbar.setMax(mPlayer.getDuration());
seekbar.setProgress(0);
playSong();
}
if(v.equals(prev) && mPlayer != null){
if(shuffling==false) {
if(mPlayer.isPlaying()){
mPlayer.stop();
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
if (looping == true) {
if (AllSongs.songPos == 0) {
AllSongs.songPos = songList.size() - 1;
currsong = songList.get(AllSongs.songPos);
} else {
AllSongs.songPos--;
currsong = songList.get(AllSongs.songPos);
}
} else {
if (AllSongs.songPos == 0) {
Toast.makeText(getApplicationContext(), "List Ended", Toast.LENGTH_SHORT).show();
} else {
AllSongs.songPos--;
currsong = songList.get(AllSongs.songPos);
}
}
}else{
if (mPlayer.isPlaying()) {
mPlayer.stop();
try {
mPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
if (looping == true) {
if (AllSongs.songPos == 0) {
AllSongs.songPos = shuffleSong.size() - 1;
currsong = shuffleSong.get(AllSongs.songPos);
} else {
AllSongs.songPos--;
currsong = shuffleSong.get(AllSongs.songPos);
}
} else {
if (AllSongs.songPos == 0) {
Toast.makeText(getApplicationContext(), "List Ended", Toast.LENGTH_SHORT).show();
} else {
AllSongs.songPos--;
currsong = shuffleSong.get(AllSongs.songPos);
}
}
/*Random rand = new Random();
int randomNum = mainActivity.songPos;
while(randomNum==mainActivity.songPos) {
randomNum = rand.nextInt(shuffleSong.size());
}
currsong = shuffleSong.get(randomNum);
shuffleSong.remove(randomNum);*/
}
Drawable drawable=new BitmapDrawable(getResources(), currsong.getAlbumart(getApplicationContext()));
relativeLayout.setBackground(drawable);
seekbar.setMax(mPlayer.getDuration());
seekbar.setProgress(0);
playSong();
}
if(v.equals(loop)){
if(looping==false) {
loop.setImageResource(R.drawable.loopactive);
looping = true;
}
else{
looping=false;
loop.setImageResource(R.drawable.loop);
}
}
if(v.equals(shuffle)){
if(shuffling==false) {
getSongList();
shuffle.setImageResource(R.drawable.shuffleactive);
shuffling = true;
Collections.shuffle(shuffleSong);
//setNextSongDetails();
//shuffleList();
}else{
shuffleSong.clear();
shuffling=false;
shuffle.setImageResource(R.drawable.shuffle);
//setNextSongDetails();
}
}
}
/*private void shuffleList() {
for(int i=0;i<mainActivity.songList.size();i++){
Random rand = new Random();
int randomNum = rand.nextInt((mainActivity.songList.size() - i)) + i;
int j=0,k=0;
int flag=0;
k=mainActivity.posList.size();
for(j=0;j<k;j++){
if(MainActivity.posList.get(j) == randomNum){
flag=1;
}
//j=j+1;
}
if(flag==1){
i=i-1;
}else{
MainActivity.posList.add(new Integer(randomNum));
tempsong=MainActivity.songList.get(randomNum);
shuffleSong.add(new Song(tempsong.getID(), tempsong.getTitle(), tempsong.getArtist(), tempsong.getAlbumID()));
}
}
}*/
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
try {
if (mPlayer.isPlaying() || mPlayer != null) {
if (fromUser)
mPlayer.seekTo(progress);
} else if (mPlayer == null) {
Toast.makeText(getApplicationContext(), "Media is not running",
Toast.LENGTH_SHORT).show();
seekBar.setProgress(0);
}
} catch (Exception e) {
//Log.e("seek bar", "" + e);
seekBar.setEnabled(false);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
@Override
public void run() {
int currentPosition = mPlayer.getCurrentPosition();
int total = mPlayer.getDuration();
while (mPlayer != null && currentPosition < total) {
try {
Thread.sleep(1000);
currentPosition = mPlayer.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
seekbar.setProgress(currentPosition);
}
}
@Override
public void onCompletion(MediaPlayer mp) {
if(mPlayer.getCurrentPosition()>0){
mp.reset();
next.performClick();
}
}
}