我正致力于通话名称播音员应用。但收到短信时,我的项目并没有发言。它成功接收,但无法说出来。我认为从BroadcastReceiver
调用TTS存在问题。这是我的代码:
public class SMSAnnouncer extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = intent.getExtras();
SmsMessage[] mensajes = null;
String cadena = "";
if (b != null) {
Object[] objetos = (Object[]) b.get("pdus");
mensajes = new SmsMessage[objetos.length];
for (int i = 0; i < mensajes.length; i++) {
mensajes[i] = SmsMessage.createFromPdu((byte[]) objetos[i]);
cadena += "SMS de " + mensajes[i].getOriginatingAddress();
cadena += "Compuesto por...";
cadena += mensajes[i].getMessageBody().toString();
cadena += "\n";
}
Toast.makeText(context, cadena, Toast.LENGTH_LONG).show();
Speaker habla = new Speaker();
habla.speak(cadena);
}
}
}
public class Speaker extends Activity {
TextToSpeech ttp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ttp = new TextToSpeech(getApplicationContext(), new OnInitListener() {
@Override
public void onInit(int status) {
if (status != TextToSpeech.ERROR) {
Locale loc = new Locale("spa", "ESP");
ttp.setSpeechRate(2);
ttp.setLanguage(Locale.US);
ttp.setSpeechRate(0.8f);
}
}
});
}
void speak(String sms) {
ttp.speak(sms, TextToSpeech.QUEUE_FLUSH, null);
}
}
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.callandsmsblocker.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.callandsmsblocker.CallAnnouncer" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.PHONE_STATE" >
</action>
</intent-filter>
</receiver>
<receiver android:name="com.callandsmsblocker.SMSAnnouncer" >
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
答案 0 :(得分:0)
来自BroadcastReceiver
文件
BroadcastReceiver对象仅在对onReceive(Context,Intent)的调用期间有效。一旦您的代码从此函数返回,系统会认为该对象已完成且不再有效。
TTS
对象的初始化是异步的。在调用TTS
之前,不会初始化onInit()
对象。 <{1}}之前调用speak
方法并非违法,但不会发出声音。
onInit()
将在onInit()
代码的最后一行之后调用,即onReceived()
因此您的代码不会产生任何声音。
您应该在habla.speak(cadena);
中service
开始将短信作为onReceived()
传递,让intent extra
实例化一个service
对象,并在TTS
。