广播侦听中的TTS呼叫来电/短信

时间:2015-06-28 00:10:08

标签: android sms broadcastreceiver text-to-speech

我正致力于通话名称播音员应用。但收到短信时,我的项目并没有发言。它成功接收,但无法说出来。我认为从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>

1 个答案:

答案 0 :(得分:0)

来自BroadcastReceiver文件

  

BroadcastReceiver对象仅在对onReceive(Context,Intent)的调用期间有效。一旦您的代码从此函数返回,系统会认为该对象已完成且不再有效。

TTS对象的初始化是异步的。在调用TTS之前,不会初始化onInit()对象。 <{1}}之前调用speak方法并非违法,但不会发出声音。

onInit()将在onInit()代码的最后一行之后调用,即onReceived()因此您的代码不会产生任何声音。

您应该在habla.speak(cadena);service开始将短信作为onReceived()传递,让intent extra实例化一个service对象,并在TTS