【问题标题】:Why doesn't startActivityForResult() lead to onActivityResult() execution?为什么 startActivityForResult() 不导致 onActivityResult() 执行?
【发布时间】:2019-02-23 14:42:32
【问题描述】:

仍在尝试制作我的屏幕记录应用程序。我继续使用 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 为空。使用相同的代码重新启动和重新安装 apk 并没有解决任何问题。

非常感谢您的任何建议。

【问题讨论】:

  • 您是从片段或活动中调用startActivityForResult 吗?
  • 我的项目中没有片段。

标签: java android mediarecorder onactivityresult startactivityforresult


【解决方案1】:

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

【讨论】:

  • 感谢您的回复,但这并没有真正改变任何事情。我在函数的第一个“if”处放置了一个断点,它被忽略了。调试器首先在下一个断点处停止,该断点甚至在另一个类中。
【解决方案2】:

有一个非常简单的解决方案。我刚刚初始化了将 null 放入 mediaRecorder 的 mediaProjection 的记录服务,所以之后我无法重新初始化它。在启动服务之前将调用 onActivivtyResult() 的意图放入活动的 onCreate() 修复了该问题。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多