android檢測耳機
A. 請教android里怎麼判斷掃描到的藍牙設備是不是藍牙耳機
如果是在代碼中是無法判斷的,除非你們對接的藍牙耳機是有固定形號,或者只支持指定的藍牙型號就可以通過藍牙的getName來判斷, 通常情況下是不能知道設備是什麼的。
B. android 檢測耳機是否插入
當然,要加個許可權,不然一直是返回false。
<uses-permission android:name=android.permission.MODIFY_AUDIO_SETTINGS /
實時檢測耳機插入和拔出:
每當插入和拔出耳機時,
系統都會發送Intent廣播,這個由看手機打出的Log得知。
所以,只需要用一個receiver把這個廣播intent(獲取的action是:android.intent.action.HEADSET_PLUG)截獲就好。
C. android 怎麼判斷連接了那個藍牙耳機
ba = BluetoothAdapter.getDefaultAdapter();// int isBlueCon;//藍牙適配器是否存在,即是否發生了錯誤 if (ba == null){// isBlueCon = -1; //error return -1; } else if(ba.isEnabled()) { int a2dp = ba.getProfileConnectionState(BluetoothProfile.A2DP); //可操控藍牙設備,如帶播放暫停功能的藍牙耳機 int headset = ba.getProfileConnectionState(BluetoothProfile.HEADSET); //藍牙頭戴式耳機,支持語音輸入輸出 int health = ba.getProfileConnectionState(BluetoothProfile.HEALTH); //藍牙穿戴式設備
D. 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。
E. android系統檢測不到耳機
重新刷系統,系統有問題了。
F. android檢測用戶是否插了耳機
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 開始我追了好久的源碼。發現了實時檢測耳機插入和拔出的過程,不過對我的需求來說幫助不是很大。在Android下實現檢測耳機插入和拔出,也即建立一個Broadcast Receiver,監聽「android.intent.action.HEADSET_PLUG」廣播但直接在AndroidManifest.xml中添加一個<receiver>標簽是無效的,如:<receiver android:name=".HeadsetPlugReceiver"> <intent-filter> <action android:name="android.intent.action.HEADSET_PLUG" android:enabled="true"></action> </intent-filter> </receiver> 你會發現Receiver的onReceive事件永遠不會被觸發,解決方法就是手動編寫代碼注冊該廣播。首先,創建一個BroadcastReceiver的子類,用於監聽耳機插入和拔出:public class HeadsetPlugReceiver extends BroadcastReceiver { private static final String TAG = "HeadsetPlugReceiver"; @Override public void onReceive(Context context, Intent intent) { if (intent.hasExtra("state")){ if (intent.getIntExtra("state", 0) == 0){ Toast.makeText(context, "headset not connected", Toast.LENGTH_LONG).show(); } else if (intent.getIntExtra("state", 0) == 1){ Toast.makeText(context, "headset connected", Toast.LENGTH_LONG).show(); } } } } 然後,在需要監聽該事件的Activity中的onCreate()中注冊監聽該廣播,同時不要忘記在onDestroy()中注銷監聽該廣播: public class TestHeadSetPlugActivity extends Activity { private HeadsetPlugReceiver headsetPlugReceiver; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* register receiver */ registerHeadsetPlugReceiver(); } private void registerHeadsetPlugReceiver() { headsetPlugReceiver = new HeadsetPlugReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.intent.action.HEADSET_PLUG"); registerReceiver(headsetPlugReceiver, intentFilter); } @Override public void onDestroy() { unregisterReceiver(headsetPlugReceiver); super.onDestroy(); } } 如上這樣就可以實現檢測耳機插入和拔出了。
G. 三星更新android6.0為什麼不顯示耳機
1.檢查耳機是否插入到底
2.重新插拔耳機嘗試
3.重新啟動手機
4.是否使用原裝耳機,如果不是,請更換原裝耳機測試。若問題依舊,建議您將耳機連同手機送至就近的三星服務中心進行檢測維修。
H. android 檢測耳機是不是插入
int deviceType = device.getBluetoothClass().getMajorDeviceClass(); 不同設備類型該值不同,比如computer藍牙為256、phone 藍牙為512、列印機藍牙為1536等等。
I. 請教android里怎麼判斷掃描到的藍牙設備是不是藍牙耳機
到手機的藍牙設備列表裡面,找到你想確認的藍牙設備,首先要配對。
配對不成功什麼也別提。
配對成功以後,到這個設備的屬性裡面去看,如果是藍牙耳機,至少應該包括類似「媒體音頻」(不同廠商名字可能略有不同)這樣的選項。
如果是可以通話的耳機,應該還具備「手機音頻」(不同廠商名字可能略有不同)這樣的選項。
J. Android如何判斷耳機插入
android系統自帶有能捕獲耳機插入拔出的ACTION , Intent.ACTION_HEADSET_PLUG。
你寫一個廣播接收器捕獲這個action就可以了,注意區分插入和拔出。