2012-04-05 19 views
0

Ich habe eine Radio-Anwendung, die einen Dienst für Media Player und einen BroadcastReceiver verwendet, um eingehende und ausgehende Anrufe zu stoppen oder den Media Player-Dienst neu starten, funktioniert es aber wenn ich aufhöre meine app die BroadcastReceiver prüft noch für Anrufe und stürzt meine Anwendung auch das verschwunden ist (es Ziel war) hier ist der CodeAndroid BroadcastReceiver macht App zum Absturz, wenn App nicht funktioniert

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> 

die 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{} 

} 

} 

Wie kann ich es stoppen?

Antwort

3

Entfernen Sie den Empfänger aus Ihrem Manifest und registrieren sie vor Ort in Ihren Diensten:

Verwenden Sie diesen Code in Ihren Dienst onCreate() Methode:

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); 
} 

Vergessen Sie nicht, den Empfänger in Ihrem Dienst des abzumelden onDestroy methode:

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

Einfach perfekt das hat super funktioniert! Danke für das Teilen dieses Codes! Wenn jemand anderes ein ähnliches Problem hat, versuchen Sie es mit diesem Code. – zvzej

0

Sie haben Ihren Broadcast-Empfänger in Manifest definiert. Aus diesem Grund kann Ihre App diese Broadcasts auch dann hören, wenn Sie Ihre App noch nicht gestartet haben (oder den Dienst ausführen). Um dies zu beheben, registrieren Sie Ihren Broadcast-Empfänger programmatisch in Ihrem Dienst, so dass er nur funktioniert, wenn der Player läuft und nicht immer.

Oder in Ihrem aktuellen Empfänger, bevor Sie starten/stop Musik-Methoden, sollten Sie überprüfen, ob der Dienst bereits läuft oder nicht.

+0

Aber mache ich das nicht schon, wenn ich das if (PlayerService.getInstance()! = Null) mache? – zvzej

0

Wenn Sie das Crash-Protokoll bereitstellen, wird es mehr helfen. Wenn Sie Ihren Code überprüfen, ist alles gut, aber wenn Sie nach PlayerService.getInstance() nicht null suchen, wird es Ihnen immer die Instanz geben, wenden Sie einfach ein Mediaplayer-Objekt nicht null überprüfen, während Sie spielen oder stoppen oder Pause.

Ich hoffe, es wird Ihnen helfen.

Verwandte Themen