текст в речь не работает в 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 2

2 ответа:

Вы вызываете stopSelf() до того, как метод speak имеет возможность говорить. Вы должны реализовать OnUtteranceCompletedListener и вызвать stopSelf() внутри onUtteranceCompleted.
Кроме того, метод speakOut(tmp_task_brief); не должен вызываться внутри метода showNotification, поскольку метод speak работает только после вызова метода onInit.

У меня была та же проблема при работе над текстом, чтобы speech.It происходит, когда вы отключили Google text-to-speech на своем устройстве. Попробуйте обновить Google text-to-speech или включить его.