文本到语音不能在android中工作

时间:2013-05-31 06:25:18

标签: android text-to-speech

我对主人的问候。我目前正在开发一个类似于“待办事项列表”的应用程序。我已成功实施获取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 个答案:

答案 0 :(得分:2)

在发言方法有机会发言之前,请致电stopSelf()。您应该实施OnUtteranceCompletedListener并在stopSelf()内拨打onUtteranceCompleted 此外,speakOut(tmp_task_brief);方法不应调用showNotification,因为speak方法仅在调用onInit后才有效。

答案 1 :(得分:0)

我在处理文本到语音时遇到了同样的问题。当您在设备上禁用Google文字转语音时,就会发生这种情况。 尝试更新Google文本转语音或启用它。