2017-08-28 72 views
1

我试图让从英语到孟加拉使用Yandex的API翻译应用。的Android翻译应用程序没有在真实设备

它工作正常,在模拟器,但在真实的设备它显示了只有一个文本视图字的结果,但写一个句子时,它显示空/什么。

我认为这个问题是缓冲区溢出,但不知道如何解决它的实际设备。这里有一些参考图片。在仿真结果正常工作:

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

你为什么没有一个侦听器添加到您的示例代码?

尝试MainActivity添加这些对onCreate

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

更新: 有另一个问题。 android sdk 16上的模拟器不能正确显示Unicode。这就是为什么你看不到你的结果,因为那些是Unicodes。试试Log来打印您的resultString

+0

感谢您的答复,但我已经定义的方法对我的按钮onClickListener不是我想这个问题,因为按钮响应我的点击,而是正在发生的事情是代码犯规显示翻译的句子,但只一个简单的单词用于较低的api版本或者我所拥有的设备,正如您在附件中看到的那样。 – Shahriar

+0

那么该程序运行在日志我已检查罚款已经这就是为什么我发现这个奇怪的,它不是我的工作实际的手机上 – Shahriar

+0

看到** **更新我的答复的部分,这里的问题是对Unicode的支持模拟器 –

相关问题