为什么startActivityForResult()无法导致onActivityResult()执行?

时间:2019-02-23 14:42:32

标签: java android mediarecorder onactivityresult startactivityforresult

仍然尝试制作我的屏幕记录应用。正如我前段时间告诉我的那样,我一直在与MediaRecorder一起工作,所以我陷入了另一个问题。

我只需要初始化一个MediaProjection对象以使我的代码正常工作,这就是我在onActivityResult()中所做的,因为它是用this guide编写的:

@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为null。重新启动并重新安装具有相同代码的apk并不能解决任何问题。

非常感谢您的任何建议。

3 个答案:

答案 0 :(得分:0)

您的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();
}

答案 1 :(得分:0)

有一个非常简单的解决方案。我只是初始化了将null放入mediaRecorder的mediaProjection中的记录服务,因此之后我无法重新初始化它。在启动服务之前,将调用onActivivtyResult()的意图放入活动的onCreate()中。

答案 2 :(得分:0)

我遇到了同样的问题。这可能与线程有关。在我的项目中,我启动了一个活动,然后打开活动尝试启动chrome intent。 Chrome浏览器以调试模式打开,但未打开实模式。 我在打开Chrome时添加了一个延迟

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