2015-06-28 3 views
0

Я работаю над приложениями для звонков по имени. Но мой проект не говорит, когда получено SMS. Он получает его успешно, но не может говорить об этом. Я думаю, что есть проблема с вызовом TTS от BroadcastReceiver. Вот мой код:TTS внутри broadcastreciever звонок для входящего звонка/sms

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

Из BroadcastReceiver документа

BroadcastReceiver объект действителен только на время вызова OnReceive (Context, Intent). Как только ваш код вернется из этой функции, система считает объект законченным и больше не активным.

Инициализация объекта TTS является асинхронным. Объект TTS не инициализируется до тех пор, пока не назовется onInit(). Вызов speak методов до onInit() не является незаконным, но не произведет никакого звука.

onInit() будет вызываться после последней строки вашего onReceived() кода, который равен habla.speak(cadena); Таким образом, ваш код не произведет никакого звука.

Вы должны начать service в onReceived() передавая текстовое сообщение как intent extra и пусть service экземпляр TTS объекта и говорить сообщение в onInit().

Смежные вопросы