2012-08-03 30 views
0

我提到兩個環節:Android小工具文本到語音不說話

從這兩個環節,我創建了一個的AppWidgetProvider類和服務類,如下所示:

public class HomeWidget extends AppWidgetProvider{ 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    // TODO Auto-generated method stub 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 
    ComponentName thisWidget = new ComponentName(context, 
      HomeWidget.class); 
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    Intent homeIntent = new Intent(context.getApplicationContext(), VoiceService.class); 
    homeIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 
    context.startService(homeIntent); 
    } 
} 

服務:

public class VoiceService extends Service implements OnInitListener{ 
public static TextToSpeech mtts; 
private static final String LOG = "VoiceService"; 
@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
    Log.d(LOG,"Service created successfully!"); 
    mtts = new TextToSpeech(getApplicationContext(),this); 
    mtts.setLanguage(Locale.ENGLISH); 
} 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
    if(mtts!=null) 
     { 
     mtts.stop(); 
     Log.d(LOG,"The service has been destroyed!"); 
    } 
} 

@Override 
public void onStart(Intent intent, int startId) { 
    // TODO Auto-generated method stub 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this 
      .getApplicationContext()); 

    int[] allWidgetIds = intent 
      .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 

    ComponentName thisWidget = new ComponentName(getApplicationContext(), 
      HomeWidget.class); 
    int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 
    Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length)); 
    Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length)); 

    for(int widgetId : allWidgetIds) 
    { 
     Log.w(LOG,"inside for loop"); 
     RemoteViews remoteViews = new RemoteViews(this 
       .getApplicationContext().getPackageName(), 
       R.layout.home_widget); 
     mtts = new TextToSpeech(getApplicationContext(),this); 
     mtts.setLanguage(Locale.ENGLISH); 
     mtts.speak("This is the text to be spoken", TextToSpeech.QUEUE_FLUSH, null); 

     Intent clickIntent = new Intent(this.getApplicationContext(),HomeWidget.class); 
     clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.home, pendingIntent); 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 
    stopSelf(); 
    super.onStart(intent, startId); 
} 

@Override 
public void onInit(int status) { 
    // TODO Auto-generated method stub 

} 

我得到了widget並當我點擊的小部件,這些顯示6行中的logcat:

08-03 02:12:55.354: D/VoiceService(3666): Service created successfully! 
08-03 02:12:55.358: W/VoiceService(3666): From Intent1 
08-03 02:12:55.358: W/VoiceService(3666): Direct1 
08-03 02:12:55.358: W/VoiceService(3666): inside for loop 
08-03 02:12:55.358: I/TTS received:(3666): This is the text to be spoken 
08-03 02:12:55.370: D/VoiceService(3666): The service has been destroyed! 

但我聽不到任何東西。我最大化了音量,確保它使用了語音合成引擎(Pico TTS),併爲其安裝了英語(美國)和英語(英國)。我還安裝了語音合成所需的語音數據。

還有什麼我錯過或做錯了,這樣就沒有一個聲音說話?

回答

0

在發送任何文本到tts之前,您必須等待初始回調,因爲構造函數是一個異步操作,它在您準備發言之前返回。將呼叫轉移到onInit呼叫或從onInit呼叫的內容。