2017-08-28 3 views
1

Yandex APIを使用して英語からBanglaへの翻訳アプリケーションを作成しようとしています。yandex apiを使用してエミュレータのテキストビューで結果を表示するが、実際のデバイスでは表示されない翻訳アプリケーション

エミュレータでは問題なく動作しますが、実際のデバイスではテキスト表示の単語が1語だけ表示されますが、文章を書くときにはnull/nothingと表示されます。

私は問題がバッファオーバーフローだと思うが、実際のデバイスのためにそれを修正する方法を知らない。ここにいくつかの参考画像があります。エミュレータでは結果が正常に動作します:実際のデバイスで

In the emulator the result works fine

それがテキストビューに空を示しています。

In the real device it shows empty in text view

しかし、単一ワードが実際のデバイスで使用されるとき、それは正常に動作します。ここで

は私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); 
    } 
} 

そして主な活動のためのコード:

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); 
      } 
     } 
    } 
} 

エラーメッセージ:com.google:によって引き起こさ

.android.apps.gsa.shared.exception.GsaIOException:エラーコード:393238 |バッファオーバーフロー、使用可能なスペースがありません。

答えて

0

サンプルコードにリスナーを追加していないのはなぜですか? MainActivityonCreateにこれらを追加すること

試してみてください。

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

更新: 別の問題がありました。 android sdk 16のエミュレータは、Unicodeを適切に表示しません。それはUnicodeなので、なぜ結果が表示されないのですか? resultStringを印刷するには、Logをお試しください。

+0

返信いただきありがとうございますが、私のボタンのメソッドを既に定義しているので、ボタンがクリックに応答しているので、onClickListenerは問題ではありませんが、何が起きているのかは、下位APIバージョンのための1つの単語、またはあなたが付属の画像で見ることができるように私が持っているデバイス。 – Shahriar

+0

よくプログラムは正常に動作するログで私はそれが私の実際の電話で動作していないこの奇妙なことを発見していることを既に確認している – Shahriar

+0

私の返信の**更新**セクションを参照してください、ここでの問題はユニコードのサポートですエミュレータ –

関連する問題