0

Я новичок в android.Я пытаюсь создать приложение-анонс вызывающего абонента. Следующий мой код. Журналы показывают, что код выполняется просто отлично, то есть конструктор TextToSpeech выполняет и достигает метода onInit до самого конца, однако, когда я его тестирую, звук не слышен.Как создать объект TextToSpeech в Activity, вызванном из широковещательного приемника?

Это мой CustomBroadcastReceiver.java:

public class CustomBroadcastReceiver extends BroadcastReceiver { 

protected String newSender; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.v("", "logger WE ARE INSIDE!!!!!!!!!!!"); 

    Intent i=new Intent(context,ReceiverActivity.class); 

    TelephonyManager telephony = (TelephonyManager) context 
      .getSystemService(Context.TELEPHONY_SERVICE); 
    CustomPhoneStateListener customPhoneListener = new CustomPhoneStateListener(); 

    telephony.listen(customPhoneListener, 
      PhoneStateListener.LISTEN_CALL_STATE); 

    Bundle bundle = intent.getExtras(); 
    String phoneNr = bundle.getString("incoming_number"); 
    Log.v("", "logger phoneNr: " + phoneNr); 

    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, 
      Uri.encode(phoneNr)); 
    Cursor cursor = context.getContentResolver().query(uri, 
      new String[] { PhoneLookup.DISPLAY_NAME }, phoneNr, null, null); 
    if (cursor.moveToFirst()) { 
     newSender = cursor.getString(cursor 
       .getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 


    } 
    i.putExtra("ID", newSender); 
    Log.d("","logger intent" + i.getStringExtra("ID")); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 
    cursor.close(); 

} 

} 

Это ReceiverActivity.java

public class ReceiverActivity extends Activity implements TextToSpeech.OnInitListener{ 

String name; 
private TextToSpeech tts; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_receiver); 
    Log.d("","logger reached ReceiverActivity"); 
    tts = new TextToSpeech(this, this); 
    Log.d("","logger created tts object"); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.receiver, menu); 
    return true; 
} 

@Override 
public void onInit(int status) { 
    Log.d("","logger reached onInit"); 
    if (status == TextToSpeech.SUCCESS) { 

     int result = tts.setLanguage(Locale.US); // java.Util.Locale for 
                // country codes 

     if (result == TextToSpeech.LANG_MISSING_DATA 
       || result == TextToSpeech.LANG_NOT_SUPPORTED) { 
      Log.e("TTS", "This Language is not supported"); 
     } else { 
      speakOut(); 
     } 
    } else { 
     Log.e("TTS", "Initilization Failed!"); 
    } 

} 

private void speakOut() { 

    tts.speak(name, TextToSpeech.QUEUE_FLUSH, null); 
    Log.d("","logger speak executed"); 
} 

} 

Не могли бы вы сказать мне, где я неправильно?

+1

привет, что такое значение имени. где вы назначаете в работе приемника. Я думаю, что значение name равно null. – suresh

+0

О да. Я забыл getExtra(). Это сработало. Благодарю. Однако он дважды объявляет имя. Один раз во время вызова и один раз, когда вызов заканчивается. Почему это так? Это потому, что я получаю его в трансляции для каждого изменения состояния телефона? – user3217900

ответ

0

Прежде всего, инициализируйте объект Text-To-Speech в своем классе активности, а затем создайте статический метод со строковым параметром, который содержит метод выражения Text-To-Speech.

И вызовите этот статический метод из вашего трансляционного вещателя со строкой, которую вы хотите объявить.

public static void speakOut(String message) { 

    System.out.println("Message is: " + message); 

    tts.speak(message, TextToSpeech.QUEUE_ADD, null); 

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