1. android智能機如何做電視遙控器
如果您想通過手機遙控電視,三星部分手機如S4、S5、Note3等支持WatchON功能,可以用來遙控電視。
如果您需要使用WatchON智能遙控功能,請按以下方法操作:
1.創建智能遙控需要互聯網支持,請您開啟無線網路(或移動數據)。
2.設置方法:應用程序-智能遙控(WatchON)-同意服務條款-選擇國家-選擇電視品牌-點擊您電視的電源開關測試是否適用-測試成功後選擇「是」進行下一步操作-根據提示查找電視服務商以及選擇電視調諧器
3.設置完成後,可以選擇個性化節目列表,並選擇觀看節目。點擊右側邊緣的按鈕可以顯示遙控器圖標,即可使用屏幕上的按鈕遙控電視。
2. Android TV開發焦點移動源碼分析
點可以理解為選中態,在Android TV上起很重要的作用。一個視圖控制項只有在獲得焦點的狀態下,才能響應按鍵的Click事件。
相對於手機上用手指點擊屏幕產生的Click事件, 在TV中通過點擊遙控器的方向鍵來控制焦點的移動。當焦點移動到目標控制項上之後,按下遙控器的確定鍵,才會觸發一個Click事件,進而去做下一步的處理
在處理焦點的時候,有一些基礎的用法需要知道。
首先,一個控制項isFocusable()需要為true才有資格可以獲取到焦點。如果想要在觸摸模式下獲取焦點,需要通過setFocusableInTouchMode(boolean)來設置。也可以直接在xml布局文件中指定:
keyEvent 分發過程:
而當按下遙控器的按鍵時,會產生一個按鍵事件,就是KeyEvent,包含「上」,「下」,「左」,「右」,「返回」,「確定」等指令。焦點的處理就在KeyEvent的分發當中完成。
首先,KeyEvent會流轉到ViewRootImpl中開始進行處理,具體方法是內部類 ViewPostImeInputStage 中的 processKeyEvent :
接下來先看一下KeyEvent在view框架中的分發:
這里也是可以做焦點控制,最好是在 event.getAction() == KeyEvent.ACTION_DOWN 進行.
因為android 的 ViewRootlmpl 的 processKeyEvent 焦點搜索與請求的地方 進行了判斷if (event.getAction() == KeyEvent.ACTION_DOWN)
• 首先ViewGroup會一層一層往上執行父類的dispatchKeyEvent方法,如果返回true那麼父類的dispatchKeyEvent方法就會返回true,也就代表父類消費了該焦點事件,那麼焦點事件自然就不會往下進行分發。
• 然後ViewGroup會判斷mFocused這個view是否為空,如果為空就會return false,焦點繼續往下傳遞;如果不為空,那就會return mFocused的dispatchKeyEvent方法返回的結果。這個mFocused其實是ViewGroup中當前獲取焦點的子View
發現執行了onKeyListener中的onKey方法,如果onKey方法返回true,那麼dispatchKeyEvent方法也會返回true
如果想要修改ViewGroup焦點事件的分發
• 重寫view的dispatchKeyEvent方法
• 給某個子view設置onKeyListener監聽
下面再來看一下如果一個頁面第一次進入,系統是如何確定焦點是定位在哪個view上的
由於DecorView繼承自FrameLayout,這里調用的是ViewGroup的requestFocus
descendantFocusability:
• FOCUS_AFTER_DESCENDANTS:先分發給Child View進行處理,如果所有的Child View都沒有處理,則自己再處理
• FOCUS_BEFORE_DESCENDANTS:ViewGroup先對焦點進行處理,如果沒有處理則分發給child View進行處理
• FOCUS_BLOCK_DESCENDANTS:ViewGroup本身進行處理,不管是否處理成功,都不會分發給ChildView進行處理
因為 PhoneWindow 給 DecoreView 初始化時設置 了 setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS),所以這里默認是FOCUS_AFTER_DESCENDANTS
到此第一次請求焦點的過程基本告一個段落
焦點移動的時候,默認的情況下,會按照一種演算法去找在指定移動方向上最近的鄰居。在一些情況下,焦點的移動可能跟開發者的意圖不符,這時開發者可以在布局文件中使用下面這些XML屬性來指定下一個焦點對象:
在KeyEvent分發中已經知道如果分發過程中event沒有被消耗,就會根據方向搜索以及請求焦點View
流程一:查找用戶指定的下一個焦點
流程二:獲取搜索方向上所有可以獲取焦點的view,使用演算法查找下一個view
addFocusables() 獲取搜索方向上可獲得焦點的view
descendantFocusability屬性決定了ViewGroup和其子view的聚焦優先順序
• FOCUS_BLOCK_DESCENDANTS:viewgroup會覆蓋子類控制項而直接獲得焦點
• FOCUS_BEFORE_DESCENDANTS:viewgroup會覆蓋子類控制項而直接獲得焦點
• FOCUS_AFTER_DESCENDANTS:viewgroup只有當其子類控制項不需要獲取焦點時才獲取焦點
addFocusables 的第一個參數views是由root決定的。在ViewGroup的focusSearch方法中傳進來的root是DecorView,也可以主動調用FocusFinder的findNextFocus方法,在指定的ViewGroup中查找焦點。
FocusFinder.findNextFocus 查找焦點
3. Android TV 焦點原理源碼解析
相信很多剛接觸AndroidTV開發的開發者,都會被各種焦點問題給折磨的不行。不管是學技術還是學習其他知識,都要學習和理解其中原理,碰到問題我們才能得心應手。下面就來探一探Android的焦點分發的過程。
Android焦點事件的分發是從ViewRootImpl的processKeyEvent開始的,源碼如下:
源碼比較長,下面我就慢慢來講解一下具體的每一個細節。
dispatchKeyEvent方法返回true代表焦點事件被消費了。
ViewGroup的dispatchKeyEvent()方法的源碼如下:
(2)ViewGroup的dispatchKeyEvent執行流程
(3)下面再來瞧瞧view的dispatchKeyEvent方法的具體的執行過程
驚奇的發現執行了onKeyListener中的onKey方法,如果onKey方法返回true,那麼dispatchKeyEvent方法也會返回true
可以得出結論:如果想要修改ViewGroup焦點事件的分發,可以這么干:
注意:實際開發中,理論上所有焦點問題都可以通過給dispatchKeyEvent方法增加監聽來來攔截來控制。
(1)dispatchKeyEvent方法返回false後,先得到按鍵的方向direction值,這個值是一個int類型參數。這個direction值是後面來進行焦點查找的。
(2)接著會調用DecorView的findFocus()方法一層一層往下查找已經獲取焦點的子View。
ViewGroup的findFocus方法如下:
View的findFocus方法
說明:判斷view是否獲取焦點的isFocused()方法, (mPrivateFlags & PFLAG_FOCUSED) != 0 和view 的isFocused()方法是一致的。
其中isFocused()方法的作用是判斷view是否已經獲取焦點,如果viewGroup已經獲取到了焦點,那麼返回本身即可,否則通過mFocused的findFocus()方法來找焦點。mFocused其實就是ViewGroup中獲取焦點的子view,如果mView不是ViewGourp的話,findFocus其實就是判斷本身是否已經獲取焦點,如果已經獲取焦點了,返回本身。
(3)回到processKeyEvent方法中,如果findFocus方法返回的mFocused不為空,說明找到了當前獲取焦點的view(mFocused),接著focusSearch會把direction(遙控器按鍵按下的方向)作為參數,找到特定方向下一個將要獲取焦點的view,最後如果該view不為空,那麼就讓該view獲取焦點。
(4)focusSearch方法的具體實現。
focusSearch方法的源碼如下:
可以看出focusSearch其實是一層一層地網上調用父View的focusSearch方法,直到當前view是根布局(isRootNamespace()方法),通過注釋可以知道focusSearch最終會調用DecorView的focusSearch方法。而DecorView的focusSearch方法找到的焦點view是通過FocusFinder來找到的。
(5)FocusFinder是什麼?
它其實是一個實現 根據給定的按鍵方向,通過當前的獲取焦點的View,查找下一個獲取焦點的view這樣演算法的類。焦點沒有被攔截的情況下,Android框架焦點的查找最終都是通過FocusFinder類來實現的。
(6)FocusFinder是如何通過findNextFocus方法尋找焦點的。
下面就來看看FocusFinder類是如何通過findNextFocus來找焦點的。一層一層往下看,後面會執行findNextUserSpecifiedFocus()方法,這個方法會執行focused(即當前獲取焦點的View)的findUserSetNextFocus方法,如果該方法返回的View不為空,且isFocusable = true && isInTouchMode() = true的話,FocusFinder找到的焦點就是findNextUserSpecifiedFocus()返回的View。
(7)findNextFocus會優先根據XML里設置的下一個將獲取焦點的View ID值來尋找將要獲取焦點的View。
看看View的findUserSetNextFocus方法內部都幹了些什麼,OMG不就是通過我們xml布局裡設置的nextFocusLeft,nextFocusRight的viewId來找焦點嗎,如果按下Left鍵,那麼便會通過nextFocusLeft值里的View Id值去找下一個獲取焦點的View。
可以得出以下結論:
1. 如果一個View在XML布局中設置了focusable = true && isInTouchMode = true,那麼這個View會優先獲取焦點。
2. 通過設置nextFocusLeft,nextFocusRight,nextFocusUp,nextFocusDown值可以控制View的下一個焦點。
Android焦點的原理實現就這些。總結一下:
為了方便同志們學習,我這做了張導圖,方便大家理解~
4. HID藍牙遙控器 - 支持鍵盤、滑鼠、影音遙控器(開源)
開源地址: https://gitee.com/taohaili/HidRemote
http://wnkong.com
1、支持模擬鍵盤、滑鼠、PPT常用工具、影音遙控器等功能;
2、支持連接window電腦、安卓手機、蘋果手機、安卓平板,ipad、mac電腦等設備;
3、功能實現居於藍牙hid協議實現,被控制設備無需安裝任何第三方軟體;
4、使用要求:一、手機或者平板的系統版本必須在android 9.0 及以上版本;二、被控制設備需支持藍牙連接;
註: 如果你第一次連接不上,請重啟APP連接,就像正常的藍牙連接一樣的; 軟體需要用戶授權使用定位功能(藍牙掃描需要該許可權)!
1、android hid api的使用;
2、hid 碼表: https://blog.csdn.net/bona020/article/details/101289147 ;
3、hid 描述符原理: https://www.cnblogs.com/ljf181275034/articles/2942700.html ;
https://www.coolapk.com/apk/284649
5. android怎麼檢測按鍵事件
您好,很高興能幫助您 遙控器按鍵事件這個不是在Android源碼的bootable下面ircon.c配置的么。比如: { .scancode = 0x0b, .mask = 0xaa0087ee, .keycode = KEY_UP, .spec = IRCON_KEYCODE_NORMAL | IRCON_KEYCODE_LONGPRESS | IRCON_KEYCODE_MOU...
6. android怎麼實現後台對按鍵事件的監控
遙控器按鍵事件這個不是在Android源碼的bootable下面ircon.c配置的么。比如:
{ .scancode = 0x0b, .mask = 0xaa0087ee,
.keycode = KEY_UP, .spec = IRCON_KEYCODE_NORMAL | IRCON_KEYCODE_LONGPRESS | IRCON_KEYCODE_MOUSEMD },
遙控器按鍵編號是「 0x0b」,給他的響應是「KEY_UP」,就是方向鍵的下,這個是在源碼里邊配置的。你必須要有遙控器的書名數,知道遙控器每個按鍵的編號,然後對應給他相應的響應才可以。
但是你要操控手機,你的手機必須要能接受緩罩輪遙控器信號,這個也是要硬體支持的,一般的手機貌似都沒有這個。
這個遙控的響應操作是驅動層做的,和應用層沒什麼關系,主要是驅動和硬體的支持。
7. 開源蘿莉遙控器需要自己編寫代碼嗎
開源蘿莉遙控器不需要自己編寫兆和升代碼。根族老據查詢相關資料得知,開源蘿莉遙控器是已開發好棚豎的源代碼,可以直接生成前端軟體,若需修改內容功能,就需要編寫代碼。
8. android 遙控器調試記錄
查找對應的.kl文件:
串口下輸入 getevent 再按遙控
輸出:
/dev/input/event0: 0001 000b 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 000b 00000000
/dev/input/event0: 0000 0000 00000000
查看按鍵事件
串口下輸入 getevent -l 再按遙控
輸出:
/dev/input/event3: EV_KEY KEY_N DOWN
/dev/input/event3: EV_SYN SYN_REPORT 00000000
/dev/input/event3: EV_KEY KEY_N UP
/dev/input/event3: EV_SYN SYN_REPORT 00000000
串口下輸入 mpsys input
查找 event0 對應的.kl文件
對應於類似文件中的碼值 Vendor_0001_Proct_0001.kl
該文件匹配Android上層事件
涉及文件:
frameworks/base/core/res/res/values/attrs.xml
frameworks/base/core/java/android/view/KeyEvent.java
frameworks/native/include/android/keycodes.h
frameworks/native/include/input/InputEventLabels.h
海思系統獲取遙控鍵值:
串口下輸入 ir_user -m 0
9. android怎麼實現後台對按鍵事件的監控
遙控器按鍵事件這個不是在Android源碼的bootable下面ircon.c配置的么。比如:
{ .scancode = 0x0b, .mask = 0xaa0087ee,
.keycode = KEY_UP, .spec = IRCON_KEYCODE_NORMAL | IRCON_KEYCODE_LONGPRESS | IRCON_KEYCODE_MOUSEMD },
遙控器按鍵編號是「 0x0b」,給他的響應是「KEY_UP」,就是方向鍵的下,這個是在源碼里邊配置的。你必須要有遙控器的書名數,知道遙控器每個按鍵的編號,然後對應給他相應的響應才可以。
但是你要操控手機,你的手機必須要能接受遙控器信號,這個也是要硬體支持的,一般的手機貌似都沒有這個。
這個遙控的響應操作是驅動層做的,和應用層沒什麼關系,主要是驅動和硬體的支持。
10. android紅外遙控器
上帝說要有光,於是便有了光。領導說要有遙控器,於是便。。。要加班了。
因為實體遙控器的實現分為紅外和2.4G,此款android版遙控器則將紅外功能全部紅外實現,2.4G部分功能通過網路方式實現。
本次項目的紅外編碼格式為:6122
用戶碼為:8018
載波為:38KHz
開關操作碼值為:10
正常發碼:引導碼(9ms+4.5ms)+用戶編碼(低八位)+用戶編碼(高八位)+鍵數據碼+鍵數據反碼
那麼發射開關命令則為:
當信心滿滿的以為一切ok的時候,測試的時候設備始終沒有搭理我。嚯喔,那紅外解碼器一測原始遙控器發碼與手機的發碼對比才發現,每次發送的碼值都少一位「1」,怪的很。
其他類似的空調電視的控制還遠嗎?馬上操練起來!