【问题标题】:How to get the result from OnActivityResult inside another class?(outside of the activity如何从另一个类中的 OnActivityResult 获取结果?(在活动之外
【发布时间】:2021-08-27 01:38:31
【问题描述】:

我在非活动类中启动语音识别活动(通过传入活动)这是代码:

private static void startVoiceRecognitionActivity() {
        // TODO Auto-generated method stub
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Talk");
                myActivity.startActivityForResult(intent, REQUEST_CODE);
    }

最后一行myActivity 是我传递给具有此方法的类的活动。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (final EditText editText : editTextHandlingList) {
        if (requestCode == REQUEST_CODE && resultCode == theActivity.RESULT_OK) {
            ArrayList<String> results = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                        //log the result            }
    }
}

现在的问题是onActivityResult 方法。我希望能够在同一个班级而不是在活动中获得结果。 如果不清楚,请向我提问..

当我将活动传递给这个班级时,有什么办法可以做到这一点吗?应该有办法在外面处理这个.. 有什么问题可以问我。

【问题讨论】:

  • 所以您从 myActivity 开始语音识别并希望在其他地方接收结果?在哪里?
  • 我将问题中的所有代码都放在一个类中。
  • 并不含糊;你不能那样做。如果你能解释为什么你想也许你会得到一个更有用的答案。

标签: android


【解决方案1】:

我知道这是一个老问题,但在新 api 的帮助下它很简单:

myActivity.registerForActivityResult(StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        // There are no request codes
        val data: Intent? = result.data
        doSomeOperations()
    }
}.launch(yourIntent)

【讨论】:

    【解决方案2】:
    I want to be able to get the result back inside the same class and not 
    in the activity.
    

    不行,如果不执行你的活动,你真的无法得到结果,因为当另一个活动完成时,startActivityForResult 与你的活动绑定。

    解决方案:

    由于您在另一个班级中有您的myActivity,您可以使用其中的Intent 从您开始VoiceRecognition 的班级的另一个活动中获取结果。还要确保在 VoiceRecognition 活动完成后调用它。

    样本:

    myActivity.getIntent().getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
    

    【讨论】:

    • 我不明白“您可以使用 Intent 从中获取其他活动的结果。”您能详细说明一下吗?
    • @Vivere_FlowCoder 假设您已经完成了您的 VoiceRecognition 活动,因为活动的意图具有来自它的信息,只需从您的类中调用 getIntent
    • 我使用了 'ArrayList results = myActivity.getIntent().getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);'就在“myActivity.startActivityForResult(intent, REQUEST_CODE);”之后,但我得到了 nullpointerexception..
    • @Vivere_FlowCoder 不,请确保在您返回活动后调用它。不在startActivity 之后
    • 我知道你的意思。但是 VoiceRecognitionActivity 完成后怎么调用呢?或者我回到我的活动后如何调用它?
    【解决方案3】:

    如果我理解了这个问题,你正在尝试做这样的事情:

    有时创建一个封装自定义代码(在这种情况下与语音相关)的实用程序类很有用。实用程序类只是一堆static 方法:

    public static class VoiceRecognitionUtils {
    
        private static void startVoiceRecognitionActivity(Activity myActivity) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
            intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                    RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
            intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                    "Talk");
                    myActivity.startActivityForResult(intent, REQUEST_CODE);
        }
    
        private static void processResult(int requestCode, int resultCode, Intent data) {
            for (final EditText editText : editTextHandlingList) {
                if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
                    ArrayList<String> results = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                }
            }
        }
    }
    

    鉴于该类,您的活动可以从适当的生命周期事件中调用静态方法:

    public class MainActivity extends FragmentActivity {
        // ...
    
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            VoiceRecognitionUtils.processResult(requestCode, resultCode, data);
        }
    
        // call startVoiceRecognitionActivity() somewhere
    
    }
    

    语音识别仍在启动中,Activity 收到的结果(因为 Android 操作系统需要),但技术细节收集在实用程序类中。

    我不确定你的问题是否是你想要做的,但无论如何我都会推荐这种技术,它非常有用。

    【讨论】:

    • 没有。正如我提到的,我不想在 mainActivity 中处理任何事情。我想你没有得到我的问题。我想在另一个类中做所有事情,我将 mainactivity 传递给它以便能够启动语音识别活动
    • @Vivere_FlowCoder 知道了。我以一种允许有用答案的方式解释了这个问题。既然我错了,很遗憾回到我原来的评论:你不能那样做!
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    相关资源
    最近更新 更多