Android BroadcastReceiver中播放提示语音有时失效问题
16lz
2021-01-22
AndroidBroadcastReceiver 千万不要做耗时的操作,如果有耗时的操作,请让OnReceive 中调用service。
@Override
public void onReceive(Context context, Intent intent) {
try {
afd = assetManager.openFd("notify.wav");
mAm.requestAudioFocus(null,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN);
MediaPlayer player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
player.prepare();
player.start();
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
mAm.abandonAudioFocus(null);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
接到订单播放提示语音,发现有时候不能播放出来!!
后来改写到service中
@Overridepublic int onStartCommand(Intent intent, int flags, int startId) { AssetManager assetManager = getApplicationContext().getAssets(); AssetFileDescriptor afd = null; try { afd = assetManager.openFd("notify.wav"); mAm.requestAudioFocus(null,AudioManager.STREAM_MUSIC,AudioManager.AUDIOFOCUS_GAIN); MediaPlayer player = new MediaPlayer(); player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength()); player.prepare(); player.start(); player.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){ @Override public void onCompletion(MediaPlayer mp) { mAm.abandonAudioFocus(null); } }); } catch (IOException e) { e.printStackTrace(); } return START_STICKY;
然后在Onreceive 中调用service
Toast.makeText(context, "收到了通知", Toast.LENGTH_SHORT).show();Intent serviceIntent = new Intent(context, PlayMediaService.class);context.startService(serviceIntent);
更多相关文章
- Android中的内存储、外存储概念、文件操作与PC端的有些不同
- 如何为sqlite操作构建更有效的设计
- javascript 操作流——回调的回调
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- JAVA实现二进制和16进制之间的互相转换,8进制同理,附带异或操作实
- 使用js模仿java的实体类对类/对象进行get操作
- java中jcom操作excel
- Java操作Sqlite数据库
- java入门---数据结构操作实例之获取链表的元素