使用yandex api的Android翻译应用程序在模拟器文本视图中显示结果,但在真实设备中没有

问题描述 投票:2回答:1

我正在尝试使用Yandex API从英语到孟加拉语翻译应用程序。

它在模拟器中工作正常但在真实设备中它只显示文本视图中的一个单词的结果,但在写一个句子时它显示为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 |缓冲区溢出,没有可用空间。

java android yandex-api translators
1个回答
0
投票

为什么不在示例代码中添加监听器?

尝试在onCreateMainActivity上添加这些:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.