AndroidAccessibilityServiceを介して通知にアクセスできません

トニートム

AccessibilityServiceを使用してAndroidフォンの通知にアクセスしようとしています。

本番からサービスを作って呼んでみました。サービスのメタも追加しました。動いていない。サービスのトリガーがわかりません。

テストにはAndroidLを使用しています。アクセシビリティ設定で、アプリの「通知」をオンとして追加しました。

前もって感謝します。

私の主な活動

package com.example.tony.notify;

import android.content.Intent;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        startActivityForResult(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS), 0);
        Intent i = new Intent(this, MyAccessibilityService.class);
        startService(i);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

これは私のサービスクラスです

package com.example.tony.notify;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.widget.Toast;

/**
 * Created by tony on 9/7/15.
 */
public class MyAccessibilityService extends AccessibilityService {

    final String TAG = "Notification service";

    private String getEventType(AccessibilityEvent event) {
        switch (event.getEventType()) {
            case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
                return "TYPE_NOTIFICATION_STATE_CHANGED";
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
                return "TYPE_VIEW_CLICKED";
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                return "TYPE_VIEW_FOCUSED";
            case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:
                return "TYPE_VIEW_LONG_CLICKED";
            case AccessibilityEvent.TYPE_VIEW_SELECTED:
                return "TYPE_VIEW_SELECTED";
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
                return "TYPE_WINDOW_STATE_CHANGED";
            case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
                return "TYPE_VIEW_TEXT_CHANGED";
        }
        return "default";
    }

    private String getEventText(AccessibilityEvent event) {
        StringBuilder sb = new StringBuilder();
        for (CharSequence s : event.getText()) {
            sb.append(s);
        }
        return sb.toString();
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

        Log.v(TAG, String.format(
                "onAccessibilityEvent: [type] %s [class] %s [package] %s [time] %s [text] %s",
                getEventType(event), event.getClassName(), event.getPackageName(),
                event.getEventTime(), getEventText(event)));

    }


    @Override
    public void onInterrupt() {

        Log.v(TAG, "onInterrupt");

    }

    @Override
    protected void onServiceConnected() {
        Toast.makeText(getApplicationContext(),"connected",Toast.LENGTH_SHORT).show();
        super.onServiceConnected();
        Log.v(TAG, "onServiceConnected");
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
        info.flags = AccessibilityServiceInfo.DEFAULT;
        info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
        info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        setServiceInfo(info);
    }
}

サービスを宣言するための私のマニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tony.notify" >

    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <service android:name=".MyAccessibilityService"
            android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
            <intent-filter>
                <action android:name="android.accessibilityservice.AccessibilityService" />
            </intent-filter>

            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/accessibilityservice" />
        </service>

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

助けてください。前もって感謝します。私はいくつかの例を調べてみました。エラーが見つかりませんでした。

トニートム

私はそれをLで動作させましたが、実際にはapi 16で動作していません、私は1つでテストしました。誰かがそれをAPI14 +で動作させるための追加を提案できますか?

マニフェストファイル

package com.example.tony.acctest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.example.tony.acctest.MyAccessibilityService.Constants;


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MA LOG";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final IntentFilter mIntentFilter = new IntentFilter(Constants.ACTION_CATCH_NOTIFICATION);
        registerReceiver(NotificationCatcherReceiver, mIntentFilter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(NotificationCatcherReceiver);
    }

    private final BroadcastReceiver NotificationCatcherReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v(TAG, intent.getStringExtra(Constants.EXTRA_PACKAGE));
            Log.v(TAG, intent.getStringExtra(Constants.EXTRA_MESSAGE));
        }
    };
}

私のサービスクラス

package com.example.tony.acctest;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.TargetApi;
import android.app.Notification;
import android.content.Intent;
import android.os.Build;
import android.os.Parcelable;
import android.view.accessibility.AccessibilityEvent;

import java.util.List;


public class MyAccessibilityService extends AccessibilityService {

    private final AccessibilityServiceInfo info = new AccessibilityServiceInfo();

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {

        final int eventType = event.getEventType();
        if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
            final String sourcePackageName = (String)event.getPackageName();
            Parcelable parcelable = event.getParcelableData();

            if (parcelable instanceof Notification) {
                List<CharSequence> messages = event.getText();
                if (messages.size() > 0) {
                    try {
                        final String notificationMsg = (String) messages.get(0);
                        Intent mIntent = new Intent(Constants.ACTION_CATCH_NOTIFICATION);
                        mIntent.putExtra(Constants.EXTRA_PACKAGE, sourcePackageName);
                        mIntent.putExtra(Constants.EXTRA_MESSAGE, notificationMsg);
                        MyAccessibilityService.this.getApplicationContext().sendBroadcast(mIntent);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }


    @Override
    public void onInterrupt() {

    }

    @Override
    public void onServiceConnected() {
        info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
        } else {
            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
        }
        info.notificationTimeout = 100;
        this.setServiceInfo(info);
    }


    public static final class Constants {

    public static final String EXTRA_MESSAGE = "extra_message";
    public static final String EXTRA_PACKAGE = "extra_package";
    public static final String ACTION_CATCH_NOTIFICATION = "com.example.tony.acctest.CATCH_NOTIFICATION";
    }

}

これは私のメインアクティビティパッケージcom.example.tony.acctestです。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.example.tony.acctest.MyAccessibilityService.Constants;


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MA LOG";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final IntentFilter mIntentFilter = new IntentFilter(Constants.ACTION_CATCH_NOTIFICATION);
        registerReceiver(NotificationCatcherReceiver, mIntentFilter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(NotificationCatcherReceiver);
    }

    private final BroadcastReceiver NotificationCatcherReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v(TAG, intent.getStringExtra(Constants.EXTRA_PACKAGE));
            Log.v(TAG, intent.getStringExtra(Constants.EXTRA_MESSAGE));
        }
    };
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

curlまたはPostmanを介してdockerurlにアクセスできません

分類Dev

Kubernetes入力を介してWebSocketにアクセスできません

分類Dev

<%= variable%>を介してJS / jQueryの変数にアクセスできません

分類Dev

C#はcolumnnameを介してDataTables列にアクセスできません

分類Dev

XSLを介してXMLの要素の値にアクセスできません

分類Dev

requireを介して変数にアクセスできません

分類Dev

JSファイルを介してJQueryにアクセスできません

分類Dev

内部結合SQLServerを介してCTEにアクセスできません

分類Dev

ngModelを介して変数にアクセスできません-Angular4

分類Dev

子クラスを介して親クラスのメソッドにアクセスできません

分類Dev

ILMergeを介してDLLをexeに埋め込みました。dllにアクセスできません。

分類Dev

インデックスを介してPHP配列の値にアクセスできません

分類Dev

角度インクルードでhtmlのjavascriptを介してdividにアクセスできません

分類Dev

Docker Set環境変数をubuntuに設定し、phpgetenvを介してアクセスできません

分類Dev

Windows上のDocker(localhost)を介して.NetCoreアプリにアクセスできません

分類Dev

Postman の環境変数を介して JavaScript オブジェクトにアクセスできません

分類Dev

デプロイまたはpingを介してawspublicipにアクセスできません

分類Dev

IAM認証を介してRDSデータベースにアクセスできません

分類Dev

nginx-ingress-controllerを介してKubernetesClusterIPサービスにアクセスできません

分類Dev

Squidプロキシを介してローカルホストにアクセスできません

分類Dev

Javaは、子を介してKotlinの基本変数にアクセスできますが、Kotlinにはアクセスできません。なぜですか?

分類Dev

リモートアクセスを介してjboss6.1をjconsoleに接続できません

分類Dev

BeautifulSoupを使用してdivにアクセスできません

分類Dev

sshを使用してVagrantにアクセスできません

分類Dev

docker-composeを介して実行すると、ホスト上でMongodbにアクセスできませんが、dockerを介して機能します

分類Dev

FirefoxDriverを介してグローバル変数にアクセスできません

分類Dev

kubernetes準備プローブを介してコンテナにアクセスできません

分類Dev

kubernetes準備プローブを介してコンテナにアクセスできません

分類Dev

nodejsの特定のルートを介して静的ファイルにアクセスできません

Related 関連記事

  1. 1

    curlまたはPostmanを介してdockerurlにアクセスできません

  2. 2

    Kubernetes入力を介してWebSocketにアクセスできません

  3. 3

    <%= variable%>を介してJS / jQueryの変数にアクセスできません

  4. 4

    C#はcolumnnameを介してDataTables列にアクセスできません

  5. 5

    XSLを介してXMLの要素の値にアクセスできません

  6. 6

    requireを介して変数にアクセスできません

  7. 7

    JSファイルを介してJQueryにアクセスできません

  8. 8

    内部結合SQLServerを介してCTEにアクセスできません

  9. 9

    ngModelを介して変数にアクセスできません-Angular4

  10. 10

    子クラスを介して親クラスのメソッドにアクセスできません

  11. 11

    ILMergeを介してDLLをexeに埋め込みました。dllにアクセスできません。

  12. 12

    インデックスを介してPHP配列の値にアクセスできません

  13. 13

    角度インクルードでhtmlのjavascriptを介してdividにアクセスできません

  14. 14

    Docker Set環境変数をubuntuに設定し、phpgetenvを介してアクセスできません

  15. 15

    Windows上のDocker(localhost)を介して.NetCoreアプリにアクセスできません

  16. 16

    Postman の環境変数を介して JavaScript オブジェクトにアクセスできません

  17. 17

    デプロイまたはpingを介してawspublicipにアクセスできません

  18. 18

    IAM認証を介してRDSデータベースにアクセスできません

  19. 19

    nginx-ingress-controllerを介してKubernetesClusterIPサービスにアクセスできません

  20. 20

    Squidプロキシを介してローカルホストにアクセスできません

  21. 21

    Javaは、子を介してKotlinの基本変数にアクセスできますが、Kotlinにはアクセスできません。なぜですか?

  22. 22

    リモートアクセスを介してjboss6.1をjconsoleに接続できません

  23. 23

    BeautifulSoupを使用してdivにアクセスできません

  24. 24

    sshを使用してVagrantにアクセスできません

  25. 25

    docker-composeを介して実行すると、ホスト上でMongodbにアクセスできませんが、dockerを介して機能します

  26. 26

    FirefoxDriverを介してグローバル変数にアクセスできません

  27. 27

    kubernetes準備プローブを介してコンテナにアクセスできません

  28. 28

    kubernetes準備プローブを介してコンテナにアクセスできません

  29. 29

    nodejsの特定のルートを介して静的ファイルにアクセスできません

ホットタグ

アーカイブ