⑴ android 游戲用service 服務加背景音樂,如何監聽HOME事件
你捕捉用戶按下home鍵時service暫停播放咯,其實我也不知道,我不是做游戲的=。=
⑵ android 音頻透傳狀態監聽
hxnxnxnxj
⑶ 判斷android後台是否正在播放音樂
看看任務管理器,播放器有沒有在後台運行
⑷ android里音樂沒播放怎麼也調用setoncompletionlistener
1.對於控制研究媒體播放器,通過本地服務打,不如送媒體播放器參考其他類一樣CarefulMediaPlayer(MP,這一點);你在處理此類播放器的屬性。我認為它幫助你。 謝謝
2.我為這個問題掙扎,最後我得到了它的工作班以下。這個想法是一個線程與活套,剩下活著,並處理所有的MediaPlayer的邏輯。 我只退出尺蠖和清理線程,如果服務接收到的明確
{
privatestaticPowerManager.WakeLockwakeLock;
privatestaticfinalStringTAG="PlayService";
privatestaticStringLOCK_NAME=TAG;
publicstaticfinalStringEXTRA_FILE="file";
publicstaticfinalStringACTION_PLAY="play";
_STOP="stop";
publicstaticfinalintMSG_START=1;
publicstaticfinalintMSG_STOP=2;
publicPlayService(Stringname){
super(name);
}
publicPlayService(){
super("PlayService");
}
@Override
publicvoidonCreate(){
super.onCreate();
}
@Override
protectedvoidonHandleIntent(Intentintent){
Messagemsg=newMessage();
if(ACTION_PLAY.equalsIgnoreCase(intent.getAction())){
StringfileName=intent.getExtras().getString(EXTRA_FILE);
msg.what=MSG_START;
msg.obj=fileName;
}elseif(ACTION_STOP.equalsIgnoreCase(intent.getAction())){
msg.what=MSG_STOP;
}
try{
PlayMediaThread.getInstance(this).sendMessage(msg);
}catch(InterruptedExceptione){
Log.e(TAG,e.getMessage());
}
}
publicstaticPowerManager.WakeLockacquireLock(Contextcontext){
if(wakeLock==null||!wakeLock.isHeld()){
PowerManagerpowerManager=(PowerManager)context
.getSystemService(Context.POWER_SERVICE);
wakeLock=powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
LOCK_NAME);
wakeLock.setReferenceCounted(true);
wakeLock.acquire();
}
returnwakeLock;
}
publicstaticvoidreleaseLock(Contextcontext){
if(wakeLock!=null&&wakeLock.isHeld()){
wakeLock.release();
}
}
}
,
OnErrorListener,OnPreparedListener{
=newSemaphore(0);
privatestaticHandlerhandler;
privatestaticLoopermyLooper;
privatestaticContextcontext;
;
;
;
privatestaticfinalStringTAG="PlayMediaThread";
privatePlayMediaThread(Contextcontext)throwsInterruptedException{
super(TAG);
PlayMediaThread.context=context;
start();
//
//instance
semaphore.acquire();
}
(Contextcontext)
throwsInterruptedException{
if(instance==null){
instance=newPlayMediaThread(context);
}
PlayMediaThread.context=context;
returninstance;
}
publicvoidsendMessage(Messagemsg){
handler.sendMessage(msg);
}
publicvoidquitLooper(){
try{
if(myLooper!=null){
myLooper.quit();
Log.i(TAG,"Afterquit");
}
}catch(Exceptionex){
Log.e(TAG,ex.getMessage());
}
}
@Override
publicvoidrun(){
Looper.prepare();
myLooper=Looper.myLooper();
handler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==PlayService.MSG_START){
startPlayer((String)msg.obj);
}elseif(msg.what==PlayService.MSG_STOP){
//.e.user
//explicitlyclickedstop,Iquitthelooperand
//cleanthethread
stopPlayer(true);
}
}
};
semaphore.release();
Log.i(TAG,"BeforeLoop");
Looper.loop();
}
privatevoidstopPlayer(booleanclean){
if(player!=null){
if(player.isPlaying()){
player.stop();
}
player.release();
player=null;
}
if(clean){
PlayService.releaseLock(context);
quitLooper();
instance=null;
}
}
privatevoidstartPlayer(StringfileName){
if(player!=null&&player.isPlaying()&¤tFileName!=null
&¤tFileName.equalsIgnoreCase(fileName)){
return;
}
currentFileName=fileName;
stopPlayer(false);
player=newMediaPlayer();
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
player.setOnPreparedListener(this);
try{
player.setDataSource(context,Uri.parse(currentFileName));
player.prepare();
player.start();
PlayService.acquireLock(context);
}catch(Exceptione){
Log.e(TAG,e.getMessage());
}
}
@Override
publicbooleanonError(MediaPlayermp,intarg1,intarg2){
Log.e(TAG,"onError");
stopPlayer(true);
returnfalse;
}
@Override
publicvoidonCompletion(MediaPlayermp){
Log.d(TAG,"onCompletion");
//
stopPlayer(true);
}
@Override
publicvoidonPrepared(MediaPlayermp){
Log.d(TAG,"onPrepared");
}
}
⑸ android怎麼監聽音量變化
大概就來是這樣自, 可能會有點語法錯誤
(mediaReceiver ); // later somewhere in activity.MediaButton_Receiver mediaReceiver = new MediaButton_Receiver();class MediaButton_Receiver implements BroadcastReceiver { void onReceive(Intent intent) { KeyEvent ke = (KeyEvent)intent.getExtra(Intent.EXTRA_KEY_EVENT); if (ke .getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { } // Similarly other key codes ....... } }
⑹ Android-Android中怎麼播放背景音樂而不會中斷
Android中有個AudioFocus的概念,你可以為Music去監聽AudioFocus。
這個問題一下子說不清楚,建議先看下http //developer android com/training/managing-audio/audio-focus.html,這裡面介紹了一些Audio focus的基本概念。希望對你有幫助!
補充一下:
(1)在Call Play之前要獲取Audio Focus
mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
(2)具體AudioFocus Listener的實現
private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
// AudioFocus is a new feature: focus updates are made verbose on purpose
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
Log.v(TAG, "AudioFocus: received AUDIOFOCUS_LOSS");
if(mLocalPlayer.isPlaying()) {
mLocalPlayer.pause();
}
if (mMediaplayerHandler != null && mMediaplayerHandler.hasMessages(FADEIN)) {
mMediaplayerHandler.removeMessages(FADEIN);
mPlayer.setVolume(1.0f);
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
Log.v(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT");
if(mLocalPlayer.isPlaying()) {
mLocalPlayer.pause();
}
if (mMediaplayerHandler != null && mMediaplayerHandler.hasMessages(FADEIN)) {
mMediaplayerHandler.removeMessages(FADEIN);
mPlayer.setVolume(1.0f);
}
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
Log.v(TAG, "AudioFocus: received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
if(mLocalPlayer.isPlaying()) {
mPlayer.setVolume(0.0f);
Log.d(TAG, "Mute since received AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
}
break;
case AudioManager.AUDIOFOCUS_GAIN:
Log.v(TAG, "AudioFocus: received AUDIOFOCUS_GAIN");
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
boolean isPhoneHook = false;
if (tm != null) {
isPhoneHook = (tm.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK);
}
if(!mLocalPlayer.isPlaying() && mPausedByTransientLossOfFocus) {
mPausedByTransientLossOfFocus = false;
if (!isPhoneHook) {
startAndFadeIn();
}
} else if () {
= false;
if (!isPhoneHook) {
mPlayer.setVolume(1.0f);
}
Log.d(TAG, "Unmute since received AUDIOFOCUS_GAIN");
}
break;
default:
Log.e(TAG, "Unknown audio focus change code");
}
}
};
(3)在Activity OnDestory的時候釋放AudioFocus.
mAudioManager.abandonAudioFocus(mAudioFocusListener);
(4)這只是一個簡單的Main Thread實現的例子,真正的做Music是要在Service裡面實現的,你自己試試看吧
⑺ android中怎麼樣能獲取正在播放的音樂名
android獲取正在播放的音樂文件信息的方法為:
1、就是判斷當前是否有音樂正在播放。
[java]
/** Checks whether any music is active. */
isMusicActive()
通過這個介面就可以判斷當前系統是否有音樂在播放了。
2、還有一個問題,如果在音樂一開始就已經播放的時候,就知道這個事件,以便進行特殊的處理。
3、再進一步看一下 AudioManager 的源碼,發現其中有如下方法:
[java]
/**
* Request audio focus.
* Send a request to obtain the audio focus
* @param l the listener to be notified of audio focus changes
* @param streamType the main audio stream type affected by the focus request
* @param rationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request
* is temporary, and focus will be abandonned shortly. Examples of transient requests are
* for the playback of driving directions, or notifications sounds.
* Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for
* the previous focus owner to keep playing if it cks its audio output.
* Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown ration such
* as the playback of a song or a video.
* @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
*/
public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int rationHint)
從字面意思來看:請求音頻焦點,再看這個函數的返回值:
[java]
/**
* A failed focus change request.
*/
public static final int AUDIOFOCUS_REQUEST_FAILED = 0;
/**
* A successful focus change request.
*/
public static final int AUDIOFOCUS_REQUEST_GRANTED = 1;
這個函數可能有幫助,進一步查一下Google官方的幫助:http://developer.android.com/training/managing-audio/audio-focus.html
Managing Audio Focus
With multiple apps potentially playing audio it's important to think about how they should interact. To avoid every music app playing at the same time, Android uses audio focus to moderate audio playback—only apps that hold the audio focus should play audio.
Before your app starts playing audio it should request—and receive—the audio focus. Likewise, it should know how to listen for a loss of audio focus and respond appropriately when that happens.
簡單地翻譯一下:
管理音頻焦點
多個應用都在播放音頻的可能性,所以考慮應用間如何交互非常重要。為避免每個音樂應用同時播放,Android使用音頻焦點來協調音頻的播放----只有獲取到音頻焦點的應用可以播放音頻。
在應用開始播放音頻之前,它應該先請求--並接收音頻焦點。同樣,它也應該知道當監聽到失去音頻焦點後如何合理地進行響應。
沿著這個路應該是對的,寫了下面的測試代碼進行驗證。這個主要是Service的實現,還需要實現一個Activity去啟動Service、結束Service:
[java]
package com.example.servicetest;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.media.AudioManager.OnAudioFocusChangeListener;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MainService extends Service
{
private static final String TAG = "MainService";
private MediaPlayer player;
private AudioManager mAm;
private MyOnAudioFocusChangeListener mListener;
@Override
public void onCreate()
{
Log.i(TAG, "onCreate");
player = MediaPlayer.create(this, R.raw.test); // 在res目錄下新建raw目錄,復制一個test.mp3文件到此目錄下。
player.setLooping(false);
mAm = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
mListener = new MyOnAudioFocusChangeListener();
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
@Override
public void onStart(Intent intent, int startid)
{
Toast.makeText(this, "My Service Start", Toast.LENGTH_LONG).show();
Log.i(TAG, "onStart");
// Request audio focus for playback
int result = mAm.requestAudioFocus(mListener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
{
Log.i(TAG, "requestAudioFocus successfully.");
// Start playback.
player.start();
⑻ Android怎樣監聽藍牙耳機的按鍵事件
其實對於Android系統,每次按鍵只會有一個唯一「鍵值」響應,使用起來感覺會模模糊糊的,但是其實對於系統來說是很清晰的。
AVRCP全稱(Audio/VideoRemoteControlProfile),是藍牙協議中的一個profile。從名字上就可以看出主要應用於Audio/Video控制。每個按鍵並不是獨立的,上-曲/下一曲是在正在播放音樂的時候才會有效,即才會向Android發送「鍵值」。
基於按鍵從Linux到Android分析具體對於的鍵值:
Linux掃描碼功能映射字串Android鍵值
00c8200 開始放音樂MEDIA_PLAYKEYCODE_MEDIA_PLAY
00c9201 停止放音樂MEDIA_PAUSEKEYCODE_MEDIA_PAUSE
00a3163 下一曲MEDIA_NEXTKEYCODE_MEDIA_NEXT
00a5165 上-曲MEDIA_PREVIOUSKEYCODE_MEDIA_PREVIOUS
Android應用代碼,完整測試應用:TeskKey。
總結:1號鍵會交替發送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE;2/3號鍵會在播放音樂時分別發送KEYCODE_MEDIA_PREVIOUS/.KEYCODE_MEDIA_NEXT。如果想要把藍牙耳機上的按鍵利用起來,可以在接收到KEYCODE_MEDIA_PLAY時播放無聲音樂以使能2/3號鍵。這樣就能完整接收3種鍵值了自行控制了。這個具體自行設計(測試代碼已經更新包含了)。
註:這種實現並不一定通用,比如我在深度定製的MIUI中測試,盡管啟動的TestKey應用,系統自帶的音樂播放器仍然能同時響應鍵值。
更新:
已經更新TestKey源碼,添加對藍牙耳機按鍵的監聽,實現方法就是上述中推測的方法,已經成功驗證過了。播放音樂參考《Android多媒體開發--資源文件播放》。效果圖:
問與答
1.這個只能在播放音樂的狀態下才能監聽到么?
答:根據上述的原理,這些按鍵也僅僅是應用在控制媒體時使用;且根據實際驗證沒有播放音樂時藍牙耳機的2/3號鍵是並沒有向Android設備發送鍵值(從底層Linux來看)。綜上所述,需要通過播放音樂來實現激活其向Android設備發送鍵值,針對這種情況可以播放一個「沒有聲音」的音樂文件來實現,這樣既可以監聽到2/3號鍵又可以不影響其它聲音的輸出。可以在前台時播放音樂,後台停止播放。
2.我現在主要是想監聽得到開關鍵(1號鍵)。 在做一個按下藍牙開關鍵後啟動一個語音識別的功能?
答:在我的測試條件下,1號鍵是可以正常監聽到的。1號鍵會交替發送KEYCODE_MEDIA_PLAY/KEYCODE_MEDIA_PAUSE鍵值。這個鍵不需要模擬播放音樂就可以正常的監聽到。
3.4號按鍵的監聽方法
答:所謂的4號按鍵,也就是指本文中的所測試型號的藍牙耳機上並沒有,但有可能其它型號的藍牙耳機上有。我沒有辦法測試驗證,所以這里就簡單敘述一下「新按鍵」的鍵值確定思路:1.先使用TestKey測試應用測試按鍵,測試Android上層是否可以得到對應鍵值。2.如果沒有得到,那麼就使用adbshellgetevent來看Linux底層可以不可以得到鍵值。然後根據按鍵從Linux到Android來確定Android上層使用的鍵值碼到底是多少。(當然,如果你實在不知道如何監聽,把藍牙耳機寄給我,我給你確定也行。:))
註:其實上述文章完全是根據按鍵從Linux到Android測試確定下來的。那是篇文章是剝開Android外殼來看「按鍵」事件的流程的,方法適用於所有輸入事件:各種按鍵/觸摸/物理鍵盤/滑鼠等待輸入設備。沒有一定的Linux開發經驗很難看懂和理解。
4.Android後台監聽按鍵怎麼實現
或:如何啟動一次應用後在後台一直監聽播放鍵因為有這樣一個場景在用戶開車的時候需按一下開關鍵就啟動語音識別的功能。
這個問題其實已經超出了本文討論的范圍,是Android系統對應用層的鍵盤事件(按鍵)的分發的問題了。正常情況下,按鍵只會向當前最端的應用分發鍵盤事件,也就是說在後台你邊音量鍵都監聽不了。
但是既然這種情況(後台應用監聽按鍵)的需求存在,那麼就一定有它存在的道理。比如「相機鍵」,按下後直接調出相機到最前台。從表面上看是相機響應了按鍵,但是從實現方法上來看,並不是通過鍵值來操作,必須通過其它方法,比如廣播或者其它等等。
明白了其中的道理後,那麼想要實現就好辦了。先看這個按鍵有沒有廣播,如要有接聽系統中發出來的廣播;如果沒有那麼對於定製系統可以自己在系統中添加一個廣播;總之,正常渠道是沒有辦法在後台監聽一些不應該是你監聽到的按鍵的。
更:查了一下,這個按鍵是有廣播的。這樣就可以後台響應了(不需要C/不需要root)。例子我就不試了,見Android官方例子RandomMusicPlayer。
其中的重點是這個廣播android.intent.action.MEDIA_BUTTON。
⑼ 安卓音樂播放器耳機監聽怎麼解決在息屏或離開activity後無效的問題
不管別人是怎麼做的,反正我是在息屏的時候循環播放一個沒有聲音的音頻文件,然後 onresume的時候關掉這個音頻文件
⑽ android怎樣監聽聲音的變化
大概就復是這制樣, 可能會有點語法錯誤 (mediaReceiver ); // later somewhere in activity.MediaButton_Receiver mediaReceiver = new MediaButton_Receiver();class MediaButton_Receiver implements BroadcastR.