package com.example.android.sip;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.sip.*;
import android.util.Log;
/**
* Listens for incoming SIP calls, intercepts and hands them off to WalkieTalkieActivity.
*/
public class IncomingCallReceiver extends BroadcastReceiver {
/**
* Processes the incoming call, answers it, and hands it over to the
* WalkieTalkieActivity.
* @param context The context under which the receiver is running.
* @param intent The intent being received.
*/
@Override
public void onReceive(Context context, Intent intent) {
SipAudioCall incomingCall = null;
try {
SipAudioCall.Listener listener = new SipAudioCall.Listener() {
@Override
public void onRinging(SipAudioCall call, SipProfile caller) {
try {
call.answerCall(30);
} catch (Exception e) {
e.printStackTrace();
}
}
};
WalkieTalkieActivity wtActivity = (WalkieTalkieActivity) context;
incomingCall = wtActivity.manager.takeAudioCall(intent, listener);
incomingCall.answerCall(30);
incomingCall.startAudio();
incomingCall.setSpeakerMode(true);
if(incomingCall.isMuted()) {
incomingCall.toggleMute();
}
wtActivity.call = incomingCall;
wtActivity.updateStatus(incomingCall);
} catch (Exception e) {
if (incomingCall != null) {
incomingCall.close();
}
}
}
}
我看到他们能够以某种方式通过在广播接收器中投射 context 来检索正在运行的WalkieTalkieActivity实例。这怎么可能?这是访问活动的快捷方式,而不是发送意图吗?
答案 0 :(得分:1)
我现在不在我的笔记本电脑上使用android studio,所以我没有完整的示例项目在我面前检查这个接收器使用的上下文。 据我所知,当你可以将ReceiverRestrictedContext转换为Activity时,唯一有效的情况是广播接收器在该活动中注册,而活动是活着的。
所以,如果你在WalkieTalkieActivity里面有这样的东西:
newdat2[(newdat2!=1)&(newdat2!=2)&(newdat2!=3)&(newdat2!=4)&(newdat2!=5)]<-NA
答案 1 :(得分:0)
您可以使用以下代码
MyActivity mainActivity = (MyActivity) ((BaseApplication) context.getApplicationContext()).activity
在BaseApplication和MyAcitivity中定义变量活动,将变量设置为活动上下文
BaseApplication.activity = this