1

I my app Я звоню в широковещательный приемник, чтобы читать входящие текстовые сообщения и говорить об этом вслух. Мой широковещательный приемник получает правильное имя, он правильно считывает текстовое сообщение, но когда дело доходит до метода speak(), он просто падает. Вот мой код:Как вызвать TextToSpeech от широковещательного приемника

Это BroadcastReceiver:

public class DrivingModeSpeaker extends BroadcastReceiver { 

      @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // TODO Auto-generated method stub 
     int n; 
     Bundle bundle=intent.getExtras(); 
     Object messages[]=(Object[])bundle.get("pdus"); 
     SmsMessage smsMessage[]=new SmsMessage[messages.length]; 
     for(n=0;n<messages.length;n++) 
     { 
      smsMessage[n]=SmsMessage.createFromPdu((byte[])messages[n]); 

     } 
     //show first message 
     String sms1=smsMessage[0].getMessageBody(); 
     String from=smsMessage[0].getOriginatingAddress(); 
     Toast toast=Toast.makeText(context,"In DrivingModeSpeaker BR",1); 
     toast.show(); 
     DrivingMode.speakSMS(sms1); 

    } 


} 

И это DrivingMode.java, который содержит speak() метод:

public class DrivingMode extends Activity { 
    private static TextToSpeech myTts; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.message_m); 
     myTts = new TextToSpeech(this,ttsInitListener); 


    } 

private TextToSpeech.OnInitListener ttsInitListener=new TextToSpeech.OnInitListener() { 

     @Override 
     public void onInit(int version) { 
      // myTts.speak(""+o, 0 ,null); 

     } 
    }; 
    public static void speakSMS(String sms) 
    { 
     myTts.speak(sms,0,null); 

    } 


} 

Я попробовал этот код в отдельный проект, оно работает. Но в моем основном проекте это не так - может быть, из-за столкновения двух радиоприемников или чего-то еще? Я не знаю, я новичок в Android, пожалуйста, помогите!

+0

трассировки стека вашего логарифма? –

ответ

3

В настоящее время вы пытаетесь вызвать метод Activity, создав экземпляр Activity, который через NullPointerException, если действие не запущено. поэтому вместо вызова активность в начальном методе активности из BroadcastReceiver и передавать данные смс с использованием Intent.putExtra как:

Для примера:

public void onReceive(Context context, Intent intent) 
    { 
     // Your code here.... 
     Toast toast=Toast.makeText(context,"In DrivingModeSpeaker BR",1); 
     toast.show(); 
     // start Activity here 
     Intent intent = new Intent(context, 
        DrivingMode.class); 
      intent.putExtra("sms", sms); //<<< put sms text 
      context.startActivity(intent); 

    } 

и DrivingMode OnCreate метода получения данных смс и вызвать speakSMS метод как:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //setContentView(R.layout.message_m); 
     Bundle extras = getIntent().getExtras(); 
     myTts = new TextToSpeech(this,ttsInitListener); 
     DrivingMode.speakSMS(extras.getString("sms")); 

    } 

также используется TextToSpeech.setOnUtteranceCompletedListener для отделки Деятельность в конце Speak

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