Android звонит только во второй раз - PullRequest
0 голосов
/ 11 декабря 2018

Итак, я создаю приложение 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 (где написано results.get0), а затем на этом этапе я обновляю переменную num и преобразую ее в строку.Затем он запускает dialPhoneNumber

Теперь, скажем, я запускаю его в первый раз и говорю «07123456789», он скажет call not sent, потому что он пытается вызвать значение по умолчанию 123, если я говорю это снова илидругой номер, по которому он будет звонить 07123456789.

Как и почему он не обновляется до вызова функции телефона?

1 Ответ

0 голосов
/ 12 декабря 2018

На основании комментария danny117 ...

promptSpeechInput();

        try {
            Thread.sleep(18000);

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

promptSpeechInput начинает новое действие, и результатом этого действия является устный текст?Если это так, то почему вы запрашиваете ввод данных, спите в течение 18 секунд (кстати, никогда не спите в главном потоке), а затем предполагаете, что ваш ввод готов?Как говорит Дэнни, запрос на ввод должен быть последним, что делает блок.Набор номера должен начинаться с onActivityResult.

Кроме того, почему по умолчанию используется номер телефона «123»?Это никогда не будет правильным, поэтому это не разумное значение по умолчанию.И еще раз повторюсь: если вы укладываете поток в спящий режим на определенное время, ожидая чего-то еще, вы почти наверняка подойдете к нему неправильно.И если вы помещаете основной поток в Android, вы делаете это неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...