Почему startActivityForResult() не приводит к выполнению onActivityResult()?

Все еще пытаюсь сделать приложение для записи экрана. Я продолжаю работать с MediaRecorder, как мне сказали некоторое время назад, поэтому я застрял с другой проблемой.

Мне просто нужно инициализировать объект MediaProjection, чтобы мой код работал, это то, что я делаю в onActivityResult(), как это написано в это руководство:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RECORD_REQUEST_CODE && resultCode == RESULT_OK) {
        mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
        screenRecorder.setMediaProject(mediaProjection);
    }
}

setMediaProjection() выглядит так

public void setMediaProject(MediaProjection project) {
    mediaProjection = project;
}

, так что это не должно вызвать никаких проблем.

И вот как я пытаюсь вызвать onActivityResult():

/* start transmission */
        if (screenRecorder.isRunning()) {
            screenRecorder.stopRecord();
        } else {
            Intent captureIntent = mediaProjectionManager.createScreenCaptureIntent();
            startActivityForResult(captureIntent, RECORD_REQUEST_CODE);
        }

Забавно и безумно то, что когда я впервые запустил отладку, она сработала! После startActivityForResult() я добрался до onActivityResult() и инициализировал mediaProjection: мой телефон показал мне диалоговое окно, разрешаю ли я захват экрана или нет, поэтому я разрешил это и получил специальный символ (что-то вроде экрана с отображаемыми волнами) на моем статус бар.

Но через несколько мгновений я обнаружил проблему при остановке записи и перезапустил сеанс отладки, чтобы отследить ее более точно. После этого onActivityResult() просто игнорируется: вызывается startActivityForResult(), отображается диалоговое окно, но после разрешения записи onActivityResult() полностью пропускается, а mediaProjection равен нулю. Перезапуск и повторная установка apk с тем же кодом ничего не исправили.

Большое спасибо за любые предложения.

Вы звоните startActivityForResult из фрагмента или активности?

Ge3ng 23.02.2019 16:32

У меня нет фрагментов в моем проекте.

E-Newman 23.02.2019 16:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
879
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваш onActivityResult что-то делает только тогда, когда код результата в порядке, попробуйте следующее:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RECORD_REQUEST_CODE && resultCode == RESULT_OK) {
        mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, data);
        screenRecorder.setMediaProject(mediaProjection);
    } else { 
      //TODO: Do something 
        Toast.makeText(getBaseContext(), "Result code is not RESULT_OK, ", Toast.LENGTH_LONG).show();
}

Спасибо за ответ, но на самом деле это ничего не изменило. Я поставил точку останова в первом «если» функции, и она была просто проигнорирована. Отладчик сделал первую остановку на следующей точке останова, даже если она находится в другом классе.

E-Newman 23.02.2019 16:30
Ответ принят как подходящий

Нашлось очень простое решение. Я только что инициализировал службу записи, которая поместила нуль в mediaProjection mediaRecorder, поэтому после этого я не смог ее повторно инициализировать. Помещение намерения, которое вызвало onActivivtyResult() в onCreate() активности перед запуском службы, исправило это.

У меня такая же проблема. Это может быть связано с потоками. В моем проекте я начал действие, и открытие действия попыталось запустить хромированное намерение. Chrome открывается в режиме отладки, но не открывается в реальном режиме. Я добавил задержку при открытии хрома

final Handler handler = new Handler(Looper.getMainLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            startAuth();
        }
    }, 100);

Другие вопросы по теме