2017-08-28 3 views
1

Ich versuche, eine Übersetzung Anwendung von Englisch nach Bangla mit Yandex API zu machen.Android Übersetzung Anwendung mit Yandex API zeigt Ergebnis in Emulator Textansicht, aber nicht in Real Gerät

Es funktioniert gut im Emulator, aber in der realen Gerät zeigt es Ergebnis für nur ein Wort in der Textansicht, aber beim Schreiben eines Satzes zeigt es null/nichts.

Ich denke, das Problem ist Pufferüberlauf, aber weiß nicht, wie man es für das reale Gerät beheben kann. Hier sind einige Referenzbilder. In dem Emulator arbeitet das Ergebnis in Ordnung:

In the emulator the result works fine

In der realen Gerät zeigt es leer in Textansicht:

In the real device it shows empty in text view

Aber es funktioniert gut, wenn ein einzelnes Wort in realen Gerät verwendet wird, . Hier

ist der Code für meine AsyncTask:

public class 

    TranslatorBackgroundTask extends AsyncTask<String, Void, String> { 
    //Declare Context 
    Context ctx; 
    //Set Context 
    TranslatorBackgroundTask(Context ctx){ 
     this.ctx = ctx; 
    } 

    String resultString; 

    @Override 
    protected String doInBackground(String... params) { 
     //String variables 
     String textToBeTranslated = params[0]; 
     String languagePair = params[1]; 

     String jsonString; 

     try { 
      //Set up the translation call URL 
      String yandexKey = "trnsl.1.1.20170823T130435Z.79a583874abfc8ff.61e23593359fdc92452e69a3d5ec05347fc4180b"; 
      String yandexUrl = "https://translate.yandex.net/api/v1.5/tr.json/translate?key=" + yandexKey 
        + "&text=" + textToBeTranslated + "&lang=" + languagePair; 
      URL yandexTranslateURL = new URL(yandexUrl); 

      //Set Http Conncection, Input Stream, and Buffered Reader 
      HttpURLConnection httpJsonConnection = (HttpURLConnection) yandexTranslateURL.openConnection(); 
      InputStream inputStream = httpJsonConnection.getInputStream(); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

      //Set string builder and insert retrieved JSON result into it 
      StringBuilder jsonStringBuilder = new StringBuilder(); 
      while ((jsonString = bufferedReader.readLine()) != null) { 
       jsonStringBuilder.append(jsonString + "\n"); 
      } 

      //Close and disconnect 
      try { 
       bufferedReader.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      inputStream.close(); 
      httpJsonConnection.disconnect(); 

      //Making result human readable 
      resultString = jsonStringBuilder.toString().trim(); 

      //Getting the characters between [ and ] 

      resultString = resultString.substring(resultString.indexOf('[')+1); 
      resultString = resultString.substring(0,resultString.indexOf("]")); 

      //Getting the characters between " and " 
      resultString = resultString.substring(resultString.indexOf("\"")+1); 
      resultString = resultString.substring(0,resultString.indexOf("\"")); 

      Log.d("Translation Result:", resultString); 
      return jsonStringBuilder.toString().trim(); 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    //String text = String.valueOf(resultString); 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     MainActivity.tvTranslatedText.setText(resultString); 
     Toast.makeText(ctx, resultString, Toast.LENGTH_LONG).show(); 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 

Und der Code für die Haupttätigkeit:

public class MainActivity extends AppCompatActivity{ 

    Context context=this; 
    private static final int REQUEST_CODE = 1234; 
    static TextView tvTranslatedText; 
    EditText etUserText; 
    Button buTranslate; 
    Button buSpeak; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.layout_activity_main); 
      tvTranslatedText = (TextView)findViewById(R.id.tvTranslatedText); 
      etUserText = (EditText)findViewById(R.id.etUserText); 

      buTranslate = (Button)findViewById(R.id.buTranslate); 

      buSpeak = (Button)findViewById(R.id.buSpeak); 
     } 



    public void buTranslate(View view) { 
     //Default variables for translation 
     String textToBeTranslated = ""; 
     textToBeTranslated= etUserText.getText().toString(); 
     String languagePair = "en-bn"; //English to bengali ("<source_language>-<target_language>") 
     //Executing the translation function 
     Translate(textToBeTranslated,languagePair); 

    } 


    //Function for calling executing the Translator Background Task 
    void Translate(String textToBeTranslated, String languagePair){ 
     TranslatorBackgroundTask translatorBackgroundTask= new TranslatorBackgroundTask(context); 

     String translationResult = ""; 

     translationResult = String.valueOf(translatorBackgroundTask.execute(textToBeTranslated,languagePair)); // Returns the translated text as a String 
     Log.d("Translation Result",translationResult); // Logs the result in Android Monitor 

    } 

    //Speak button activities 

    public void buSpeak(View view) { 
     startVoiceRecognitionActivity(); 
    } 

    private void startVoiceRecognitionActivity() 
    { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speak to translate"); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 

    /** 
    * Handle the results from the voice recognition activity. 
    */ 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { 

      if (data != null) { 

       //pull all of the matches 
       ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 

       String topResult = matches.get(0); 

       EditText AutoText = (EditText) findViewById(R.id.etUserText); 
       AutoText.setText(topResult); 
      } 
     } 
    } 
} 

Die Fehlermeldung:

Verursacht durch: com.google .android.apps.gsa.shared.exception.GsaIOException: Fehlercode: 393238 | Pufferüberlauf, kein verfügbarer Speicherplatz

Antwort

0

Warum haben Sie Ihrem Beispielcode keinen Listener hinzugefügt?

versuchen, diese auf onCreate in MainActivity Zugabe:

buTranslate.setOnClickListener(
    new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      buTranslate(view); 
     } 
    } 
); 

Update: Es war ein anderes Thema. Emulatoren auf Android SDK 16 zeigen Unicode nicht korrekt an. Deshalb sehen Sie Ihre Ergebnisse nicht, da dies Unicodes sind. Versuchen Sie Log, um Ihre resultString zu drucken.

+0

Danke für die Antwort, aber wie ich bereits die Methode für meine Schaltfläche definiert, ist der onClickListener nicht das Problem, denke ich, wie die Schaltfläche auf meinen Klick reagiert, aber was passiert, ist der Code zeigt nicht den übersetzten Satz aber nur ein einzelnes Wort für niedrigere API-Versionen oder die Geräte, die ich habe, wie Sie in den beigefügten Bildern sehen können. – Shahriar

+0

Nun, das Programm funktioniert gut im Log Ich habe das bereits überprüft, deshalb finde ich das komisch, dass es nicht funktioniert auf meinem eigentlichen Telefon – Shahriar

+0

siehe den Abschnitt ** Updated meiner Antwort, das Problem ist hier Unicode-Unterstützung für Emulatoren –

Verwandte Themen