Android仅第二次拨打电话

时间:2018-12-11 20:58:47

标签: android variables call speech-to-text

因此,我正在使用语音助手创建“语音转文本”应用。我正在尝试建立电话呼叫功能,以便用户可以说出一个电话号码,然后它将拨打电话。

我快到了,但是电话号码只有第二次才响。第一次显示“呼叫未发送”。

我知道原因是什么;当用户说出号码时,它不会先更新变量,然后再调用“ call”函数。我已经尝试了几乎所有内容,但无法正确更新变量。

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中(其位置表示result.get0),然后在该阶段更新“ num”变量并将其转换为字符串。 然后运行dialPhoneNumber

现在,假设我是第一次运行它并说“ 07123456789”,它会说call not sent,因为它试图调用默认的123,如果我再说一次或使用其他号码则它会会响起07123456789

如何以及为什么在调用电话功能之前不更新?

1 个答案:

答案 0 :(得分:0)

基于danny117的评论...

promptSpeechInput();

        try {
            Thread.sleep(18000);

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

promptSpeechInput开始一个新活动,该活动的结果是口头文字?如果正确,那么为什么要提示输入,睡眠18秒钟(顺便说一句,不要在主线程上睡眠),然后假设输入准备就绪?就像danny所说的,提示输入应该是if block做的最后一件事。拨号应从onActivityResult开始。

此外,为什么默认电话号码为“ 123”?那将永远是不正确的,因此不是明智的默认选择。重申一下,如果您使线程在固定的时间内进入睡眠状态以等待其他事件发生,则几乎肯定会以错误的方式进行处理。而且,如果您要使Android的主线程进入睡眠状态,那绝对是错误的做法。