webentwicklung-frage-antwort-db.com.de

Android-Vordergrunddienstbenachrichtigung wird nicht angezeigt

Ich versuche einen Vordergrunddienst zu starten. Ich werde benachrichtigt, dass der Dienst gestartet wird, die Benachrichtigung jedoch immer unterdrückt wird. Ich habe überprüft, ob die App Benachrichtigungen in den App-Informationen auf meinem Gerät anzeigen darf. Hier ist mein Code:

private void showNotification() {
    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            notificationIntent, 0);

    Bitmap icon = BitmapFactory.decodeResource(getResources(),
            R.mipmap.ic_launcher);

    Notification notification = new NotificationCompat.Builder(getApplicationContext())
            .setContentTitle("Revel Is Running")
            .setTicker("Revel Is Running")
            .setContentText("Click to stop")
            .setSmallIcon(R.mipmap.ic_launcher)
            //.setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
            .setContentIntent(pendingIntent)
            .setOngoing(true).build();
    startForeground(Constants.FOREGROUND_SERVICE,
            notification);
    Log.e(TAG,"notification shown");

}

Hier ist der einzige Fehler, den ich im Zusammenhang sehe: 06-20 12:26:43.635 895-930/? E/NotificationService: Suppressing notification from the package by user request.

8
Dreamers Org

Das Problem war, dass ich Android O verwende und es brauche mehr Informationen. Hier ist der erfolgreiche Code für Android O.

    mNotifyManager = (NotificationManager) mActivity.getSystemService(Context.NOTIFICATION_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) createChannel(mNotifyManager);
    mBuilder = new NotificationCompat.Builder(mActivity, "YOUR_TEXT_HERE").setSmallIcon(Android.R.drawable.stat_sys_download).setColor
            (ContextCompat.getColor(mActivity, R.color.colorNotification)).setContentTitle(YOUR_TITLE_HERE).setContentText(YOUR_DESCRIPTION_HERE);
    mNotifyManager.notify(mFile.getId().hashCode(), mBuilder.build());

@TargetApi(26)
private void createChannel(NotificationManager notificationManager) {
    String name = "FileDownload";
    String description = "Notifications for download status";
    int importance = NotificationManager.IMPORTANCE_DEFAULT;

    NotificationChannel mChannel = new NotificationChannel(name, name, importance);
    mChannel.setDescription(description);
    mChannel.enableLights(true);
    mChannel.setLightColor(Color.BLUE);
    notificationManager.createNotificationChannel(mChannel);
}
13
Dreamers Org

Dies liegt an den Einschränkungen von Android-OGG-Diensten.

Sie müssen startForeground() also nur für Dienste aufrufen, die mit startForegroundService() gestartet wurden, und diese in den ersten 5 Sekunden nach dem Start des Dienstes aufrufen.

Hier ist der Leitfaden - https://developer.Android.com/about/versions/oreo/background#services

So was:

//Start service:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  startForegroundService(new Intent(this, YourService.class));
} else {
  startService(new Intent(this, YourService.class));
}

Dann erstellen und zeigen Sie eine Benachrichtigung an (mit dem Kanal, wie es früher angenommen wurde):

private void createAndShowForegroundNotification(Service yourService, int notificationId) {

    final NotificationCompat.Builder builder = getNotificationBuilder(yourService,
         "com.example.your_app.notification.CHANNEL_ID_FOREGROUND", // Channel id
    NotificationManagerCompat.IMPORTANCE_LOW); //Low importance prevent visual appearance for this notification channel on top 
    builder.setOngoing(true)
    .setSmallIcon(R.drawable.small_icon)
    .setContentTitle(yourService.getString(R.string.title))
    .setContentText(yourService.getString(R.string.content));

    Notification notification = builder.build();

    yourService.startForeground(notificationId, notification);

    if (notificationId != lastShownNotificationId) {
          // Cancel previous notification
          final NotificationManager nm = (NotificationManager) yourService.getSystemService(Activity.NOTIFICATION_SERVICE);
          nm.cancel(lastShownNotificationId);
    }
    lastShownNotificationId = notificationId;
}

public static NotificationCompat.Builder getNotificationBuilder(Context context, String channelId, int importance) {
    NotificationCompat.Builder builder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        prepareChannel(context, channelId, importance);
        builder = new NotificationCompat.Builder(context, channelId);
    } else {
        builder = new NotificationCompat.Builder(context);
    }
    return builder;
}

@TargetApi(26)
private static void prepareChannel(Context context, String id, int importance) {
    final String appName = context.getString(R.string.app_name);
    String description = context.getString(R.string.notifications_channel_description);
    final NotificationManager nm = (NotificationManager) context.getSystemService(Activity.NOTIFICATION_SERVICE);

    if(nm != null) {
        NotificationChannel nChannel = nm.getNotificationChannel(id);

        if (nChannel == null) {
            nChannel = new NotificationChannel(id, appName, importance);
            nChannel.setDescription(description);
            nm.createNotificationChannel(nChannel);
        }
    }
}

Denken Sie daran, dass Ihre Vordergrundbenachrichtigung den gleichen Status wie Ihre anderen Benachrichtigungen hat, selbst wenn Sie andere Kanal-IDs verwenden, sodass sie als Gruppe mit anderen ausgeblendet werden kann. Verwenden Sie verschiedene Gruppen, um dies zu vermeiden.

11
v1k

Wenn keiner der oben genannten Punkte funktioniert, sollten Sie prüfen, ob Ihre Benachrichtigungs-ID 0 ... Es kann nicht 0 sein.

Vielen Dank an @Luka Kama für this post

startForeground(0, notification); // Doesn't work...

startForeground(1, notification); // Works!!!
0
DoruChidean

Bei mir war alles richtig eingestellt (außerdem wurde die Berechtigung FOREGROUND_SERVICE hinzugefügt, um zu manifestieren), aber ich musste nur die App deinstallieren und neu installieren.

0
Hanoch Moreno

wenn Sie auf Android 9(Pie) api Level 28 und höher zielen, sollten Sie die FOREGROUND_SERVICE-Berechtigung in der Manifestdatei erteilen. Siehe folgenden Link: https://developer.Android.com/about/versions/pie/ Android-9.0-Migration # bfa

0
Sanjay