我对主人的问候。我目前正在开发一个类似于“待办事项列表”的应用程序。我已成功实施获取Notifications
。我试图实现文本到语音,以使Sony Xperia Tipo Dual ST21i2
在我预定的时间内说出我添加的任务。但我从手机上听不到任何声音。
public class NotifyService extends Service implements OnInitListener{
private TextToSpeech tts;
int task_id;
private static final int NOTIFICATION = 123;
public static final String INTENT_NOTIFY = "com.blundell.tut.service.INTENT_NOTIFY";
private NotificationManager mNM;
SQLiteDatabase database;
String tmp_task_brief = null;
public class ServiceBinder extends Binder
{
NotifyService getService()
{
return NotifyService.this;
}
}
@Override
public void onCreate() {
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
tts = new TextToSpeech(getApplicationContext(), this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
task_id = intent.getIntExtra("task_id", 0);
loadDatabase();
Cursor cursor = database.query("task_info", new String[]{"task_brief"}, "task_id=?", new String[]{task_id+""}, null, null, null);
while(cursor.moveToNext())
{
tmp_task_brief = cursor.getString(0);
}
cursor.close();
database.close();
if(intent.getBooleanExtra(INTENT_NOTIFY, false))
showNotification(tmp_task_brief);
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private final IBinder mBinder = new ServiceBinder();
private void showNotification(String tmp_task_brief) {
CharSequence title = "To Do Task Notification!!";
int icon = R.drawable.ic_menu_notifications;
CharSequence text = tmp_task_brief;
long time = System.currentTimeMillis();
Notification notification = new Notification(icon, text, time);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, TaskDetails.class), 0);
notification.setLatestEventInfo(this, title, text, contentIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
mNM.notify(NOTIFICATION, notification);
//---------vibrate on notification-----------
Vibrator vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
int dot = 200;
int dash = 500;
int short_gap = 200;
int medium_gap = 500;
int long_gap = 1000;
long[] pattern = {
0, // Start immediately
dot, short_gap, dot, short_gap, dot, // s
medium_gap,
dash, short_gap, dash, short_gap, dash, // o
medium_gap,
dot, short_gap, dot, short_gap, dot, // s
long_gap
};
// Only perform this pattern one time (-1 means "do not repeat")
vibrate.vibrate(pattern, -1);
speakOut(tmp_task_brief);
stopSelf();
}
void loadDatabase()
{
database = openOrCreateDatabase("ToDoDatabase.db",
SQLiteDatabase.OPEN_READWRITE, null);
}
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US);
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.i("TTS", "This Language is not supported");
Toast.makeText(getApplicationContext(), "This Language is not supported", Toast.LENGTH_SHORT).show();
} else {
speakOut(tmp_task_brief);
}
} else {
Log.i("TTS", "Initilization Failed!");
}
}
@Override
public void onDestroy() {
// Don't forget to shutdown tts!
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
private void speakOut(String task) {
tts.speak(task, TextToSpeech.QUEUE_FLUSH, null);
}
}
我记录了输出错误如下:
05-31 11:49:00.450: I/TextToSpeech(11621): Sucessfully bound to com.google.android.tts
05-31 11:49:00.490: W/TextToSpeech(11621): speak failed: not bound to TTS engine
05-31 11:49:00.490: I/TextToSpeech(11621): Connected to ComponentInfo{com.google.android.tts/com.google.android.tts.GoogleTTSService}
请帮我解决此错误。
答案 0 :(得分:2)
在发言方法有机会发言之前,请致电stopSelf()
。您应该实施OnUtteranceCompletedListener
并在stopSelf()
内拨打onUtteranceCompleted
此外,speakOut(tmp_task_brief);
方法不应调用showNotification
,因为speak
方法仅在调用onInit
后才有效。
答案 1 :(得分:0)
我在处理文本到语音时遇到了同样的问题。当您在设备上禁用Google文字转语音时,就会发生这种情况。 尝试更新Google文本转语音或启用它。