Android只打电话第二次工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android只打电话第二次工作相关的知识,希望对你有一定的参考价值。

所以我正在使用语音助手制作一个Speech to Text应用程序。我正在尝试拨打电话功能,以便用户可以拨打电话号码,然后拨打电话。

我几乎就在那里,但这个数字只在我第二次说话时响了。第一次说“呼叫未发送”。

我想出了这个的原因;当用户说出号码时,它不首先更新变量然后调用“呼叫”功能。我已经尝试了几乎所有东西,但它没有正确更新变量。

private TextView txtSpeechInput;
public String num = "123";

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case REQ_CODE_SPEECH_INPUT: {
                if (resultCode == RESULT_OK && null != data) {

                    ArrayList<String> result = data
                            .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    txtSpeechInput.setText(result.get(0).replaceAll("\s+", ""));
                    num = txtSpeechInput.getText().toString();
                }
                break;
            }

        }
    }

public void dialPhoneNumber(String phone) {
        Intent intent = new Intent(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:" + phone));
        if (intent.resolveActivity(getPackageManager()) != null) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
                startActivity(intent);
            }
           return ;
        }
    }


private void processResult(String command) {
        command = command.toLowerCase();

    if(command.indexOf("time") != -1) {
        Date now = new Date();
        String time = DateUtils.formatDateTime(this, now.getTime(), DateUtils.FORMAT_SHOW_TIME);
        speak("The time is " + time);
    }
    if(command.indexOf("date") != -1) {
        String date = DateFormat.getDateInstance().format(new Date());
        speak("The date is " + date);
    }
    else if (command.indexOf("open") != -1) {
        if(command.indexOf("browser") != -1) {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.uk/"));
            startActivity(intent);
        }
    }
    if(command.indexOf("call") != -1) {
        promptSpeechInput();

        try {
            Thread.sleep(18000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        dialPhoneNumber(num);
    }
}

在这段代码中,当用户说“拨打电话”时,它会打开另一个提示语音输入。将它存储在txtSpeechInput(它表示results.get0),然后在那个阶段我更新“num”变量并将其转换为字符串。然后运行dialPhoneNumber

现在让我们说我第一次运行它并说“07123456789”,它会说call not sent因为它试图调用默认的123,如果我再说一遍或不同的数字然后它将响铃07123456789

在拨打电话功能之前,如何以及为何不更新?

答案

基于danny117的评论......

promptSpeechInput();

        try {
            Thread.sleep(18000);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        dialPhoneNumber(num);

promptSpeechInput开始一项新活动,该活动的结果是口头文本?如果这是正确的,那么为什么你提示输入,睡眠18秒(顺便说一下,不要在主线程上睡觉),然后假设你的输入准备好了?正如丹尼所说,提示输入应该是if块的最后一件事。拨打号码应该从onActivityResult开始。

另外,为什么默认电话号码为“123”?这永远不会是正确的,因此不是明智的默认。并且重申一下,如果你让线程在一段固定的时间内等待其他事情发生,你几乎肯定会以错误的方式接近它。如果你让主线程在android中睡觉,你绝对是错误的做法。

以上是关于Android只打电话第二次工作的主要内容,如果未能解决你的问题,请参考以下文章

第二次写博客

第二次在对话框中膨胀片段时出错

Android - 如何录制简单的声音片段?

android小知识点代码片段

使用选项卡第二次返回片段显示空白片段

Swift UICollectionView 工作奇怪,只注册第二次点击