Aufgenommener Text lässt sich nicht einen EditText schreiben

  • Antworten:7
  • Bentwortet
floor
  • Forum-Beiträge: 6

16.12.2018, 13:47:16 via Website

Hallo Android Community,
und zwar ich habe folgendes Problem, beim Bestätigen eines Buttons öffnet sich mein Mikro und ich kann etwas sagen, dies soll nun in einen EditText geschrieben werden, doch das tut es nicht.

In Android Studio wird mir ebenso die Zeile

resultCode == RESULT_OK

orange angekreidet.

Hier mal mein Java Quellcode.

import android.content.Intent;
import android.speech.RecognizerIntent;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

private static final int rC = 100;

private Button btn;
private EditText tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    btn = (Button) findViewById(R.id.btn);
    tv1 =  (EditText) findViewById(R.id.tv1);
}
@Override
protected void onStart() {
    super.onStart();
}

@Override
protected void onResume() {
    super.onResume();

    btn.setOnClickListener(new BerechnenButtonClicked());
}


class BerechnenButtonClicked implements View.OnClickListener {


    @Override
    public void onClick(View v) {
        speak();
    }
}

private void speak() {
    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_PROMPT, "Jetzt sprechen!");

    try {
        startActivityForResult(intent, 100);

    } catch (Exception e) {
        Toast.makeText(getApplicationContext(),"" +e.getMessage(), Toast.LENGTH_LONG).show();

    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);


    switch (resultCode) {
        case rC: {
            try {
                if (resultCode == RESULT_OK || null != data) {

                    ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                    tv1.setText(result.get(0));
                }
                break;
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(),"" +e.getMessage(), Toast.LENGTH_LONG).show();
            }

        }

    }
}

}

Wo liegt mein Fehler, damit ich das aufgenommene auch in einen EditText schreiben kann.
Wenn ihr mir helfen könnt, bin ich euch super dankbar.

Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

23.12.2018, 19:11:35 via Website

Hi also nach meinem Verständnis ist schon mal die Abfrage in der switch etwas unsinnig.

switch (resultCode) {
case rC: {
try {
if (resultCode == RESULT_OK || null != data) {
Im switsch fragst du mit der case nach einem resultcode=rC=100

und in der anschließenden if wieder nach resultcode=Ok.

Der Code in der IF wir somit nie ausgeführt werden.

Ich denke du willst in der switsh nach dem requestcode fragen, der auch 100 oder rC annehmen kann. Und resultcode liefert dir Ok wenn alles in Ordnung war beim intent.

switch (requestCode) {
case rC: {
try {
if (resultCode == RESULT_OK || null != data) {

So sollte es sicherlich aussehen

Hilfreich?
floor
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.12.2018, 14:03:34 via Website

Hallo floor,

die Konstatante RESULT_OK ist in deiner Klasse nicht verfügbar, da du für den Listener und Speech Teil einen eigene Klasse machst, die nicht von Activity erbt.
Daher musst du die Konstante so angeben: Activity.RESULT_OK
Das sollte dann gehen.

PS: null != data wenn du deinen Code so schreibst, ist das echt komisch. Eigentlich macht man ein NullCheck immer data != null, denn du wilst ja data gegen null prüfen und nicht null gegen Data.
Aussagenlogisch ist es zwar das gleiche, kann aber beim Codelesen zu verwirrung führen...

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
floor
  • Forum-Beiträge: 6

23.12.2018, 17:46:52 via Website

Servus Pascal,
erstmal danke für deine schnelle Antwort.

Ich habe die Konstante zu

resultCode == Activity.RESULT_OK

geändert, doch dies wird immer noch orange angekreidet. Kann mir da jemand helfen, denn ich denke mein Fehler liegt genau da.

Und dann habe ich noch meinen Nullcheck umgeschrieben zu

data != null

ich hoffe, dies geht soweit in Ordnung.

Ich bin euch dankbar, wenn ihr mir mein Problem erläutern könntet und mir einen Lösungvorschlag macht.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.12.2018, 18:29:20 via Website

Hallo floor,

was zeigt AS genau als Fehler?
Die Glaskugle gibt sonst nicht viel her ;)

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
floor
  • Forum-Beiträge: 6

23.12.2018, 18:46:19 via Website

Wenn ich mit der Maus drüber fahre, also über meinen Fehler da erscheint diese Fehlermeldung.

Condition 'resultCode == Activity.RESULT_OK && data != null' is always 'false' less... (Strg+F1)
This inspection analyzes method control and data flow to report possible conditions that are always true or false, expressions whose value is statically proven to be constant, and situations that can lead to nullability contract violations.
Variables, method parameters and return values marked as @Nullable or @NotNull are treated as nullable (or not-null, respectively) and used during the analysis to check nullability contracts, e.g. report NullPointerException (NPE) errors that might be produced.
More complex contracts can be defined using @Contract annotation, for example:
@Contract(", null -> null") — method returns null if its second argument is null @Contract(", null -> null; _, !null -> !null") — method returns null if its second argument is null and not-null otherwise @Contract("true -> fail") — a typical assertFalse method which throws an exception if true is passed to it
The inspection can be configured to use custom @Nullable
@NotNull annotations (by default the ones from annotations.jar will be used)

Hilfreich?
Kommentieren
Beste Antwort
Jokel
  • Forum-Beiträge: 1.530

23.12.2018, 19:11:35 via Website

Hi also nach meinem Verständnis ist schon mal die Abfrage in der switch etwas unsinnig.

switch (resultCode) {
case rC: {
try {
if (resultCode == RESULT_OK || null != data) {
Im switsch fragst du mit der case nach einem resultcode=rC=100

und in der anschließenden if wieder nach resultcode=Ok.

Der Code in der IF wir somit nie ausgeführt werden.

Ich denke du willst in der switsh nach dem requestcode fragen, der auch 100 oder rC annehmen kann. Und resultcode liefert dir Ok wenn alles in Ordnung war beim intent.

switch (requestCode) {
case rC: {
try {
if (resultCode == RESULT_OK || null != data) {

So sollte es sicherlich aussehen

Hilfreich?
floor
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

23.12.2018, 20:25:13 via Website

Ich hatte meine Antwort angefangen zu schreiben bevor du den Fehler gepostet hast. Aber das was du gepostet hat ist genau das was ich dir schon erklärt habe . Das der Code nie ausgeführt wird, und das hat der Compiler auch festgestellt .

Hilfreich?
Kommentieren
floor
  • Forum-Beiträge: 6

23.12.2018, 21:37:27 via Website

Ai, dies ist mir noch garne aufgefallen.
Danke für deine hilfreich Antwort, jetzt funktioniert das ganze auch.:)

Hilfreich?
Kommentieren