我会先添加代码。
class Child
include Mongoid::Document
include Mongoid::Paperclip
embedded_in :parent, inverse_of: :childrens
has_mongoid_attached_file :photo,
path: "parent/:id_parent/child/:id/:filename"
Paperclip.interpolates :id_parent do |attachment, style|
return attachment.instance.parent.id.to_s
end
end
我正在努力使用TextToSpeech实例。
当我点击按钮时,它说话。
但是,当我直接使用TextToSpeech实例调用speak()方法时,它根本就不会说话。
调用单击按钮时调用的speakOut()方法也不起作用。
我不知道为什么会这样。
答案 0 :(得分:1)
单击按钮时 方法工作的原因是因为 onClickListener()和 onClick()强>方法。
相反,该行
myTTS.speak("Why doesn't this work?", TextToSpeech.QUEUE_FLUSH, null);
没有Android可以触发的侦听器/方法调用。所以基本上要解决这个问题,你需要在事件监听器中调用上面的方法,例如 onTouchEvent()或 onClickListener()。
答案 1 :(得分:1)
TextToSpeech
构造函数启动与该服务的连接,该服务位于另一个进程中。在建立连接之前,您创建的TTS对象不可用。在侦听器的onInit()
方法中报告连接的状态。您需要保留在那里报告的状态,以了解服务何时可用。
我稍微重复了你的例子,并添加了日志语句来演示行为。
public class MainActivity extends Activity {
private static final String TAG = "Demo";
TextToSpeech myTTS;
boolean mInitComplete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate()");
setContentView(R.layout.activity_main);
Button btnSpeak = (Button)findViewById(R.id.button1);
btnSpeak.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
speakOut("You pressed the button");
}
});
}
private void speakOut(String msg) {
if (mInitComplete) {
int status = myTTS.speak(msg, TextToSpeech.QUEUE_FLUSH, null);
if (status == TextToSpeech.SUCCESS) {
Log.i(TAG, "speakOut(): SUCCESS");
} else {
Log.i(TAG, "speakOut(): ERROR");
}
} else {
Log.i(TAG, "speakOut(): TTS Not Initialized");
}
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume()");
myTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
mInitComplete = true;
Log.i(TAG, "onInit(): TTS Initialized");
} else {
Log.i(TAG, "onInit(): TTS Init Failed");
}
}
});
speakOut("This will fail because TTS init is not complete");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause()");
myTTS.shutdown();
mInitComplete = false;
}
}
答案 2 :(得分:1)
如果出现btnSpeak
时尽可能快地按UI
,speakOut
方法也会失败。在调用Text To Speech
之前,您无法调用speak
方法onInit
。在speak
之前调用onInit
方法并不违法,但您可以看到没有任何反应。
致电speakOut
发言并启用btnSpeak
中的onInit
。如果在调用bntSpeak
之前启用并按下onInit
,则不会听到任何内容。如果互联网很慢,这很容易发生。