java - Android 状态栏通知

标签 java android

如何在Llipop或以上设备中获取通知的完整内容。 我无法通过此获取通知详细信息,例如通知中的按钮和图标。

@Override
public void onNotificationPosted(StatusBarNotification sbn) {
    String pack = sbn.getPackageName();
    String ticker ="";
    if(sbn.getNotification().tickerText !=null) {
        ticker = sbn.getNotification().tickerText.toString();
    }

    Bundle extras = sbn.getNotification().extras;
    String title = extras.getString("android.title");
    String text = extras.getCharSequence("android.text").toString();
    Log.i("Package",pack);
    Log.i("Ticker",ticker);
    Log.i("Title",title);
    Log.i("Text",text);

    Intent msgs = new Intent("Msg");
    msgs.putExtra("package", pack);
    msgs.putExtra("ticker", ticker);
    msgs.putExtra("title", title);
    msgs.putExtra("text", text);
    LocalBroadcastManager.getInstance(context).sendBroadcast(msgs);
}

最佳答案

据我所知,您没有创建通知。在应用程序中收到通知后,您需要一个通知生成器。

因此,在广播接收者中,您需要创建要在状态栏中显示的通知,如下所示。

// Inside your broadcast receiver 
int notificationID = new Random().nextInt();
Intent intent = new Intent(mContext, YourHomeActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, notificationID, intent, PendingIntent.FLAG_ONE_SHOT);

Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext)
        .addAction(R.drawable.ic_prev, "BUTTON 1", myIntentToButtonOneScreen)
        .addAction(R.drawable.ic_pause, "BUTTON 2", myIntentToButtonTwoScreen)  // #1
        .addAction(R.drawable.ic_next, "BUTTON 3", myIntentToButtonThreeScreen) 
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(title)
        .setContentText(message)
        .setAutoCancel(true)
        .setSound(defaultSoundUri)
        .setContentIntent(pendingIntent);

if (result != null)
    notificationBuilder.setLargeIcon(result);

NotificationManager notificationManager =
        (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationID, notificationBuilder.build());

这只是一个示例代码,可能不起作用。但这只是为了给您一个想法。请关注this developer documentation为了更好的理解。

更新

根据请求通知监听器服务的评论,以下是有关如何监听发送到您的手机的通知的示例代码。考虑到您已经使用了 Firebase 云消息传递。

public class FCMListenerService extends FirebaseMessagingService {
    private FCMNotificationResponse mFcmNotificationResponse;
    private RemoteMessage.Notification notification;

    private Map data;
    private String from;

    @Override
    public void onMessageReceived(RemoteMessage message) {
        parseRemoteMessage(message);
    }

    private void parseRemoteMessage(RemoteMessage message) {
        from = message.getFrom();
        data = message.getData();
        notification = message.getNotification();

        Logger.logD("Message", "From: " + from);

        // Check if message contains a data payload.
        if (data.size() > 0) {
            Logger.logD("Data", "Message data payload: " + data.toString());
            setNotificationResponseFromData(data);
        }

        createNotification(this, notification.getTitle(), notification.getBody(), mFcmNotificationResponse.getIcon());
    }

    // Here you parse the JSON body received from notification
    private void setNotificationResponseFromData(Map data) {
        Gson gson = new Gson();
        JsonElement jsonElement = gson.toJsonTree(data);
        mFcmNotificationResponse = gson.fromJson(jsonElement, FCMNotificationResponse.class);
    }

    private void createNotification(Context context, String title, String message, String imageUrl) {
        new CreateNotificationAsyncTask(context, title,
                message, imageUrl).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    }
}

onMessageReceived 函数在收到通知时调用。然后您需要解析数据并相应地创建通知。

关于java - Android 状态栏通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48676281/

相关文章:

java - Java 中 URLEncoder 的意外输出

java - 来自字符串的数据源

android - 在 Kotlin 中处理推送通知

android - ADB 连接到 Android TV/Nvidia Shield TV?

android - 如何获得 MANAGE_EXTERNAL_STORAGE 权限

java - 如何在 Spring MVC 的 Controller 中使用 DAO?

java - "Cannot find symbol"- 具有 main 方法的类可以从其他类之一调用方法,但不能从其他第二个类调用方法?

java - DocuSign 异常处理

java.lang.NumberFormatException : Invalid long: ""

java - 在android中POST后检索网站