2012-04-05 10 views
0

У меня есть приложение Radio, которое использует Сервис для медиаплеера и BroadcastReceiver для проверки входящих и исходящих вызовов, чтобы остановить или перезапустить службу медиаплеера, но работает, но когда я ухожу мое приложение BroadcastReceiver еще проверка звонков и он выходит из строя моего приложения даже, что вышло (это было окончание) вот кодAndroid BroadcastReceiver заставляет приложение сбой, когда приложение не работает

Manifest

<service android:name=".PlayerService" 
      android:label="@string/app_name"> 
      <intent-filter> 
     </intent-filter>  
    </service> 
    <receiver android:name=".IncomingCallInterceptor">      
     <intent-filter>             
      <action android:name="android.intent.action.PHONE_STATE"/> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 

BroadcastReceiver

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.telephony.TelephonyManager; 

public class IncomingCallInterceptor extends BroadcastReceiver {         

@Override 
public void onReceive(Context context, Intent intent) {           
    String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 


    if (PlayerService.getInstance() != null) { 
    if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) { 
      PlayerService.getInstance().stopMusic(); 
    } 
    if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) { 
      PlayerService.getInstance().stopMusic(); 
    } 
    if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) { 
      PlayerService.getInstance().startMusic(); 
    } 

    }else{} 

} 

} 

Как я могу остановить его?

ответ

3

Снимите приемник с манифеста и зарегистрировать его на месте в службе:

Используйте этот код в onCreate() методе своей службы:

IncomingCallInterceptor interceptor; 

public void onCreate() { 
    super.onCreate(); 

    //your code here 

    incerceptor = new IncomingCallInterceptor(); 
    IntentFilter f = new IntentFilter(); 
    f.addAction("android.intent.action.PHONE_STATE"); 
    f.addAction("android.intent.action.NEW_OUTGOING_CALL"); 
    registerReceiver(interceptor, f); 
} 

Не забудьте отменить приемник в своих службах onDestroy метод:

public void onDestroy() { 
    unregisterReceiver(interceptor); 
} 
+1

Просто отлично, это сработало отлично! Спасибо, что поделились этим куском кода! если у кого-то есть аналогичная проблема, попробуйте этот код, он выполняет эту работу! – zvzej

0

Вы определили свой широковещательный приемник в манифесте, поэтому ваше приложение все равно может прослушивать эти трансляции, даже если вы не запустили приложение (или запустите службу). Чтобы исправить это, зарегистрируйте свой широковещательный приемник программно внутри вашей службы, чтобы он работал только тогда, когда плеер работает, а не во все времена.

Или в вашем текущем ресивере перед вызовом музыкальных методов начала/остановки вы должны проверить, запущена ли служба или нет.

+0

Но я не делаю этого уже, когда я делаю if (PlayerService.getInstance()! = Null)? – zvzej

0

Если вы предоставите журнал аварий, это поможет больше. Изучив свой код, все хорошо, но когда вы проверяете PlayerService.getInstance(), но не null , он обязательно предоставит вам экземпляр, просто примените объект mediaplayer, а также не проверять нуль, пока вы собираетесь играть или останавливаться или Пауза.

Надеюсь, это поможет вам.

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