0

メディアプレーヤーのサービスとBroadcastReceiverを使用して着信と発信の通話をチェックしてメディアプレーヤーサービスを停止または再開するラジオアプリケーションがありますが、アプリを終了してもBroadcastReceiverは通話をチェックし続け、クラッシュしますアプリケーションがなくなっても(終了しました)ここにコードがあります

マニフェスト

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

}

}

どうすれば停止させることができますか?

4

3 に答える 3

4

マニフェストからレシーバーを削除し、サービスでローカルに登録します。

サービスの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);
}
于 2012-04-06T00:09:17.933 に答える
0

マニフェストでブロードキャスト レシーバーを定義したので、アプリを起動していない (またはサービスを実行していない) 場合でも、アプリはこれらのブロードキャストをリッスンできます。これを修正するには、ブロードキャスト レシーバーをプログラムでサービス内に登録して、常にではなくプレーヤーの実行中にのみ動作するようにします。

または、現在の受信機では、音楽の開始/停止メソッドを呼び出す前に、サービスが既に実行されているかどうかを確認する必要があります。

于 2012-04-05T23:12:59.227 に答える