SipDemo (voip 受信通話) の一部を次に示します。
public class WalkieTalkieActivity extends Activity {
...
public IncomingCallReceiver callReceiver;
public SipManager manager = null;
@Override
public void onCreate(Bundle savedInstanceState) {
...
IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
initializeManager();
}
public void initializeManager() {
initializeLocalProfile();
}
public void initializeLocalProfile() {
SipProfile.Builder builder = new SipProfile.Builder(username, domain);
builder.setPassword(password);
me = builder.build();
Intent i = new Intent();
i.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, Intent.FILL_IN_DATA);
manager.open(me, pi, null);
そしてBroadCastReceiver
public class IncomingCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
...
wtActivity.call = incomingCall;
うまく機能しますが、アプリがバックグラウンドで実行されていても電話を受けられるようにする必要があります。だから私は別の方法でブロードキャストレシーバーを実装しようとしました(アクティビティではなくマニフェストで)。だから削除:
IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
マニフェストに追加
<intent-filter>
<action android:name="android.SipDemo.INCOMING_CALL"/>
</intent-filter>
しかし、今は機能しません。incomingCall は常に null です。
変更前、BroadcastReceiver は
context == com.example.android.sip.WalkieTalkieActivity@4051c5e8
そして変更後
context == android.app.ReceiverRestrictedContext@4058ac48
多分これは問題ですが、誰かがそれを修正する方法を知っていますか?