使用蓝牙时,Android音乐会在睡眠模式下跳过
几天前我编写了一个简单的mp3播放器。代码在 当mp3播放器(三星3.6、安卓2.2)独立播放音乐时,一切正常。我买了一个蓝牙扬声器(A2DP 3.0)并将其连接到mp3播放器。音乐仍能正常播放,但当mp3播放器屏幕变暗进入睡眠模式时,蓝牙扬声器上的音乐开始跳跃使用蓝牙时,Android音乐会在睡眠模式下跳过,android,audio,bluetooth,skip,standby,Android,Audio,Bluetooth,Skip,Standby,几天前我编写了一个简单的mp3播放器。代码在 当mp3播放器(三星3.6、安卓2.2)独立播放音乐时,一切正常。我买了一个蓝牙扬声器(A2DP 3.0)并将其连接到mp3播放器。音乐仍能正常播放,但当mp3播放器屏幕变暗进入睡眠模式时,蓝牙扬声器上的音乐开始跳跃 如果mp3在睡眠模式下单独播放音乐,则不会发生这种情况 mp3播放器中的其他音乐播放器应用程序即使在睡眠模式下也能通过蓝牙扬声器正常播放 如果我禁用蓝牙,并使用通过电缆连接的扬声器播放音乐,则即使在待机状态下,音乐也能正常播放 这让
- 如果mp3在睡眠模式下单独播放音乐,则不会发生这种情况
- mp3播放器中的其他音乐播放器应用程序即使在睡眠模式下也能通过蓝牙扬声器正常播放
- 如果我禁用蓝牙,并使用通过电缆连接的扬声器播放音乐,则即使在待机状态下,音乐也能正常播放
public class MainActivity extends Activity {
private static String audioPath;
private static ArrayList<String> devotionalList;
private static ArrayList<String> christmasList;
private static ArrayList<String> cinemaList;
private static ImageButton playPauseButton;
private static TextView appMsg;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int maxVolume = audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
SeekBar volControl = (SeekBar) findViewById(R.id.volumeBar);
volControl.setMax(maxVolume);
volControl.setProgress(curVolume);
volControl
.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar arg0) {
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
}
@Override
public void onProgressChanged(SeekBar arg0, int arg1,
boolean arg2) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,
arg1, 0);
}
});
File baseDir = Environment.getExternalStorageDirectory();
audioPath = baseDir.getAbsolutePath() + "/external_sd/music/";
devotionalList = loadSongs(audioPath + "devotional/");
christmasList = loadSongs(audioPath + "christmas/");
cinemaList = loadSongs(audioPath + "cinema/");
}
private ArrayList<String> loadSongs(String songDirectory) {
File directory = new File(songDirectory);
ArrayList<String> al1 = new ArrayList<String>();
for (String filename : directory.list()) {
al1.add(songDirectory + filename);
}
return al1;
}
public void playPauseSong(View v) {
if (MP3PlayerService.isPlaying) {
playPauseButton.setImageResource(android.R.drawable.ic_media_play);
// Intent i1 = new Intent(this, MP3PlayerService.class);
stopService(new Intent(this, MP3PlayerService.class));
} else {
if (MP3PlayerService.playerStarted) {
playPauseButton
.setImageResource(android.R.drawable.ic_media_pause);
startService(new Intent(this, MP3PlayerService.class));
}
}
}
public void playNextSong(View v) {
if (MP3PlayerService.playerStarted) {
startService(new Intent(this, MP3PlayerService.class));
}
}
public void playPreviousSong(View v) {
if (MP3PlayerService.playerStarted) {
MP3PlayerService.previousSong = true;
startService(new Intent(this, MP3PlayerService.class));
}
}
@Override
protected void onPause() {
super.onPause();
playPauseButton = null;
appMsg = null;
}
@Override
protected void onResume() {
super.onResume();
appMsg = (TextView) this.findViewById(R.id.txtAppMsg);
appMsg.setText("");
playPauseButton = (ImageButton) this.findViewById(R.id.btnPlayPause);
}
public void playDevotional(View v) {
playPlayList(devotionalList);
}
public void playChristmas(View v) {
playPlayList(christmasList);
}
public void playCinema(View v) {
playPlayList(cinemaList);
}
private void playPlayList(ArrayList<String> playList) {
if (MP3PlayerService.isPlaying) {
MP3PlayerService.mediaPlayer.stop();
MP3PlayerService.mediaPlayer.reset();
MP3PlayerService.mediaPlayer.release();
}
MP3PlayerService.songPosition = 0;
playPauseButton.setImageResource(android.R.drawable.ic_media_pause);
Intent i1 = new Intent(this, MP3PlayerService.class);
i1.putExtra("playListChoice", playList);
startService(i1);
}
}
公共类MainActivity扩展活动{
专用静态字符串音频路径;
私有静态数组列表;
私有静态数组列表;
私有静态ArrayList电影列表;
专用静态图像按钮播放暂停按钮;
私有静态文本视图appMsg;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终AudioManager AudioManager=(AudioManager)getSystemService(Context.AUDIO_服务);
int maxVolume=audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int curVolume=audioManager.getStreamVolume(audioManager.STREAM_MUSIC);
SeekBar volControl=(SeekBar)findViewById(R.id.volumeBar);
volControl.setMax(最大音量);
volControl.setProgress(曲线体积);
volControl
.setOnSeekBarChangeListener(新的SeekBar.OnSeekBarChangeListener(){
@凌驾
TopTrackingTouch上的公共无效(请参见kbar arg0){
}
@凌驾
开始跟踪触摸时的公共无效(请参见kbar arg0){
}
@凌驾
已更改的公共void onProgressChanged(请参见kbar arg0、int arg1、,
布尔值(arg2){
audioManager.setStreamVolume(audioManager.STREAM_MUSIC,
arg1,0);
}
});
文件baseDir=Environment.getExternalStorageDirectory();
audioPath=baseDir.getAbsolutePath()+“/external_sd/music/”;
奉献列表=加载歌曲(音频路径+“奉献/”);
christmasList=loadSongs(audioPath+“圣诞节/”);
cinemaList=loadSongs(audioPath+“cinema/”);
}
私有ArrayList加载歌曲(字符串歌曲目录){
文件目录=新文件(songDirectory);
ArrayList al1=新的ArrayList();
用于(字符串文件名:directory.list()){
al1.add(歌曲目录+文件名);
}
返回al1;
}
公共空间播放暂停(视图五){
if(MP3PlayerService.isplay){
playPauseButton.setImageResource(android.R.drawable.ic_media_play);
//Intent i1=新Intent(这是MP3PlayerService.class);
stopService(新意图(此,MP3PlayerService.class));
}否则{
if(MP3PlayerService.playerStarted){
播放暂停按钮
.setImageResource(android.R.drawable.ic\u media\u pause);
startService(新意图(此,MP3PlayerService.class));
}
}
}
公共空间playNextSong(视图五){
if(MP3PlayerService.playerStarted){
startService(新意图(此,MP3PlayerService.class));
}
}
公共作废playPreviousSong(视图五){
if(MP3PlayerService.playerStarted){
MP3PlayerService.previousSong=true;
startService(新意图(此,MP3PlayerService.class));
}
}
@凌驾
受保护的void onPause(){
super.onPause();
playPauseButton=null;
appMsg=null;
}
@凌驾
受保护的void onResume(){
super.onResume();
appMsg=(TextView)this.findviewbyd(R.id.txtAppMsg);
appMsg.setText(“”);
playPauseButton=(ImageButton)this.findViewById(R.id.btnPlayPause);
}
公共虚空游戏奉献(视图五){
播放列表(奉献列表);
}
公众假期(视图五){
播放列表(圣诞节列表);
}
公共影院(视图五){
播放列表(电影列表);
}
专用void播放列表(ArrayList播放列表){
if(MP3PlayerService.isplay){
MP3PlayerService.mediaPlayer.stop();
MP3PlayerService.mediaPlayer.reset();
MP3PlayerService.mediaPlayer.release();
}
MP3PlayerService.songPosition=0;
playPauseButton.setImageResource(android.R.drawable.ic_media_pause);
Intent i1=新Intent(这是MP3PlayerService.class);
i1.putExtra(“播放选择”,播放列表);
startService(i1);
}
}
下面是我的mediaplayer服务代码:
public class MP3PlayerService extends Service implements OnCompletionListener {
private static ArrayList<String> al1;
private static FileInputStream fis;
private static FileDescriptor fd;
static boolean previousSong;
static boolean playerStarted = false;
static int songPosition;
static boolean isPlaying = false;
static String currentSong;
static ArrayList<String> songHistory;
static MediaPlayer mediaPlayer;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
songHistory = new ArrayList<String>();
}
@Override
public void onDestroy() {
songPosition = mediaPlayer.getCurrentPosition();
mediaPlayer.pause();
isPlaying = false;
}
@Override
public void onStart(Intent intent, int startid) {
if (songPosition == 0) {
Bundle extras = intent.getExtras();
if (extras == null) {
if (previousSong) {
playSong();
} else {
// Next Song Button clicked
playNextSong();
}
} else {
// A Playlist button is clicked
al1 = (ArrayList<String>) extras.get("playListChoice");
playSong();
}
} else {
songPosition = 0;
mediaPlayer.start();
}
isPlaying = true;
}
private void playNextSong() {
if (isPlaying) {
mediaPlayer.release();
playSong();
}
}
private void playSong() {
if (previousSong) {
mediaPlayer.release();
if (songHistory.size() > 1) {
currentSong = songHistory.get(songHistory.size() - 2);
songHistory.remove(songHistory.size() - 1);
} else {
currentSong = songHistory.get(0);
}
previousSong = false;
} else {
currentSong = al1.get(new Random().nextInt(al1.size()));
songHistory.add(currentSong);
}
try {
fis = new FileInputStream(currentSong);
fd = fis.getFD();
mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(fd);
mediaPlayer.prepare();
mediaPlayer.seekTo(songPosition);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.start();
playerStarted = true;
} catch (FileNotFoundException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
@Override
public void onCompletion(MediaPlayer arg0) {
playNextSong();
}
}
公共类MP3PlayerService扩展了CompletionListener上的服务实现{
私有静态数组列表al1;
私有静态文件输入流fis;
私有静态文件描述符fd;
静态布尔前一首歌;
静态布尔playerStarted=false;
静态位置;
静态布尔显示=false;
静态弦乐;
静态ArrayList歌曲史;
静态媒体播放器;
@凌驾
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
songHistory=新ArrayList();
}
@凌驾
公共空间{
songPosition=mediaPlayer.getCurrentPosition();
mediaPlayer.pause();
isplay=false;
}
@凌驾
公共无效启动(Intent Intent,int startid){
如果(songPosition==0){
Bundle extras=intent.getExtras();
如果(附加==null){
如果(上一首歌){
播放歌曲();
}否则{
//单击下一首歌曲按钮
playNextSong();
}
}否则{
//单击播放列表按钮
al1=(ArrayList)extras.get(“播放选择”);