2014-01-20 5 views
0

Когда я получаю сообщение в своем классе SMSReceiver, я хочу начать воспроизведение звука в активности отображения. Проблема в том, что воспроизводится каждое сообщение, получающее звук. Но в том случае, когда я получил 2 сообщения, они одновременно смешивают звуки.Broadcastreceiver и SMSReceiver

Ниже мой код,

public class SMSReceiver extends BroadcastReceiver { 
static String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 

@Override 
public void onReceive(Context context, Intent intent) { 

    if(intent.getAction().equals(SMSReceiver.SMS_RECEIVED)){ 
     Bundle bundle = intent.getExtras(); 
     Object[] messages = (Object[]) bundle.get("pdus"); 
     SmsMessage[] sms = new SmsMessage[messages.length]; 
     for (int i=0; i < messages.length; i++) { 
      sms[i] = SmsMessage.createFromPdu((byte[]) messages[i]); 
     } 
     String sms2 = new String(); 
     for (SmsMessage msg : sms) { 
      if (TextUtils.equals(msg.getOriginatingAddress(), number)) { 
       Intent i = new Intent(context, DisplayActivity.class); 
       sms2 = msg.getMessageBody(); 
       i.putExtra("SMS",sms2); 
       context.startActivity(i); 
       abortBroadcast(); 
      } 
     } 
    } 
} 
} 


public class DisplayActivity extends Activity { 

MessageBDD messagebdd = new MessageBDD(this); 
Message message = new Message(); 

int delay = 0; 
boolean isFirstTime = true; 
int period = 60000; 
static String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; 
private IntentFilter mIntentFilter; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.display); 


    final MediaPlayer mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.son1); 

    AudioManager mAudioManager = (AudioManager)getApplication().getSystemService(Context.AUDIO_SERVICE); 


     mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); 

     Timer timer = new Timer(); 
      timer.scheduleAtFixedRate(new TimerTask() { 
      public void run() { 
       if (isFirstTime) { 
       isFirstTime = false; 
       mPlayer.start(); 
       } 
       else{ 
        mPlayer.seekTo(0); 
        mPlayer.start(); 
       } 
      } 
      }, delay, period); 

    /*************Sauvegarde des messages*****************************/ 
    Bundle extra = getIntent().getExtras(); 
    String sms = extra.getString("SMS"); 
    messagebdd.Open(); 
    message.setContenu(sms); 
    messagebdd.insertMessage(message); 
    messagebdd.Close(); 


    /******************Alerte de stop sonnerie**********************/ 
    AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
    alertDialog.setTitle("Message"); 
    alertDialog.setMessage("Stopper la notification?"); 

    alertDialog.setButton("STOP", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     mPlayer.release(); 
     finish(); 
    } 
    }); 
    alertDialog.show(); 
} 
} 



public class MyService extends Service { 
private static final String number = "15555215556"; 
int delay = 0; 
boolean isFirstTime = true; 
int period = 60000; 
final MediaPlayer mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.son1); 

private final BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){ 
      AudioManager mAudioManager = (AudioManager)getApplication().getSystemService(Context.AUDIO_SERVICE); 
      mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0); 

         mPlayer.start(); 

      } 
     } 
    }; 

    @Override 
     public void onCreate() { 
     super.onCreate(); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
     registerReceiver(receiver, filter); 
     } 

    public void onStart(Intent intent, int startId) {  
      super.onStart(intent, startId); 

     } 

    public void onDestroy() { 
      super.onDestroy(); 
      unregisterReceiver(receiver); 
     } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    } 
+2

класть ваш код пожалуйста –

+0

/ваш вопрос непонятный. что происходит, и что вам нужно? –

+0

@Andrey: пожалуйста, проверьте последнее время звонка и, соответственно, добавьте условия, должны ли появляться предстоящие. – Vaibs

ответ

1

Сделать все MediaPlayer работа в другом классе одноплодной и вызвать метод воспроизведения, который будет играть музыку. и проверьте, является ли mediaPlayer.isPlaying() истинным, а затем не воспроизводит музыку. Надеюсь, это поможет.

+0

благодарю вас за ваше вмешательство. что я делаю до того, как у меня появился класс вещания, который запускает класс активности отображения, включающий песню. Но проблема в том, что каждый прием sms начинается с нового экземпляра, и я точно не знаю, когда проверяю текущий Mediaplayer. – Andrey

+0

Да, я получаю вашу точку. Каждый прием откроет новую активность, поэтому вы должны сделать класс, скажем, AudioHelper, который будет singleton и делать всю работу по загрузке-разгрузке медиаплеера и воспроизведению музыки ... поэтому, когда активность снова запущена, вы получите тот же объект, что и singleton, и вы можете проверить isPlaying() –

+0

спасибо. Я просто делаю это со службой. посмотрите http://stackoverflow.com/questions/21239419/stop-all-media-player-rinning-in-my-android-device. Пожалуйста. спасибо – Andrey

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