2016-02-07 2 views
6

Я пытаюсь реализовать распознавание речи без стандартного диалога (он отлично работает с диалогом).Распознавание речи Android Недостаточное разрешение (код ошибки 9)

Я получаю код ошибки 9, как только я пытаюсь начать слушать.

Мое устройство LG G Stylo (работает под управлением Android 6.0).

Manifest:

<manifest package="example.com.myapplication" 
     xmlns:android="http://schemas.android.com/apk/res/android"> 
<uses-permission android:name="android.permission.RECORD_AUDIO"/> 
<application 
..... 

(также попытался добавить разрешение INTERNET несмотря на то, что не должно быть необходимым, поскольку отсутствует признание должно работать)

build.gradle:

compileSdkVersion 23 
buildToolsVersion "23.0.2" 

defaultConfig { 
    applicationId "example.com.appname" 
    minSdkVersion 19 
    targetSdkVersion 23 
    versionCode 1 
    versionName "1.0" 
} 

речи код признания:

private SpeechRecognizer speechRecognizer; 

protected void onCreate(Bundle savedInstanceState) { 
    speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this); 
    speechRecognizer.setRecognitionListener(new speech_listener()); 
    Intent intent = new intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
    RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, 
     getApplication().getPackageName()); 
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ENGLISH); 
    speechRecognizer.startListening(intent); 

Слушатель (внутренний) класс:

class speech_listener implements RecognitionListener 
{ 
    public void onReadyForSpeech(Bundle params){} 
    public void onBeginningOfSpeech(){} 
    public void onRmsChanged(float rmsdB){} 
    public void onBufferReceived(byte[] buffer){} 
    public void onEndOfSpeech(){} 
    public void onError(int error){ 
    Log.d("Speech", "error: " + error); 
    } 
    public void onResults(Bundle results) 
    { 
    ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
    String answer = (String)data.get(0); 
    processAnswer(answer); 
    } 
    public void onPartialResults(Bundle partialResults){} 
    public void onEvent(int eventType, Bundle params){} 
} 

Любое понимание будет оценено.

ответ

10

На Android 6 это разрешение является одним из опасных, что означает, что вам нужно попросить пользователя подтвердить его (на самом деле приобрести). Проверьте this и this для более подробной информации.

13

Добавление к Sam's answer: Если вы разрабатываете приложение на Android 6, вам может не потребоваться одобрить «опасное» разрешение на запись звука (микрофон), поэтому вам нужно вручную открыть приложение в настройках и предоставить разрешение.

Screenshot of manually granting app permission