Не работает Speech Library на Android API 23+

222
22 октября 2017, 20:07

Использую библиотеку Speech для реализации "Сири" xD Вот код:

private Button speechBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    speechBtn = (Button) findViewById(R.id.btnSpeech);
    speechBtn.setOnClickListener(this);
    Speech.init(this, getPackageName());
}
@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.btnSpeech:
            try {
                // you must have android.permission.RECORD_AUDIO granted at this point
                Speech.getInstance().startListening(new SpeechDelegate() {
                    @Override
                    public void onStartOfSpeech() {
                    }
                    @Override
                    public void onSpeechRmsChanged(float value) {
                    }
                    @Override
                    public void onSpeechPartialResults(List<String> results) {
                    }
                    @Override
                    public void onSpeechResult(String result) {
                        if (result.equals("Закрой приложение"))
                            System.exit(0);
                        else if (result.equals("Скажи привет"))
                            Speech.getInstance().say("Привет");
                        //и т.д. и т.п.
                        else
                            Speech.getInstance().say("Неизвестная команда");
                    }
                });
            }catch (SpeechRecognitionNotAvailable exc) {
                Log.e("speech", "Speech recognition is not available on this device!");
            } catch (GoogleVoiceTypingDisabledException exc) {
                Log.e("speech", "Google voice typing must be enabled!");
            }
    }
}

На API 22- при нажатии на кнопку работает все отлично. Слушает - делает что скажу и т.д. В общем все ОК. Тестил на Marshmallow(23) происходит следующая шняга - срабатывает слушатель и в ту же секунду воспроизводится else - "Неизвестная команда". Т.е. кликнул на кнопку он сразу воспроизвел else, т.е. даже не прослушав. Это потому что на этом месте("// you must have android.permission.RECORD_AUDIO granted at this point") отсутствует вот такой код:

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
                }else{
                    //продолжаем работу или вызываем метод или класс
                }

Т.е. должно быть так? :

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
            } else {
                try {
                    Speech.getInstance().startListening(new SpeechDelegate() {
                        @Override
                        public void onStartOfSpeech() {
                        }
                        @Override
                        public void onSpeechRmsChanged(float value) {
                        }
                        @Override
                        public void onSpeechPartialResults(List<String> results) {
                        }
                        @Override
                        public void onSpeechResult(String result) {
                            if (result.equals("Закрой приложение"))
                                System.exit(0);
                            else if (result.equals("Скажи привет"))
                                Speech.getInstance().say("Привет");
                                //и т.д. и т.п.
                            else
                                Speech.getInstance().say("Неизвестная команда");
                        }
                    });
                } catch (SpeechRecognitionNotAvailable speechRecognitionNotAvailable) {
                    speechRecognitionNotAvailable.printStackTrace();
                } catch (GoogleVoiceTypingDisabledException e) {
                    e.printStackTrace();
                }
            }

Хотя на 5.1 работало не то что без проверки на разрешение, даже без самого прописанного в ручную разрешения робило. В общем... в этом дело все?

READ ALSO
Обращение к функции из fragment

Обращение к функции из fragment

Ребят, помогите решить проблемуЧтобы воспользоваться функцией, ее надо сделать статичной

157
Где почитать или кто может рассказать что такое DataModel в jsf

Где почитать или кто может рассказать что такое DataModel в jsf

Знакомая сдаёт экзамен и у неё такой вопрос DataModel в jsfС ним никогда не работал и прочитав доках, как понял объяснил, а препод ей сказал что...

332
Удалить несколько строк из JTable и БД

Удалить несколько строк из JTable и БД

Необходимо сделать так, чтобы можно было выделить левой кнопкой несколько строк в JTable и по правой кнопке удалять выделенные строки из таблицы...

307