Все еще пытаюсь сделать приложение для записи экрана. Я продолжаю работать с 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 с тем же кодом ничего не исправили.
Большое спасибо за любые предложения.
У меня нет фрагментов в моем проекте.




Ваш 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();
}
Спасибо за ответ, но на самом деле это ничего не изменило. Я поставил точку останова в первом «если» функции, и она была просто проигнорирована. Отладчик сделал первую остановку на следующей точке останова, даже если она находится в другом классе.
Нашлось очень простое решение. Я только что инициализировал службу записи, которая поместила нуль в mediaProjection mediaRecorder, поэтому после этого я не смог ее повторно инициализировать. Помещение намерения, которое вызвало onActivivtyResult() в onCreate() активности перед запуском службы, исправило это.
У меня такая же проблема. Это может быть связано с потоками. В моем проекте я начал действие, и открытие действия попыталось запустить хромированное намерение. Chrome открывается в режиме отладки, но не открывается в реальном режиме. Я добавил задержку при открытии хрома
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
startAuth();
}
}, 100);
Вы звоните
startActivityForResultиз фрагмента или активности?