編輯:關於Android編程
對於那些由於視力、聽力或其它身體原因導致不能方便使用Android智能手機的用戶,Android提供了Accessibility功能和服務幫助這些用戶更加簡單地操作設備,包括文字轉語音(不支持中文)、觸覺反饋、手勢操作、軌跡球和手柄操作。開發者可以搭建自己的Accessibility服務,這可以加強可用性,例如聲音提示,物理反饋,和其他可選的操作模式。
隨著Android版本的不斷升級,AndroidAccessibility功能也越來越強大,Android 4.0版本以前,系統輔助服務功能比較單一,僅僅能過單向獲取窗口元素信息,比如獲取輸入框用戶輸入內容。到Android 4.1版本以後,系統輔助服務增加了與窗口元素的雙向交互,此時可以通過輔助功能服務操作窗口元素,比如點擊按鈕等。
想要讓自己程序實輔助功能,首先第一步就是要新建類並繼承AccessibilityService類。繼承自AccessibilityService的子類裡實現幾個重要的重載方法:
方法
描述
onAccessibilityEvent()
必須。通過這個函數可以接收系統發送來的AccessibilityEvent,接收來的AccessibilityEvent是經過過濾的,過濾是在配置工作時設置的。
onInterrupt()
必須。這個在系統想要中斷AccessibilityService返給的響應時會調用。在整個生命周期裡會被調用多次。
onServiceConnected()
可選。在系統成功連接上這個AccessibilityService會調用。在這個方法裡你可以做一下初始化工作。
onUnbind()
可選。在系統將要關閉這個AccessibilityService會被調用。在這個方法中進行一些釋放資源的工作。
屬性分別代表意義:
屬性
描述
description
就是設置裡輔助功能項的備注說明(不可在運行時修改)。
accessibilityEventTypes
設置響應事件的類型,typeAllMask當然就是響應所有類型的事件了。當然還有單擊、長按、滑動等(多個值由“|”分隔)(可在運行時修改)。
值有:
值
說明
typeViewClicked
Receives TYPE_VIEW_CLICKED events.
typeViewLongClicked
Receives TYPE_VIEW_LONG_CLICKED events.
typeViewSelected
Receives TYPE_VIEW_SELECTED events.
typeViewFocused
Receives TYPE_VIEW_FOCUSED events.
typeViewTextChanged
Receives TYPE_VIEW_TEXT_CHANGED events.
typeWindowStateChanged
Receives TYPE_WINDOW_STATE_CHANGED events.
typeNotificationStateChanged
Receives TYPE_NOTIFICATION_STATE_CHANGED events.
typeViewHoverEnter
Receives TYPE_VIEW_HOVER_ENTER events.
typeViewHoverExit
Receives TYPE_VIEW_HOVER_EXIT events.
typeTouchExplorationGestureStart
Receives TYPE_TOUCH_EXPLORATION_GESTURE_START events.
typeTouchExplorationGestureEnd
Receives TYPE_TOUCH_EXPLORATION_GESTURE_END events.
typeWindowContentChanged
Receives TYPE_WINDOW_CONTENT_CHANGED events.
typeViewScrolled
Receives TYPE_VIEW_SCROLLED events.
typeViewTextSelectionChanged
Receives TYPE_VIEW_TEXT_SELECTION_CHANGED events.
typeAnnouncement
Receives TYPE_ANNOUNCEMENT events.
typeViewAccessibilityFocused
Receives TYPE_VIEW_ACCESSIBILITY_FOCUSED events.
typeViewAccessibilityFocusCleared
Receives TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED events.
typeViewTextTraversedAtMovementGranularity
Receives TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITYevents.
typeGestureDetectionStart
Receives TYPE_GESTURE_DETECTION_START events.
typeGestureDetectionEnd
Receives TYPE_GESTURE_DETECTION_END events.
typeTouchInteractionStart
Receives TYPE_TOUCH_INTERACTION_START events.
typeTouchInteractionEnd
Receives TYPE_TOUCH_INTERACTION_END events.
typeWindowsChanged
Receives TYPE_WINDOWS_CHANGED events.
typeContextClicked
Receives TYPE_VIEW_CONTEXT_CLICKED events.
typeAssistReadingContext
Receives TYPE_ASSIST_READING_CONTEXT events.
typeAllMask
Receives TYPES_ALL_MASK i.e. all events.
accessibilityFeedbackType
設置回饋給用戶的方式,有語音播出和振動(多個值由“|”分隔)(可在運行時修改)。
值有:
值
說明
feedbackSpoken
Provides FEEDBACK_SPOKEN feedback.
feedbackHaptic
Provides FEEDBACK_HAPTIC feedback.
feedbackAudible
Provides FEEDBACK_AUDIBLE feedback.
feedbackVisual
Provides FEEDBACK_VISUAL feedback.
feedbackGeneric
Provides FEEDBACK_GENERIC feedback.
feedbackAllMask
Provides FEEDBACK_ALL_MASK feedback.
notificationTimeout
相同類型的兩個事件之間的最小時間發送到該服務(可在運行時修改)。
accessibilityFlags
可訪問性(多個值由“|”分隔)(可在運行時修改)。
值有:
值
說明
flagDefault
Has flag DEFAULT
flagIncludeNotImportantViews
Has flag FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
flagRequestTouchExplorationMode
Has flag FLAG_REQUEST_TOUCH_EXPLORATION_MODE
flagRequestEnhancedWebAccessibility
Has flag FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY
flagReportViewIds
Has flag FLAG_REPORT_VIEW_IDS
flagRequestFilterKeyEvents
Has flag FLAG_REQUEST_FILTER_KEY_EVENTS
flagRetrieveInteractiveWindows
Has flag FLAG_RETRIEVE_INTERACTIVE_WINDOWS
packageNames
響應的程序的包名(多個值由“,”分隔)(可在運行時修改)。
canRetrieveWindowContent
是否能夠檢索活動窗口的內容(不可在運行時修改)。
settingsActivity
允許用戶修改此服務的設置的活動組件名稱,(如果不需要在運行時修改設置,可忽略該項)(不可在運行時修改)。
修改設置,可使用:android.accessibilityservice.AccessibilityService.setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo).
// 系統權限 // XXXXX為上面新建的配置XML文件
在onAccessibilityEvent中,使用參數event的getSource方法獲取到的AccessibilityNodeInfo實例,即為觸發這次事件的UI節點。獲取到當前界面UITree的根節點可以使用findAccessibilityNodeInfosByText或者findAccessibilityNodeInfosByViewId方法。需要注意findAccessibilityNodeInfosByText在獲取UI元素時的判斷邏輯是包含而非等於。
示例代碼如:
Listnodes = event.getSource().findAccessibilityNodeInfosByText("立即安裝"); Listnodes = event.getSource().findAccessibilityNodeInfosByViewId("txt_1");
獲取界面上UI元素之後,可根據元素是否可響應操作進行相應的處理。例如,如果UI元素是一個有效的按鈕,則可以使用下面的代碼來進行模擬點擊:
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
同理,如果UI元素是一個有效的列表,則可以使用下面的代碼進行模擬滑動:
nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
也可以模擬物理鍵的操作,例如模擬按下返回鍵的代碼是:
AccessibilityService.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
在上面介紹accessibilityEventTypes中提到有一個事件: typeNotificationStateChanged,它便是消息通知欄狀態發生改變變觸發。一些紅包外掛工具裡頭,一有紅包就提醒的原理便是在onAccessibilityEvent中監聽該事件,然後判斷關鍵字並打開通知,示例關鍵代碼如:
if(event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED){ return; } Listtexts = event.getText(); if(texts.size() <= 0 || !mAutoTrack) { return; } for(CharSequence text : texts) { String content = text.toString(); if(!content.contains("[微信紅包]")){ continue; } if(event.getParcelableData() == null || !(event.getParcelableData() instanceofNotification)) { continue; } Notification notification = (Notification)event.getParcelableData(); PendingIntent pendingIntent =notification.contentIntent; try{ pendingIntent.send(); }catch (PendingIntent.CanceledException e) { e.printStackTrace(); } }
首先,定義一個TextToSpeech對象,並在服務連上後進行初始化,示例代碼如:
private TextToSpeech mTts; …… mTts = newTextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { mTts.setLanguage(Locale.US); } } });
執行語音播放代碼:
mTts.speak("hello",TextToSpeech.QUEUE_FLUSH, null);
最後別忘記釋放資源:
mTts.shutdown();
建議:
在開發APP想支持語音播功能時,建議在用戶界面控件中,通過使用android:contentDescription屬性來描控件特性。
對於EditText控件,提供了一個android:hint屬性代替了contentDescription屬性
intaccessibilityEnabled =Settings.Secure.getInt(context.getApplicationContext().getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED); if(accessibilityEnabled == 1) { String settingValue =Settings.Secure.getString(context.getApplicationContext().getContentResolver(),Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); }
如果手機中開啟了一些APP的輔助功能,settingValue的值為:APP1包名/APP1繼承AccessibilityService類全名: APP2包名/APP2繼承AccessibilityService類全名
一、
二、
三、
作為獨立開發者或想縮短音視頻開發周期的公司來說,想要在Android平台下實現音視頻通信,最快捷的方法是尋找開源項目或調用其他公司API。之所以這麼說是因為音視頻通信技術
依照郭霖老師的《第一行代碼Android》,今天我要來學習Activity,首先來初步了解Activity,基本上就是照葫蘆畫瓢的模式,有點回到當初敲java的hello
Frame Animation 表示幀動畫,是順序播放事先做好的圖像,跟電影類似,Android SDK提供了另外一個類AnimationDrawable來定義使用Fra
Android越來越普及,那已經安裝的應用要如何更新呢?在應用市場中常會有顯示某某應用已經更新之類的信息,那我們是否也可以實現類似的功能呢?如果要實現又要做