Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android错误:必须从当前推断线程正在工作的ui线程调用方法gettext_Android_Text To Speech_Microsoft Translator - Fatal编程技术网

Android错误:必须从当前推断线程正在工作的ui线程调用方法gettext

Android错误:必须从当前推断线程正在工作的ui线程调用方法gettext,android,text-to-speech,microsoft-translator,Android,Text To Speech,Microsoft Translator,大家好,我是Android新手,我正在构建一个从英语到德语的翻译应用程序,由于遵循以下代码行,我收到了上述错误: 请帮我解决这个问题 package com.exmaple.android.lang_trans; import java.util.Locale; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.speech.tts.Tex

大家好,我是Android新手,我正在构建一个从英语到德语的翻译应用程序,由于遵循以下代码行,我收到了上述错误: 请帮我解决这个问题

package com.exmaple.android.lang_trans;

import java.util.Locale;

import android.app.Activity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.speech.tts.TextToSpeech;

import android.speech.tts.TextToSpeech.OnInitListener;

import android.util.Log;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import com.exmaple.android.lang_trans.R;

import com.memetix.mst.language.Language;

import com.memetix.mst.translate.Translate;

public class MainActivity extends Activity implements OnInitListener {

    private TextToSpeech tts;

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

        tts = new TextToSpeech(this, this);
        ((Button) findViewById(R.id.bSpeak)).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                speakOut(((TextView) findViewById(R.id.tvTranslatedText)).getText().toString());
            }
        });

        ((Button) findViewById(R.id.bTranslate)).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub


                class bgStuff extends AsyncTask<Void, Void, Void> {

                    String translatedText = "";

                    @Override
                    protected Void doInBackground(Void... params) {
                        // TODO Auto-generated method stub
                        try {
                            //below line is throwing the error
                            String text = ((EditText) findViewById(R.id.etUserText)).getText().toString();
                            translatedText = translate(text);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                            translatedText = e.toString();
                        }

                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result) {
                        // TODO Auto-generated method stub
                        ((TextView) findViewById(R.id.tvTranslatedText)).setText(translatedText);
                        super.onPostExecute(result);
                    }

                }

                new bgStuff().execute();
            }
        });
    }

    public String translate(String text) throws Exception {


        // Set the Client ID / Client Secret once per JVM. It is set statically and applies to all services
        Translate.setClientId("CLIENT ID"); //Change this
        Translate.setClientSecret("CLIENT SECRET"); //change


        String translatedText = "";

        translatedText = Translate.execute(text, Language.GERMAN);

        return translatedText;
    }

    @Override
    public void onInit(int status) {
        // TODO Auto-generated method stub
        if (status == TextToSpeech.SUCCESS) {

            int result = tts.setLanguage(Locale.GERMAN);

            if (result == TextToSpeech.LANG_MISSING_DATA
                    || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS", "This Language is not supported");
            } else {

                //speakOut("Ich");
            }

        } else {
            Log.e("TTS", "Initilization Failed!");
        }
    }

    private void speakOut(String text) {
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }

}
package com.exmaple.android.lang\u trans;
导入java.util.Locale;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.speech.tts.TextToSpeech;
导入android.speech.tts.TextToSpeech.OnInitListener;
导入android.util.Log;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
导入com.exmaple.android.lang_trans.R;
导入com.memetix.mst.language.language;
导入com.memetix.mst.translate.translate;
公共类MainActivity扩展活动实现OnInitListener{
私密文本语音tts;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tts=新的TextToSpeech(这个,这个);
((按钮)findViewById(R.id.bSpeak)).setOnClickListener(新OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
speakOut(((TextView)findViewById(R.id.tvTranslatedText)).getText().toString());
}
});
((按钮)findviewbyd(R.id.bTranslate)).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
类bgStuff扩展异步任务{
字符串translatedText=“”;
@凌驾
受保护的Void doInBackground(Void…参数){
//TODO自动生成的方法存根
试一试{
//下面一行是抛出错误
字符串文本=((EditText)findViewById(R.id.etUserText)).getText().toString();
translatedText=翻译(文本);
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
translatedText=e.toString();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
//TODO自动生成的方法存根
((TextView)findViewById(R.id.tvTranslatedText)).setText(translatedText);
super.onPostExecute(结果);
}
}
新建bgStuff().execute();
}
});
}
公共字符串翻译(字符串文本)引发异常{
//为每个JVM设置一次客户机ID/客户机机密。它是静态设置的,并应用于所有服务
Translate.setClientId(“客户端ID”);//更改此设置
Translate.setClientSecret(“客户端密码”);//更改
字符串translatedText=“”;
translatedText=Translate.execute(文本、语言、德语);
返回翻译文本;
}
@凌驾
公共无效onInit(int状态){
//TODO自动生成的方法存根
if(status==TextToSpeech.SUCCESS){
int result=tts.setLanguage(Locale.derman);
if(result==TextToSpeech.LANG_缺少_数据
||结果==TextToSpeech.LANG(不支持){
Log.e(“TTS”,“不支持这种语言”);
}否则{
//说出(“Ich”);
}
}否则{
Log.e(“TTS”,“初始化失败!”);
}
}
专用void扬声器(字符串文本){
tts.speak(text,TextToSpeech.QUEUE\u FLUSH,null);
}
}

您的问题是,您正在访问的UI元素不是android系统不允许的UI线程

您不能从UI线程或“主”线程以外的任何线程更新UI

因此,您可以将onClick函数更改为以下内容:

((Button) findViewById(R.id.bTranslate)).setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        class bgStuff extends AsyncTask<String, Void, String> {
            @Override
            protected String doInBackground(String... params) {
                // TODO Auto-generated method stub
                try {
                    if (params.length > 0) {
                        return translate(params[0]);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    return e.toString();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                ((TextView) findViewById(R.id.tvTranslatedText)).setText(result);
            }
        }

        new bgStuff().execute(((EditText) findViewById(R.id.etUserText)).getText().toString());
    }
});
((按钮)findViewById(R.id.bTranslate)).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
类bgStuff扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//TODO自动生成的方法存根
试一试{
如果(参数长度>0){
返回translate(参数[0]);
}
}捕获(例外e){
e、 printStackTrace();
返回e.toString();
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串结果){
((TextView)findViewById(R.id.tvTranslatedText)).setText(结果);
}
}
新建bgStuff().execute(((EditText)findViewById(R.id.etUserText)).getText().toString());
}
});

如果你的问题已经解决了你的问题,请考虑通过点击复选标记来接受它。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这样做。