26

同じトピックに関する私の最後の質問は十分に明確ではなく、コミュニティによって保留にされ、その後自動的に削除されました. それで、私はその質問を詳細に説明しているので、コミュニティがよりよく理解し、助けることができます.

Voodoo アプリMySmartPrice のオファーと同様の機能が必要です。

今、彼らは何をしますか

ステップ 1: Voodoo アプリを初めて開くと、小さなチュートリアルが表示されます。チュートリアルの最後に「今すぐ有効化」ボタンがあり、これを押すとアクセシビリティ設定画面に移動します。

ステップ 2:アクセシビリティ画面では、Voodoo サービスを見つけて無効にする方法をさらに案内します。

ステップ 3:有効にすると、さらに「アクションの監視」と「ウィンドウ コンテンツの取得」権限を付与するよう求められます。

ステップ 4:アクセシビリティ画面でパーミッションの付与が完了したら、ショッピング アプリに移動するか、ブラウザ経由でショッピング サイトにアクセスし、ブードゥー フローティング ボタンが自動的にポップアップする製品ページにアクセスします。

ステップ 5:クリックすると、他のアプリやウェブサイトで入手可能な同じ/関連/類似の製品の価格が表示されるので、ユーザーは利用可能な最良の取引を確認できます。

Voodoo の参照スクリーンショット

ブードゥースクリーン 1

アクセシビリティ画面

アクセシビリティ画面 2

権限付与画面

ブードゥースクリーン 2

製品ページの Voodoo フローティング ボタン

他のアプリの上に描画の助けを借りてブードゥーの結果

今、コミュニティから知りたいこと:

  1. アクセシビリティ画面と製品詳細ページにヘルプ UI を表示する方法。
  2. 製品ページが画面に表示されたことを検出し、フローティング ボタンを呼び出す方法。
  3. 画面に表示されている商品名を取得する方法。
  4. この画面読み上げ機能を一部のアプリのみに制限するにはどうすればよいですか? (著作権の問題に巻き込まれたくないので)
  5. 私を助けることができるチュートリアルはありますか? 私はすでにGoogleで直接チュートリアルを試していましたが、成功しませんでした.

なぜこの情報が必要なのか:

私のサーバーまたはウェブで利用可能なウェブの場所で利用可能な場合、学生が目的の(または類似の)本(電子ブック)に無料でアクセスできるようにするアプリを計画しています。一部の書籍の著作権の問題により、一部のアプリのみに機能を制限したいと考えています。

このトピックに関する私の研究から私が知っていること(しかし、私が正しい軌道に乗っているかどうかはわかりません)

4

2 に答える 2

28

ブログ投稿で問題を解決する方法を要約しようとしました。助けが必要な人は誰でもそれを調べることができます。

次のレベルへのアクセシビリティ サービス

ブログへのリンクを投稿したばかりのため、以前の回答がモデレーターによって削除された可能性があります。そのため、ここにも詳細を記載して回答を再度投稿しています。

最も簡単な方法は、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);
    }
}  

他のアプリで何かを構築していて、res id がわからない場合。親、子の数、データが見つかるレベル、イベントの種類を組み合わせてロジックを構築する必要があります。必要なデータを貴重に取得するには、イベントまたはソースのパターン、または上記の値の組み合わせを探す必要があります。さらに、タスクに応じて正確なデータを取得するには、コードを微調整する必要があります。私たちのタスクのように、貴重なデータを取得するための正規表現があります。

ビューまたは UI が変更された場合、または res 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();
        }
}

少し不器用ですが、機能させるには、ログを深く調べて、必要なデータに到達するパターンを見つける必要があります。

2017 年 11 月 20 日更新 Google は、アクセシビリティ以外の目的でアクセシビリティ サービスを使用しているすべてのアプリを停止しています。私のアプリの 1 つについて同じメールを受け取りましたが、他の開発者も Google ( Reddit ) から同じメールを受け取っています。したがって、他の方法を探す必要があると思います。ここでも更新してください。同じ動作を実現するために他の実装を思いついた場合は、他の人にも役立つでしょう。

ありがとうウメシュ・チャウハン

于 2016-05-23T10:40:05.533 に答える