Skocz do zawartości

    Rekomendowane odpowiedzi

    Cześć! Mam mały problem związany z przechwytywaniem pojawiających się powiadomień, konkretnie chyba z ich przesyłaniem. Tak naprawdę potrzebowałbym tylko je zliczać. Korzystam również z tego kodu na stacku: https://stackoverflow.com/questions/22286681/reading-notifications-using-accessibilityservice

    Zdaję sobie sprawę, że istnieje coś takiego jak NotificationListenerService (API 18), ale nie potrafię zbudować kodu na podstawie dostarczonej dokumentacji technicznej.

    Wygląda to mniej więcej tak:

    MainActivity

    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        private static MainActivity ins;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ins=this;
    
        }
        public static MainActivity getIns()
        {
            return ins;
        }
    
        public void updateUI(final String s)
        {
            MainActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    TextView textView=(TextView) findViewById(R.id.textView);
                    textView.setText(s);
                }
            });
        }
    }

    NotificationAccessibilityService

    import android.accessibilityservice.AccessibilityService;
    import android.accessibilityservice.AccessibilityServiceInfo;
    import android.app.Notification;
    import android.os.Parcelable;
    import android.util.Log;
    import android.view.accessibility.AccessibilityEvent;
    
    public class NotificationAccessibilityService extends AccessibilityService{
        int notification=0;
        protected void onServiceConnected() {
            Log.d("Tortuga", "AccessibilityService Connected");
            AccessibilityServiceInfo info = new AccessibilityServiceInfo();
            info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
            info.feedbackType = AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
            info.notificationTimeout = 100;
            setServiceInfo(info);
        }
    
        @Override
        public void onAccessibilityEvent(AccessibilityEvent e) {
            Log.d("Tortuga","FML");
            if (e.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
    
                notification++;
    
                Log.d("Tortuga","Recieved event");
                Parcelable data = e.getParcelableData();
                if (data instanceof Notification) {
                    Log.d("Tortuga","Recieved notification");
                    Notification notification = (Notification) data;
                    Log.d("Tortuga","ticker: " + notification.tickerText);
                    Log.d("Tortuga","icon: " + notification.icon);
                    Log.d("Tortuga", "notification: "+ e.getText());
                }
            }
    
            MainActivity.getIns().updateUI(Integer.toString(notification));
        }
    
        @Override
        public void onInterrupt() {
        }
    }

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.ivan.notifications">
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service
                android:name="com.example.ivan.notifications.NotificationAccessibilityService"
                android:label="@string/app_name"
                android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
                    <intent-filter>
                        <action android:name="android.accessibilityservice.AccessibilityService" />
                    </intent-filter>
                <meta-data
                    android:name=".MainActivity"
                    android:resource="@layout/activity_main" />
            </service>
        </application>
    </manifest>

    Kody błędów:

    Process: com.example.ivan.notifications, PID: 9809
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.ivan.notifications.MainActivity.updateUI(java.lang.String)' on a null object reference
    at com.example.ivan.notifications.NotificationAccessibilityService.onAccessibilityEvent(NotificationAccessibilityService.java:39)
    at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent(AccessibilityService.java:1538)
    at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1724)
    at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

    W Logcat normalnie po przyjsciu smsa, nieodebranym połączeniu wywołują się Log.d( ... ticker ), Log.d( ... icon: ... ), Log.d( ... notification ... )

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow

    Masz nulla w zmiennej notification przy wywoływaniu metody updateUI. Przed wywołaniem tej metody sprawdż czy notification != null i wtedy wywołaj metodę.

    • Lubię to! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    @Ironwing próbujesz zawołać metodę na specjalnym obiekcie "null", a to powoduje pojawienie się wyjątku ;) wystarczy dodać warunek wartość != null to wykonuj dalej, dodatkowo możesz sobie logować pojawienie się niepoprawnej wartości (przez niepoprawną rozumiem tutaj równej null)

    • Lubię to! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Dzięki, faktycznie to przeoczyłem, bo to nasłuchiwało i wywalało apkę przed tym nawet jak zdążyłem utworzyć powiadomienie. Pojawił się natomiast kolejny problem. Teraz z tego co widzę to już coś z ConstraintLayout i widgetem TextView. To jest dosyć dziwne, bo tę samą funkcję wykorzystuje w innej aplikacji, i działa bez żadnych problemów.

    Process: com.example.ivan.notifications, PID: 2477
                                                                                  java.lang.ClassCastException: android.support.constraint.ConstraintLayout cannot be cast to android.widget.TextView
                                                                                      at com.example.ivan.notifications.MainActivity$1.run(MainActivity.java:27)
                                                                                      at android.app.Activity.runOnUiThread(Activity.java:6273)
                                                                                      at com.example.ivan.notifications.MainActivity.updateUI(MainActivity.java:24)
                                                                                      at com.example.ivan.notifications.NotificationAccessibilityService.onAccessibilityEvent(NotificationAccessibilityService.java:44)
                                                                                      at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent(AccessibilityService.java:1538)
                                                                                      at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1724)
                                                                                      at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                      at android.os.Looper.loop(Looper.java:164)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:6656)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

    @@@EDIT

    Nie było pytania, miałem przypisane id 'TextView' do ConstraintLayout zamiast do pola ?

    Swoją drogą, czy ktoś może korzystał z tej biblioteki, i wie jak da się powyciągać nazwy tych paczek? Albo chociaż same tytuły, np. "Missed call"? Albo te powiadomienia które już aktualnie są w tym boxie w telefonie? Bo aktualnie przechwytuję tylko nowe przychodzące.

    Edytowane przez Ironwing

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Cieszę się, że udało nam się pomóc :)  nie korzystałem z tej biblioteki, więc nie potrafię pomóc ale na 100% na forum znajdzie się ktoś kto potrafi pomóc. Może warto założyć na to osobny temat? To na pewno pomoże!

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x