2016-10-27 8 views
1

Ich möchte in der Lage sein, Spracherkennung in Codename One Apps bei der Verwendung von Android zu integrieren, so entschied ich mich, ein kleines Beispiel zu erstellen. Hier ist, was ich getan habe:Spracherkennung einfaches Beispiel auf Android in Codename One

ich eine neue App erstellt und dann folgte ich dann this link, so habe ich eine Schnittstelle für den nativen Zugriff:

public interface SpeechRecognition extends NativeInterface { 
    void startListening(); 
    String getResult(); 
} 

Die Hauptform wie folgt aussieht:

SpeechRecognition speechRecognition = NativeLookup.create(SpeechRecognition.class); 

    Form hi = new Form("Hi World"); 
    Button startButton = new Button("start"); 
    Button stopButton = new Button("stop"); 
    Label label = new Label("non"); 
    startButton.addActionListener(event -> { 
     if (speechRecognition != null && speechRecognition.isSupported()) { 
      speechRecognition.startListening(); 
     } 
    }); 

    stopButton.addActionListener(event -> { 
     if (speechRecognition != null && speechRecognition.isSupported()) { 
      label.setText(speechRecognition.getResult()); 
     } 
    }); 
    hi.addComponent(startButton); 
    hi.addComponent(stopButton); 
    hi.addComponent(label); 
    hi.show(); 

Grundsätzlich möchte ich immer wenn ich auf "Start" klicke, die Spracherkennung starten zu hören, und beim Stoppen - die Beschriftung mit dem erkannten Ergebnis zu aktualisieren. Dann erzeugen ich nativen Zugriff und in der Android-Implementierung verwenden ich folgende:

public class SpeechRecognitionImpl { 
//maybe use a getter for message to get the last event 
static String message = ""; 
static String speech = ""; 
private SpeechRecognizer sr; 

public void startListening() { 
    //initialize the Intent 

    final Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault()); 

    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
      RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); 
    //number of guesses 
    intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 3); 
    //Speechrecognition must be run on main Thread 

    Activity activity = AndroidNativeUtil.getActivity(); 
    activity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      sr = SpeechRecognizer.createSpeechRecognizer(AndroidNativeUtil.getActivity()); 
      sr.setRecognitionListener(new listener()); 
      sr.startListening(intent); 
     } 
    }); 
} 


public String getResult() { 
    return speech; 
} 

public boolean isSupported() { 
    return true; 
} 

class listener implements RecognitionListener { 

    public void onReadyForSpeech(Bundle params) { 
     message = "onReadyForSpeech"; 
    } 

    public void onBeginningOfSpeech() { 
     message = "onBeginningOfSpeech"; 
    } 

    public void onRmsChanged(float rmsdB) { 
     message = "onRmsChanged"; 
    } 

    public void onBufferReceived(byte[] buffer) { 
     message = "onBufferReceived"; 
    } 

    public void onEndOfSpeech() { 
     message = "onEndofSpeech"; 
    } 

    public void onError(int error) { 
     message = "error " + error; 
    } 

    public void onResults(Bundle results) { 
     //here you have what google understand from the speech 
     //maybe only save the first guess, which would have the highest 
     //possibility 
     speech += "on results"; 
     String str = ""; 

     ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     for (int i = 0; i < data.size(); i++) { 

      str += data.get(i)+";"; 
     } 
     speech += str; 
    } 

    public void onPartialResults(Bundle partialResults) { 
     message = "onPartialResults"; 

    } 

    public void onEvent(int eventType, Bundle params) { 

     message = "onEvent " + eventType; 
    } 
} 

Dieses im Grunde das Beispiel eingefügte Kopie wird, dass „sollte“ zu arbeiten. Wenn ich es jedoch auf meiner Android-App ausführe, passiert absolut nichts. Hat jemand Erfolg damit gehabt?

Antwort

0

Sie müssen die App mit DDMS ausführen und die Protokolle der App anzeigen. Ich schätze, Sie haben nur knapp vergessen, dem Manifest mithilfe der Build-Hinweise eine Berechtigung hinzuzufügen.

+1

Hinzufügen Build-Hinweis android.xpermissions = löste das Problem. –