текст в речь не работает в android
Мои приветствия мастерам. В настоящее время я работаю над приложением, похожим на "список дел". Я успешно реализовал для получения 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}
Пожалуйста, помогите мне решить эту ошибку.
2 ответа:
Вы вызываете
stopSelf()
до того, как метод speak имеет возможность говорить. Вы должны реализоватьOnUtteranceCompletedListener
и вызватьstopSelf()
внутриonUtteranceCompleted
.
Кроме того, методspeakOut(tmp_task_brief);
не должен вызываться внутри методаshowNotification
, поскольку методspeak
работает только после вызова методаonInit
.