Я создаю приложение для видеовызовов для Android, используя React Native, где уведомление FCM только для данных поступает в фоновом режиме, когда экран заблокирован (приложение может быть на переднем плане, в фоне или убито). В фоновом режиме уведомление запускает приложение, которое представляет пользовательский интерфейс для взаимодействия с пользователем, но само видимое уведомление также сохраняется, когда телефон разблокируется.
Поскольку приложение предоставляет собственный пользовательский интерфейс, я не хочу, чтобы уведомление было видимым. Как я могу скрыть уведомление в этом случае?
Уведомление должно оставаться видимым, если оно получено, когда телефон разблокирован, но приложение работает в фоновом режиме (в данный момент работает).
I нанял Java разработчика для создания этой функциональности, так как я JavaScript разработчик с небольшими Java знаниями, поэтому мое понимание того, как это работает, ограничено.
Вот единственный класс в моем MainActivity.java
:
public class MainActivity extends ReactActivity {
/**
* Returns the name of the main component registered from JavaScript. This is
* used to schedule rendering of the component.
*/
@Override
protected String getMainComponentName() {
return "x";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
setTurnScreenOn(true);
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
}
}
ActivityStarterReactPackage. java:
public class ActivityStarterReactPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new ActivityStarterModule(reactContext));
return modules;
}
public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
ActivityStarterModule. java
public class ActivityStarterModule extends ReactContextBaseJavaModule {
ActivityStarterModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Nonnull
@Override
public String getName() {
return "ActivityStarter";
}
@ReactMethod
void navigateToExample(String notificationMessage) {
ReactApplicationContext context = getReactApplicationContext();
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder builder;
Resources res = context.getResources();
// начиная с Android 8, требуются каналы уведомлений
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
String CHANNEL_ID = "channel_ID_0";
// https://developer.android.com/training/notify-user/channels
// https://medium.com/exploring-android/exploring-android-o-notification-channels-94cd274f604c
// https://startandroid.ru/ru/uroki/vse-uroki-spiskom/515-urok-190-notifications-kanaly.html
// https://code.tutsplus.com/ru/tutorials/android-o-how-to-use-notification-channels--cms-28616
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "channel",
NotificationManager.IMPORTANCE_HIGH);
channel.setDescription("channel description");
manager.createNotificationChannel(channel);
builder = new NotificationCompat.Builder(context, CHANNEL_ID);
} else {
builder = new NotificationCompat.Builder(context);
}
// Flag indicating that if the described PendingIntent already exists, the
// current one should be canceled before generating a new one.
Intent activityIntent = new Intent(context, MainActivity.class);
activityIntent.putExtra("FromNotification", true);
PendingIntent action = PendingIntent.getActivity(context, 0, activityIntent, PendingIntent.FLAG_CANCEL_CURRENT);
// make this notification automatically dismissed when the use touches it
builder.setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_announcement_black_24dp))
.setSmallIcon(R.drawable.ic_announcement_black_24dp).setTicker("Large text!").setAutoCancel(true)
.setContentTitle(notificationMessage).setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_CALL).setContentText("Tap to answer or reject the call")
.setFullScreenIntent(action, true);
Notification notification = builder.build();
int notificationCode = (int) (Math.random() * 1000);
manager.notify(notificationCode, notification);
}
}
Извиняюсь за дамп кода, но я не 100% уверены, какой код имеет непосредственное отношение. Я также могу вставить MainApplication.java
.
Большое спасибо заранее!