我曾試圖總結我是如何通過博客文章解決問題的。任何需要幫助的人都可以看一看。
Accessibility Service to the next level
我以前的答覆被版主刪除,則可能是由於我剛剛發佈了一個鏈接到博客。所以我在這裏再次發佈我的答案和細節。
最簡單的方法是由android本身提供的。如果你正在自己的應用程序上構建一些東西,這是實現它的最好和最簡單的方法。您必須使用「findAccessibilityNodeInfosByViewId ()」,如下
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewId = source.findAccessibilityNodeInfosByViewId("YOUR PACKAGE NAME:id/RESOURCE ID FROM WHERE YOU WANT DATA");
if (findAccessibilityNodeInfosByViewId.size() > 0) {
AccessibilityNodeInfo parent = (AccessibilityNodeInfo) findAccessibilityNodeInfosByViewId.get(0);
// You can also traverse the list if required data is deep in view hierarchy.
String requiredText = parent.getText().toString();
Log.i("Required Text", requiredText);
}
}
解釋的。如果你正在構建的其他應用程式的東西,不知道資源ID。您必須使用父級,子級計數,找到您的數據的級別,事件類型的組合來構建邏輯。您必須查找事件或來源中的模式或上述數值的組合以獲得所需的數據。此外,您必須在代碼中進行一些調整才能根據您的任務獲取準確的數據。就像我們的任務一樣,我們有一些正則表達式來獲取寶貴的數據。
您必須注意,如果更改視圖或用戶界面或更改資源標識,您當前的邏輯可能會失敗。因此,您必須密切關注您正在構建服務的應用程序。以下是一些示例代碼,我們可以在其中獲取數據而無需使用res id,這可能對您瞭解其工作原理有用。
要打印源和事件
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source == null) {
return;
}
Log.i("Event", event.toString+」」);
Log.i("Source", source.toString+」」);
}
要獲得childcount
source.getChildCount();
如果孩子計數> 0,你可能不得不考慮它。
示例代碼1
if (level == 0 && source.getClassName().equals("android.widget.TextView") && source.getText()!=null && !source.getText().toString().isEmpty()){
// here level is iteration of for loop
String recivedText = source.getText().toString();
if(source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.FrameLayout") && source.getParent().getParent()==null){
return recivedText;
}
}
示例代碼2
if (source.getPackageName().equals("PACKAGE NAME OF APP FOR WHICH YOUR EXPECTING EVENT")) {
if(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED && "COMPLETE NAME OF ACTIVITY CLASS WITH PACKAGE NAME (if you want it for some specific screen)".equals(event.getClassName())){
if(source.getText()!=null && source.getClassName().equals("android.widget.TextView") && source.getParent()!=null && source.getParent().getClassName().equals("android.widget.RelativeLayout")&& source.getParent().getParent()!=null && source.getParent().getParent().getClassName().equals("android.widget.ScrollView") && source.getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getClassName().equals("android.support.v4.view.ViewPager")&& source.getParent().getParent().getParent().getParent()!=null && source.getParent().getParent().getParent().getParent().getClassName().equals("android.widget.FrameLayout")&& source.getParent().getParent().getParent().getParent().getParent()==null){
return source.getText().toString();
}
}
這是有點笨拙,但得到它的工作,你必須仔細端詳日誌,以找到一個模式,其將帶你到你需要的數據。
更新20/11/2017 谷歌正在暫停所有使用無障礙服務的應用程序,用於輔助功能以外的其他應用程序。我收到了一封關於我的應用和其他開發者同樣的郵件,它們也收到了谷歌的同樣的電子郵件(Reddit)。所以,我認爲我們應該尋找其他方式來做事,並且請求你在這裏也更新它,如果有人想出其他的實現來實現同樣的行爲,那麼也會幫助別人。
感謝 Umesh製作肖漢
我能夠從屏幕讀取文本,但如何獲得確切的產品名稱。 –
問題解決了。如果有人需要解決方案。請留下評論。我會盡可能快地發佈完整的anwser。 –
你能分享你如何解決問題嗎? – Mahesh