Я пытаюсь создать собственный оверлей для своего приложения, который будет скрывать экран, если запущен какой-либо общий доступ к экрану или несанкционированная запись моего приложения.
Проблема в том, что я стараюсь избегать использования FLAG_SECURE, поскольку он не позволяет мне добавлять пользовательские элементы, чтобы информировать пользователя о том, что экран записывается, и показывать им, что происходит.
Я попробовал создать собственную логику, и вот чего я добился. далеко:
Мне удалось создать собственное обнаружение с помощью DisplayManager, чтобы определить, активна ли запись. Однако я нашел обходной путь, который не могу исправить. Если вы начнете запись до входа в приложение, ваш экран не скроется. Запись, начинающаяся вне приложения, не может быть обнаружена. Обнаружение работает только в том случае, если запись начинается, когда приложение находится в фоновом режиме или на экране.
На данный момент я протестировал демонстрацию своего экрана и начало записи, находясь в приложении. Это отлично работает и выглядит очень красиво, информируя пользователя о том, что на самом деле происходит. Но это можно обойти, если перед входом запись начинается вне приложения.
Я читал форумы и пробовал другие подходы, но все говорят, что без FLAG_SECURE это невозможно. Использование FLAG_SECURE также приведет к блокировке снимков экрана, а это не то, чего я хочу. Моя цель — добиться чего-то похожего на то, что реализовал мой коллега по iOS.
Вот код, который я использую:
class ScreenRecordingDetectionManager(private val context: Context) {
private val controller: ScreenSecurityController =
(context as SmartApplication).getScreenSecurityController()
?: throw IllegalStateException("ScreenSecurityController not initialized")
private val displayListener = object : DisplayManager.DisplayListener {
override fun onDisplayAdded(id: Int) {
if (id != Display.DEFAULT_DISPLAY) {
controller.showSecurityOverlay()
}
}
override fun onDisplayRemoved(id: Int) {
if (id != Display.DEFAULT_DISPLAY) {
controller.hideSecurityOverlay()
}
}
override fun onDisplayChanged(id: Int) {}
}
fun startMonitoring() {
val dm = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
dm.registerDisplayListener(displayListener, null)
val handler = android.os.Handler(context.mainLooper)
handler.postDelayed({
val isExternalScreen =
dm.displays.any { it.displayId != Display.DEFAULT_DISPLAY }
val isMediaProjection =
controller.isMediaProjectionRecording()
if (isExternalScreen || isMediaProjection) {
controller.showSecurityOverlay()
}
}, 200)
}
}
class ScreenSecurityController(private val context: Context) :
Application.ActivityLifecycleCallbacks {
private var recordingOverlay: View? = null
private var isRecording = false
fun showSecurityOverlay() {
isRecording = true
applyOverlayToCurrentActivity()
}
fun hideSecurityOverlay() {
isRecording = false
recordingOverlay?.visibility = View.GONE
}
private fun applyOverlayToCurrentActivity() {
if (recordingOverlay != null && recordingOverlay?.parent != null)
return
val activity = (context as? SmartApplication)?.currentActivity ?: return
val root = activity.findViewById(android.R.id.content)
recordingOverlay = LayoutInflater.from(activity)
.inflate(R.layout.screen_recording_overlay, root, false)
root.addView(recordingOverlay)
recordingOverlay?.bringToFront()
recordingOverlay?.visibility = if (isRecording) View.VISIBLE else View.GONE
}
override fun onActivityResumed(activity: Activity) {
if (isRecording) applyOverlayToCurrentActivity()
}
override fun onActivityCreated(a: Activity, b: Bundle?) {}
override fun onActivityStarted(a: Activity) {}
override fun onActivityPaused(a: Activity) {}
override fun onActivityStopped(a: Activity) {}
override fun onActivitySaveInstanceState(a: Activity, outState: Bundle) {}
override fun onActivityDestroyed(a: Activity) {}
@SuppressLint("PrivateApi")
fun isMediaProjectionRecording(): Boolean {
return try {
val service = Class.forName("android.os.SystemProperties")
val getter = service.getMethod("get", String::class.java)
val value = getter.invoke(null, "sys.service.media.projection") as String
value.contains("running", ignoreCase = true)
} catch (e: Exception) {
false
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... -recording
Пользовательское наложение при обнаружении записи устройства ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1766152106
Anonymous
Я пытаюсь создать собственный оверлей для своего приложения, который будет скрывать экран, если запущен какой-либо общий доступ к экрану или несанкционированная запись моего приложения.
Проблема в том, что я стараюсь избегать использования FLAG_SECURE, поскольку он не позволяет мне добавлять пользовательские элементы, чтобы информировать пользователя о том, что экран записывается, и показывать им, что происходит.
Я попробовал создать собственную логику, и вот чего я добился. далеко:
Мне удалось создать собственное обнаружение с помощью DisplayManager, чтобы определить, активна ли запись. Однако я нашел обходной путь, который не могу исправить. Если вы начнете запись до входа в приложение, ваш экран не скроется. Запись, начинающаяся вне приложения, не может быть обнаружена. Обнаружение работает только в том случае, если запись начинается, когда приложение находится в фоновом режиме или на экране.
На данный момент я протестировал демонстрацию своего экрана и начало записи, находясь в приложении. Это отлично работает и выглядит очень красиво, информируя пользователя о том, что на самом деле происходит. Но это можно обойти, если перед входом запись начинается вне приложения.
Я читал форумы и пробовал другие подходы, но все говорят, что без FLAG_SECURE это невозможно. Использование FLAG_SECURE также приведет к блокировке снимков экрана, а это не то, чего я хочу. Моя цель — добиться чего-то похожего на то, что реализовал мой коллега по iOS.
Вот код, который я использую:
class ScreenRecordingDetectionManager(private val context: Context) {
private val controller: ScreenSecurityController =
(context as SmartApplication).getScreenSecurityController()
?: throw IllegalStateException("ScreenSecurityController not initialized")
private val displayListener = object : DisplayManager.DisplayListener {
override fun onDisplayAdded(id: Int) {
if (id != Display.DEFAULT_DISPLAY) {
controller.showSecurityOverlay()
}
}
override fun onDisplayRemoved(id: Int) {
if (id != Display.DEFAULT_DISPLAY) {
controller.hideSecurityOverlay()
}
}
override fun onDisplayChanged(id: Int) {}
}
fun startMonitoring() {
val dm = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
dm.registerDisplayListener(displayListener, null)
val handler = android.os.Handler(context.mainLooper)
handler.postDelayed({
val isExternalScreen =
dm.displays.any { it.displayId != Display.DEFAULT_DISPLAY }
val isMediaProjection =
controller.isMediaProjectionRecording()
if (isExternalScreen || isMediaProjection) {
controller.showSecurityOverlay()
}
}, 200)
}
}
class ScreenSecurityController(private val context: Context) :
Application.ActivityLifecycleCallbacks {
private var recordingOverlay: View? = null
private var isRecording = false
fun showSecurityOverlay() {
isRecording = true
applyOverlayToCurrentActivity()
}
fun hideSecurityOverlay() {
isRecording = false
recordingOverlay?.visibility = View.GONE
}
private fun applyOverlayToCurrentActivity() {
if (recordingOverlay != null && recordingOverlay?.parent != null)
return
val activity = (context as? SmartApplication)?.currentActivity ?: return
val root = activity.findViewById(android.R.id.content)
recordingOverlay = LayoutInflater.from(activity)
.inflate(R.layout.screen_recording_overlay, root, false)
root.addView(recordingOverlay)
recordingOverlay?.bringToFront()
recordingOverlay?.visibility = if (isRecording) View.VISIBLE else View.GONE
}
override fun onActivityResumed(activity: Activity) {
if (isRecording) applyOverlayToCurrentActivity()
}
override fun onActivityCreated(a: Activity, b: Bundle?) {}
override fun onActivityStarted(a: Activity) {}
override fun onActivityPaused(a: Activity) {}
override fun onActivityStopped(a: Activity) {}
override fun onActivitySaveInstanceState(a: Activity, outState: Bundle) {}
override fun onActivityDestroyed(a: Activity) {}
@SuppressLint("PrivateApi")
fun isMediaProjectionRecording(): Boolean {
return try {
val service = Class.forName("android.os.SystemProperties")
val getter = service.getMethod("get", String::class.java)
val value = getter.invoke(null, "sys.service.media.projection") as String
value.contains("running", ignoreCase = true)
} catch (e: Exception) {
false
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79825675/custom-overlay-when-detecting-device-recording[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия