Предотвращение доступа к навигации и панелям состояния в режиме киоска для приложения React Native для Android ⇐ Android
-
Anonymous
Предотвращение доступа к навигации и панелям состояния в режиме киоска для приложения React Native для Android
Я разработал приложение с использованием React Native, которое предназначено для использования на устройствах Android с сенсорным экраном в общедоступных местах. Чтобы обеспечить целенаправленное взаимодействие с пользователем и предотвратить уход пользователей из приложения, я реализовал режим киоска. Однако я столкнулся с проблемой полного ограничения доступа к системным функциям; пользователи по-прежнему могут открывать панель навигации и строку состояния.
Вот особенности моей ситуации:
Окружающая среда: приложение создано с использованием React Native и работает на устройстве Android. Текущая реализация: я включил режим киоска, чтобы ограничить использование приложения одним действием.
AndroidManifest.xml:
MainActivity.Java:
пакет com.teafilterui; импортировать com.facebook.react.ReactActivity; импортировать com.facebook.react.ReactActivityDelegate; импортировать com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; импортировать com.facebook.react.defaults.DefaultReactActivityDelegate; импортировать android.os.Bundle; импортировать android.view.View; импортировать android.view.WindowInsetsController; импортировать android.view.WindowInsets; импортировать androidx.drawerlayout.widget.DrawerLayout; публичный класс MainActivity расширяет ReactActivity { @Override защищенная строка getMainComponentName() { вернуть «TeaFilterUI»; } @Override protected ReactActivityDelegate createReactActivityDelegate() { вернуть новый DefaultReactActivityDelegate( этот, получить ИмяГлавногоКомпонента(), // Если вы выбрали новую архитектуру, мы включаем Fabric Renderer. DefaultNewArchitectureEntryPoint.getFabricEnabled()); } @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); окончательный контроллер WindowInsetsController = getWindow().getInsetsController(); если (контроллер!= ноль) { контроллер.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); контроллер.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_DEFAULT); } } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); если (hasFocus) { окончательный контроллер WindowInsetsController = getWindow().getInsetsController(); если (контроллер!= ноль) { контроллер.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); контроллер.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); } } } @Override общественный недействительный onBackPressed () { } } MainAplication.Java:
пакет com.teafilterui; импортировать android.app.Application; импортировать com.facebook.react.PackageList; импортировать com.facebook.react.ReactApplication; импортировать com.facebook.react.ReactNativeHost; импортировать com.facebook.react.ReactPackage; импортировать com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; импортировать com.facebook.react.defaults.DefaultReactNativeHost; импортировать com.facebook.soloader.SoLoader; импортировать java.util.List; публичный класс MainApplication расширяет приложение, реализует ReactApplication { частный окончательный ReactNativeHost mReactNativeHost = новый DefaultReactNativeHost (это) { @Override общедоступное логическое значение getUseDeveloperSupport() { вернуть BuildConfig.DEBUG; } @Override protected List getPackages() { @SuppressWarnings («Ненужная локальная переменная») Пакеты List = новый PackageList(this).getPackages(); // Пакеты, которые пока нельзя связать автоматически, можно добавить сюда вручную, например: // packages.add(new MyReactNativePackage()); возврат посылок; } @Override защищенная строка getJSMainModuleName() { вернуть «индекс»; } @Override защищенное логическое значение isNewArchEnabled() { вернуть BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; } @Override защищенное логическое значение isHermesEnabled() { вернуть BuildConfig.IS_HERMES_ENABLED; } }; @Override public ReactNativeHost getReactNativeHost() { вернуть mReactNativeHost; } @Override общественная недействительность onCreate() { супер.onCreate(); SoLoader.init(this, /* собственный экзопакет */ false); если (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // Если вы выбрали новую архитектуру, мы загружаем собственную точку входа для этого приложения. DefaultNewArchitectureEntryPoint.load(); } ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); } } BootReceiver.java:
// BootReceiver.java пакет com.teafilterui; импортировать com.teafilterui.MainActivity; импортировать android.content.BroadcastReceiver; импортировать android.content.Context; импортировать android.content.Intent; общественный класс BootReceiver расширяет BroadcastReceiver { @Override public void onReceive (контекст контекста, намерение намерения) { если (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Намерение я = новое намерение (контекст, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(я); } } } Проблема: несмотря на то, что пользователи находятся в режиме киоска, они по-прежнему могут проводить пальцем по панели навигации и строке состояния, открывая тем самым доступ к другим функциям и настройкам устройства. Я ищу способ полностью запретить доступ к строке навигации и состоянию во время работы моего приложения. В идеале пользователи не должны иметь возможности проводить пальцем по экрану или иным образом взаимодействовать с этими элементами системного пользовательского интерфейса, чтобы приложение оставалось на переднем плане, а другие функции устройства оставались недоступными.
Кто-нибудь успешно реализовал такое ограничение в приложении React Native для Android? Мы будем очень признательны за любую информацию, фрагменты кода или ссылки на соответствующую документацию.
Я разработал приложение с использованием React Native, которое предназначено для использования на устройствах Android с сенсорным экраном в общедоступных местах. Чтобы обеспечить целенаправленное взаимодействие с пользователем и предотвратить уход пользователей из приложения, я реализовал режим киоска. Однако я столкнулся с проблемой полного ограничения доступа к системным функциям; пользователи по-прежнему могут открывать панель навигации и строку состояния.
Вот особенности моей ситуации:
Окружающая среда: приложение создано с использованием React Native и работает на устройстве Android. Текущая реализация: я включил режим киоска, чтобы ограничить использование приложения одним действием.
AndroidManifest.xml:
MainActivity.Java:
пакет com.teafilterui; импортировать com.facebook.react.ReactActivity; импортировать com.facebook.react.ReactActivityDelegate; импортировать com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; импортировать com.facebook.react.defaults.DefaultReactActivityDelegate; импортировать android.os.Bundle; импортировать android.view.View; импортировать android.view.WindowInsetsController; импортировать android.view.WindowInsets; импортировать androidx.drawerlayout.widget.DrawerLayout; публичный класс MainActivity расширяет ReactActivity { @Override защищенная строка getMainComponentName() { вернуть «TeaFilterUI»; } @Override protected ReactActivityDelegate createReactActivityDelegate() { вернуть новый DefaultReactActivityDelegate( этот, получить ИмяГлавногоКомпонента(), // Если вы выбрали новую архитектуру, мы включаем Fabric Renderer. DefaultNewArchitectureEntryPoint.getFabricEnabled()); } @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); окончательный контроллер WindowInsetsController = getWindow().getInsetsController(); если (контроллер!= ноль) { контроллер.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); контроллер.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_DEFAULT); } } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); если (hasFocus) { окончательный контроллер WindowInsetsController = getWindow().getInsetsController(); если (контроллер!= ноль) { контроллер.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); контроллер.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); } } } @Override общественный недействительный onBackPressed () { } } MainAplication.Java:
пакет com.teafilterui; импортировать android.app.Application; импортировать com.facebook.react.PackageList; импортировать com.facebook.react.ReactApplication; импортировать com.facebook.react.ReactNativeHost; импортировать com.facebook.react.ReactPackage; импортировать com.facebook.react.defaults.DefaultNewArchitectureEntryPoint; импортировать com.facebook.react.defaults.DefaultReactNativeHost; импортировать com.facebook.soloader.SoLoader; импортировать java.util.List; публичный класс MainApplication расширяет приложение, реализует ReactApplication { частный окончательный ReactNativeHost mReactNativeHost = новый DefaultReactNativeHost (это) { @Override общедоступное логическое значение getUseDeveloperSupport() { вернуть BuildConfig.DEBUG; } @Override protected List getPackages() { @SuppressWarnings («Ненужная локальная переменная») Пакеты List = новый PackageList(this).getPackages(); // Пакеты, которые пока нельзя связать автоматически, можно добавить сюда вручную, например: // packages.add(new MyReactNativePackage()); возврат посылок; } @Override защищенная строка getJSMainModuleName() { вернуть «индекс»; } @Override защищенное логическое значение isNewArchEnabled() { вернуть BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; } @Override защищенное логическое значение isHermesEnabled() { вернуть BuildConfig.IS_HERMES_ENABLED; } }; @Override public ReactNativeHost getReactNativeHost() { вернуть mReactNativeHost; } @Override общественная недействительность onCreate() { супер.onCreate(); SoLoader.init(this, /* собственный экзопакет */ false); если (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { // Если вы выбрали новую архитектуру, мы загружаем собственную точку входа для этого приложения. DefaultNewArchitectureEntryPoint.load(); } ReactNativeFlipper.initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); } } BootReceiver.java:
// BootReceiver.java пакет com.teafilterui; импортировать com.teafilterui.MainActivity; импортировать android.content.BroadcastReceiver; импортировать android.content.Context; импортировать android.content.Intent; общественный класс BootReceiver расширяет BroadcastReceiver { @Override public void onReceive (контекст контекста, намерение намерения) { если (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { Намерение я = новое намерение (контекст, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(я); } } } Проблема: несмотря на то, что пользователи находятся в режиме киоска, они по-прежнему могут проводить пальцем по панели навигации и строке состояния, открывая тем самым доступ к другим функциям и настройкам устройства. Я ищу способ полностью запретить доступ к строке навигации и состоянию во время работы моего приложения. В идеале пользователи не должны иметь возможности проводить пальцем по экрану или иным образом взаимодействовать с этими элементами системного пользовательского интерфейса, чтобы приложение оставалось на переднем плане, а другие функции устройства оставались недоступными.
Кто-нибудь успешно реализовал такое ограничение в приложении React Native для Android? Мы будем очень признательны за любую информацию, фрагменты кода или ссылки на соответствующую документацию.
Мобильная версия