2

我向大师们问好。我目前正在开发一个类似于“待办事项列表”的应用程序。我已经成功实现了获取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}

请帮我解决这个错误。

4

2 回答 2

2

stopSelf()在 speak 方法有机会说话之前调用。你应该在里面实现OnUtteranceCompletedListener和调用。 此外,不应在方法内部调用,因为方法仅在调用后才有效。stopSelf()onUtteranceCompleted
speakOut(tmp_task_brief);showNotificationspeakonInit

于 2013-05-31T06:35:41.887 回答
0

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

于 2015-07-30T06:09:34.403 回答