我有一个Android电视应用程序,它的主要功能是在用户观看电视时向他们显示实时通知。我实际上使用了以下代码向用户显示通知;
View layout = View.inflate(MyApp.getAppContext(), R.layout.notification_layout, null);
TextView text = layout.findViewById(R.id.notification_text);
text.setText(mMessage);
ImageView image = layout.findViewById(R.id.notification_image);
image.setImageResource(mImageId);
Toast toast = new Toast(MyApp.getAppContext());
toast.setGravity(Gravity.TOP | Gravity.END, 30, 30);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
但正如安卓所说,setGravity方法不再适用于运行API30或更高版本的设备。https://developer.android.com/reference/android/widget/Toast#setGravity(int,%20int,%20int(
作为我申请的详细流程;
- 我使用firebase云消息服务从Android电视应用程序获取实时事件
- 当我将数据发送到
https://fcm.googleapis.com/fcm/send
URL时,Android电视应用程序可以从FirebaseMessagingService
类的onMessageReceived
函数中获取消息。(我发送数据消息而不是通知消息,因为我知道安卓电视没有通知尝试。( - 当我从电视应用程序收到数据消息后,我会使用上面的代码显示通知
现在,由于Android API级别的限制,我无法显示通知,但我必须向用户显示通知或类似通知的内容,因为这是我的应用程序的主要功能。现在,当用户正在看电视和应用程序在后台运行时,我该如何通知他们。谢谢
我已经使用WindowManager接口处理了这个问题。我的新通知显示器如下所示;
WindowManager mWindowManager = (WindowManager) MyApp.getAppContext().getSystemService(MyApp.getAppContext().WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.RIGHT;
params.x = 0;
params.y = 100;
View layout = View.inflate(MyApp.getAppContext(), R.layout.notification_layout, null);
TextView text = layout.findViewById(R.id.notification_text);
text.setText(mMessage);
ImageView image = layout.findViewById(R.id.notification_image);
image.setImageResource(mImageId);
mWindowManager.addView(layout, params);
当我的应用程序在后台运行时,此界面需要用户权限才能显示通知。当我从电视的应用程序菜单中授予Display over other apps
权限时,我的应用程序的通知功能运行良好。
我还在清单中添加了以下权限;
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />