package io.rong.callkit; import android.content.Context; import android.content.Intent; import java.util.ArrayList; import java.util.List; import io.rong.calllib.IRongReceivedCallListener; import io.rong.calllib.RongCallClient; import io.rong.calllib.RongCallCommon; import io.rong.calllib.RongCallSession; import io.rong.common.RLog; import io.rong.imkit.RongIM; import io.rong.imkit.manager.IExternalModule; import io.rong.imkit.plugin.IPluginModule; import io.rong.imlib.model.Conversation; /** * Created by weiqinxiao on 16/8/15. */ public class RongCallModule implements IExternalModule { private final static String TAG = "RongCallModule"; private RongCallSession mCallSession; private boolean mViewLoaded; private Context mContext; public RongCallModule() { RLog.i(TAG, "Constructor"); } @Override public void onInitialized(String appKey) { RongIM.registerMessageTemplate(new CallEndMessageItemProvider()); } @Override public void onConnected(String token) { RongCallClient.getInstance().setVoIPCallListener(RongCallProxy.getInstance()); } @Override public void onCreate(final Context context) { mContext = context; IRongReceivedCallListener callListener = new IRongReceivedCallListener() { @Override public void onReceivedCall(final RongCallSession callSession) { RLog.d("VoIPReceiver", "onReceivedCall"); if (mViewLoaded) { startVoIPActivity(mContext, callSession, false); } else { mCallSession = callSession; } } @Override public void onCheckPermission(RongCallSession callSession) { RLog.d("VoIPReceiver", "onCheckPermissions"); if (mViewLoaded) { startVoIPActivity(mContext, callSession, true); } } }; RongCallClient.setReceivedCallListener(callListener); } /** * 此方法的目的是,防止 voip 通话界面被会话或者会话列表界面覆盖。 * 所有要等待会话或者会话列表加载出后,再显示voip 通话界面。 * <p> * 当会话列表或者会话界面加载出来后,此方法会被回调。 * 如果开发者没有会话或者会话列表界面,只需要将下面的 mViewLoaded 在 onCreate 时设置为 true 即可。 */ @Override public void onViewCreated() { mViewLoaded = true; if (mCallSession != null) { startVoIPActivity(mContext, mCallSession, false); } } @Override public List<IPluginModule> getPlugins(Conversation.ConversationType conversationType) { List<IPluginModule> pluginModules = new ArrayList<>(); pluginModules.add(new AudioPlugin()); pluginModules.add(new VideoPlugin()); return pluginModules; } @Override public void onDisconnected() { } /** * 启动通话界面 * * @param context 上下文 * @param callSession 通话实体 * @param startForCheckPermissions android6.0需要实时获取应用权限。 * 当需要实时获取权限时,设置startForCheckPermissions为true, * 其它情况下设置为false。 */ private void startVoIPActivity(Context context, final RongCallSession callSession, boolean startForCheckPermissions) { RLog.d("VoIPReceiver", "startVoIPActivity"); String action; if (callSession.getConversationType().equals(Conversation.ConversationType.DISCUSSION) || callSession.getConversationType().equals(Conversation.ConversationType.GROUP)) { if (callSession.getMediaType().equals(RongCallCommon.CallMediaType.VIDEO)) { action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_MULTIVIDEO; } else { action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_MULTIAUDIO; } Intent intent = new Intent(action); intent.putExtra("callSession", callSession); intent.putExtra("callAction", RongCallAction.ACTION_INCOMING_CALL.getName()); if (startForCheckPermissions) { intent.putExtra("checkPermissions", true); } else { intent.putExtra("checkPermissions", false); } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setPackage(context.getPackageName()); context.startActivity(intent); } else { if (callSession.getMediaType().equals(RongCallCommon.CallMediaType.VIDEO)) { action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_SINGLEVIDEO; } else { action = RongVoIPIntent.RONG_INTENT_ACTION_VOIP_SINGLEAUDIO; } Intent intent = new Intent(action); intent.putExtra("callSession", callSession); intent.putExtra("callAction", RongCallAction.ACTION_INCOMING_CALL.getName()); if (startForCheckPermissions) { intent.putExtra("checkPermissions", true); } else { intent.putExtra("checkPermissions", false); } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setPackage(context.getPackageName()); context.startActivity(intent); } mCallSession = null; } }