Как отключить приложения для записи звука на Android

Мы разрабатываем приложение для потокового видео.

Поэтому нам нужно обеспечить безопасность аудио- и видеоконтента.

Что я пробовал

Я могу ограничить скриншоты и видеоконтент с помощью следующего кода

Activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);

Но я не могу ограничить запись звука через другие приложения.

Как ограничить запись звука другими приложениями?


person Ranjith Kumar    schedule 03.10.2017    source источник
comment
Я думаю, что это невозможно и полезно. Что, если пользователь записывает звук с помощью внешнего записывающего устройства?   -  person Nabin Bhandari    schedule 03.10.2017
comment
@NabinBhandari Внешнее устройство нам безразлично. Мы хотим предоставить хоть какие-то бумаги. Вот причина этого вопроса.   -  person Ranjith Kumar    schedule 03.10.2017
comment
Если ваше приложение воспроизводится в фоновом режиме, вы ничего не можете сделать, чтобы запретить приложениям записывать ваш звук.   -  person JoxTraex    schedule 03.10.2017
comment
@JoxTraex, когда он переходит в фоновый режим, мы приостанавливаем проигрыватель. Мы хотим ограничить звук только в приложении переднего плана.   -  person Ranjith Kumar    schedule 03.10.2017


Ответы (1)


Я никогда не слышал о таких официальных инструментах в Android, которые упростили бы этот процесс.

Но я думаю, что вы можете указать, что другое приложение записывает звук. Попробуйте использовать для этого MediaRecorder в своем коде. Например, вы создадите его экземпляр с микрофоном (MediaRecorder.AudioSource.MIC) в качестве источника входного сигнала. В качестве индикатора того, что микрофон занят другим приложением, вы поймаете исключение, когда начнете запись (mRecorder.start()). Если вы не поймаете исключение, когда оборудование MIC можно использовать бесплатно. Так что никто не записывает звук сейчас. Идея состоит в том, что вы должны выполнять эту проверку каждый раз, когда ваше приложение выходит на передний план. Например, в обратном вызове жизненного цикла onResume() или onStart(). Например:

@Override
protected void onResume() {
  super.onResume();
  ...
  boolean isMicFree = true;
  MediaRecorder recorder = new MediaRecorder();
  recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
  recorder.setOutputFile("/dev/null");
  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
  ...
  // Configure MediaRecorder
  ...
  try {
      recorder.start();
  } catch (IllegalStateException e) {
      Log.e("MediaRecorder", "start() failed: MIC is busy");

      // Show alert dialogs to user.
      // Ask him to stop audio record in other app.
      // Stay in pause with your streaming because MIC is busy.

      isMicFree = false;
  }

  if (isMicFree) {
    Log.e("MediaRecorder", "start() successful: MIC is free");
    // MIC is free.
    // You can resume your streaming.
  }
  ...
  // Do not forget to stop and release MediaRecorder for future usage
  recorder.stop();
  recorder.release();
}

// onWindowFocusChanged will be executed
// every time when user taps on notifications
// while your app is in foreground.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // Here you should do the same check with MediaRecorder.
    // And you can be sure that user does not
    // start audio recording through notifications.
    // Or user stops recording through notifications.
}

Ваш код не сможет запретить другим приложениям запись. Ваш блок try-catch просто укажет, что микрофон занят. И вы должны попросить пользователя прекратить это действие, потому что это запрещено. И не возобновляйте потоковое вещание, пока микрофон не освободится.

Пример использования MediaRecorder находится здесь.

Как видно из документов, MediaRecorder.start() выдает исключение, если:

Броски

IllegalStateException, если оно вызывается перед prepare() или когда камера уже используется другим приложением.

Я попробовал эту идею на своих образцах. Когда одно приложение получает MIC, другое не может работать с MIC.

  • Плюсы:

    это может быть рабочий инструмент :-))

  • Минусы:

    Ваше приложение должно запрашивать разрешение RECORD_AUDIO. Это может напугать пользователя.

Хочу повторить, что это всего лишь идея.

person Sheikh    schedule 10.10.2017
comment
Привет, Шейх, я только что попробовал твой код. Оба исключения вызываются. Но я не знаю, что мы делаем в этом блоке исключений. После реализации этого кода звук по-прежнему может записываться. - person Ranjith Kumar; 10.10.2017
comment
Кстати, это ваш случай? Вы также хотите ограничить запись с микрофона? - person Sheikh; 10.10.2017
comment
Да. Я хочу ограничить всю аудиозапись в своем приложении. - person Ranjith Kumar; 10.10.2017
comment
Кроме того, я думаю, что это не сработает, если другое приложение уже записывало. - person Endre Börcsök; 10.10.2017
comment
@EndreBörcsök, да, верно! Я попытался объяснить это в ответе, когда редактировал его. Я сказал об индикации того, что другое приложение уже записывает - person Sheikh; 10.10.2017
comment
yureka вау .. хорошее решение. Я предложу тебе свою награду. Но нужна только последняя помощь. . Как узнать, что микрофон будет бесплатным? Потому что с вашим решением я могу поставить плеер на паузу. Но мне нужно возобновить, когда они перестанут записывать. - person Ranjith Kumar; 10.10.2017
comment
@RanjithKumar, пользователю нужно переключиться с вашего приложения на другое, чтобы остановить запись. А это значит, что ваше приложение будет перехватывать обратные вызовы жизненного цикла onPause-›...-›onResume. Так, например, когда пользователь возвращается в ваше приложение, вы должны снова создать MediaRecorder в своем onResume. Если микрофон свободен, при возобновлении потоковой передачи. Что-то подобное. - person Sheikh; 10.10.2017
comment
@Шейх хорошо понял. Но Как мы узнаем, что MIC свободен? - person Ranjith Kumar; 10.10.2017
comment
@RanjithKumar, я обновил пример кода в своем ответе. Надеюсь, это поможет вам. - person Sheikh; 10.10.2017
comment
@Шейх большое спасибо .. Сейчас не могу проверить. Я проверю и предложу тебе мою награду завтра. Одно сомнение в том, что в настоящее время большинство приложений для записи отображают элементы управления (запись / остановка / пауза) в уведомлении. Если пользователь остановит запись через уведомление --› onresume никогда не вызывается. любой хак для этого? - person Ranjith Kumar; 10.10.2017
comment
@RanjithKumar, а как насчет обратного вызова onWindowFocusChanged()? :) Он будет выполнен, если ваша активность потеряет и получит фокус. Это может помочь вам, когда пользователь начнет/остановит запись через уведомления. Я обновил свой ответ. - person Sheikh; 10.10.2017
comment
@RanjithKumar, я пробовал это же решение в своей деятельности, но я всегда получаю, что микрофон занят в качестве вывода ... я не запускаю какое-либо приложение в фоновом режиме, а также тот же вывод ... что я могу сделать, чтобы это работало? Почему я не получаю MIC бесплатно в качестве вывода .. Можете ли вы мне помочь - person athul; 09.05.2020
comment
Даже я получаю то же самое... микрофон занят. Любое изменение версии вызвало это, потому что это кажется старым ответом. - person Simal; 26.11.2020