Реализация NotificationListenerService в Android - PullRequest
0 голосов
/ 28 сентября 2018

Я хотел отобразить уведомления, которые публикуются другими приложениями в строке состояния.Итак, я сделал кнопку.Нажатие на кнопку вызовет метод executeButtonClick(). Мой код :

public void executeButtonClick(View view) {
    NLService nlService = new NLService();
    if(nlService.getActiveNotifications()!=null) {
        Toast.makeText(MainActivity.this,"InsideIf",Toast.LENGTH_SHORT).show();
        for (StatusBarNotification sbn : nlService.getActiveNotifications()) {
            String temp = "Package Name: " + sbn.getPackageName() +
                    "\n" + "Title: " + sbn.getNotification().extras.getString("android.title") + "\n" +
                    "Text: " + sbn.getNotification().extras.getCharSequence("android.text");
            String newText = textView.getText().toString() + temp;
            textView.setText(newText);

        }
    }
}

Но уведомление не отображается, и я получаю исключение нулевого указателя:

"Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference"

в следующемстрока: activity.executeButtonClick(com.example.asus.notificationtest.MainActivity.textView);

метода onNotificationPosted(), упомянутого ниже:

public class NLService extends NotificationListenerService {

Context context;

@Override
public void onCreate() {
    super.onCreate();
    context = getApplicationContext();
}

@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    if(MainActivity.textView != null)
        activity.executeButtonClick(com.example.asus.notificationtest.MainActivity.textView);
    //Toast.makeText(this,"Post from: "+sbn.getPackageName(),Toast.LENGTH_SHORT).show();
}

@Override
public void onNotificationRemoved(StatusBarNotification sbn) {
    //Toast.makeText(this,"Post from: "+sbn.getPackageName(),Toast.LENGTH_SHORT).show();
}

1 Ответ

0 голосов
/ 28 сентября 2018

Есть несколько шагов для того, чтобы заставить работать службу прослушивания уведомлений?Обнаруживаются ли уведомления вообще?

Шаги: 1) Запросить разрешение в манифесте (например):

  <service android:name=".TheNotificationListener"
    android:label="NotifiationListener"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
        <action android:name="android.service.notification.NotificationListenerService" />
    </intent-filter>

2) Запросить разрешение на выполнение у пользователя:

   private void assessPermissions() {
    if(isPermissionRequired()){
        requestNotificationPermission();
    }else{
        startBackground();
    }
}

public boolean isPermissionRequired() {
    ComponentName cn = new ComponentName(this, TheNotificationListener.class);
    String flat = Settings.Secure.getString(this.getContentResolver(), "enabled_notification_listeners");
    final boolean enabled = flat != null && flat.contains(cn.flattenToString());
    return !enabled;
}

private void requestNotificationPermission() {
    Intent intent=new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
    startActivityForResult(intent, 101);
}

СОВЕТ: Убедитесь, что вы удалили операции привязки из службы прослушивания уведомлений!Мне потребовался день, чтобы понять, что у меня не должно быть этого кода там.

...