Cómo activar VOIP y SIP
Establezca MTK_SIP_SUPPORT en Sí en Alps\mediatek\config\product_Nam\projectconfig.MK
Abrir el método de La función SIP es aplicable a versiones anteriores a JB2:
1 Agregue el siguiente código al archivo Alps\mediatek\config\product_name\Android.software.sip.VoIP.XML.
& ltPermissions>
& ltfeature name = " Android . software . sip "/& gt;
& ltfeature name = " Android . software . sip.VoIP "/>
</permissions>
2. En el archivo Alps\mediatek\config\product_name\Android.software.sip.XML medio.
& ltPermissions>
& ltfeature name = " Android . software . sip "/& gt;
& lt/permissions & gt;
p>
Permitir que SIP use GPRS, solo para GB, GB2 y GB3:
En el archivo XML Alps\frameworks\base\core\RES\RES\values\config.
& ltbool name = " config _ sip _ wifi _ only " & gt; true & lt/bool & gt; = " config _ sip _ wifi _ only " & gt; false & lt/bool & gt;
Nota: en las versiones JB2, JB3 y JB5, la función de llamada SIP es mutuamente excluyente con OP02 y no puede estar encendido al mismo tiempo.
El motivo es que, por algunas razones del operador, no se permite activar la función Sip.
Si desea usarlos al mismo tiempo, puede modificar mk para eliminar la condición mutuamente excluyente:
/Alps/mediatek/build/addon/core/Android_dep_rule.mak eliminar el siguiente contenido.
########################################## # ################
ifneq ($(filtro OP02%, $(OPTR_SPEC_SEG_DEF)),)
ifeq($( tira $(MTK_SIP_SUPPORT)), sí)
$(llame a dep-err-common, no configure OPTR_SPEC_SEG_DEF en OP02* o MTK_SIP_SUPPORT en no)
endif
endif
1. VOIP se basa en el protocolo SIP SDK2.3 incluye una pila de protocolos SIP y una API de marco.
2.VOIP se encuentra en el paquete android.net.sip. La clase más importante es SipManager, que se puede utilizar para desarrollar aplicaciones VOIP basadas en sip.
Se utiliza con los permisos android.permission.INTERNET y android.permission.USE_SIP.
3. Si el teléfono móvil que se muestra en el mercado solo admite API VOIP, debe agregar
4.
(1) Solo compatible con plataformas Android 2.3 o superiores.
(2) No todos los dispositivos son compatibles con SIP, así que asegúrese de que su aplicación solo esté instalada en dispositivos que admitan SIP.
5. Ampliar el concepto basado en el proyecto de demostración oficial de GOOGLE.
2. Descripción de clase y método
1. Un proyecto VOIP básico requiere al menos tres clases: configuración SIP (autenticación de la configuración básica SIP), WalkieTalkieActivity (iniciar sesión en el suministro del dispositivo SIP) Proveedor, registra un dispositivo para manejar llamadas entrantes, realiza la llamada y administra la interfaz de usuario durante la llamada), IncomingCallReceiver (monitorea las llamadas SIP entrantes y luego las pasa a WalkieTalkieActivity para su control).
2.
WalkieTalkieActivity
a. sip manager . nueva instancia()-& gt; Si es compatible, cree un nuevo SipManager. En el constructor de SipManager, ISIPService (fórmula utilizada:
I binder b = service manager. get service (context. SIP _ SERVICE); // Obtiene el servicio correspondiente al sistema.
ISipService service = ISipService. stub . as interface(bi binder);)
Los dos códigos anteriores en realidad usan AIDL. Tomemos como ejemplo SipService. Los pasos son los siguientes.
Servidor
1. Escriba el archivo Aidl: ISipService.aidl y defina la interfaz utilizada (como una interfaz).
2. Utilice makefile para generar un archivo JAVA con el mismo nombre, SipService.java. Esta clase hereda Extensissipservice. Continúe e implemente los métodos definidos por la interfaz, o agréguelo al servicio de extensión del servicio SIP.
isip service .stub si pimpl = new isip service .stub(){
//Implemente su método de interfaz e implemente un método llamado start() en SipService.java. es una palabra llamada servicemanager. addservice ("SIP", newipservice(context)); indica que SipService se ha entregado a ServiceManager para su administración unificada.
}
Cliente
(tome SIPService como ejemplo)
1, y cuando necesitamos usar SipService, también cuando Construimos SipManager, podemos obtener el servicio SIP (tipo IBinder) a través del administrador de servicios obtener servicio (contexto. SIP _ servicio).
2. Y llama a isipservice. stub. como interfaz (I binder); Obtenga la instancia de SipService (la premisa es que el servicio debe agregarse y administrarse a través de ServiceManager.addService para encontrar el servicio).
Segundo (tomando actividades ordinarias como ejemplo)
1. Utilice intentintent = new intent(activity. this, sipservice. class -> context.BIND_AUTO_CREATE); para vincular el servicio, en el método onServiceConnected de serviceConnection, use iservice.stub.asintentface(I binder); Obtenga la instancia
b. dominio y contraseña de SharedPreference. Si no es la primera vez que los configura, primero debe crear una cuenta. Aquí, utiliza EditTextPreference para guardar información del usuario. El beneficio de esto es que cuando complete la información y regrese, EditTextPreference pondrá automáticamente el valor en SharedPreference. Suponemos que nombre de usuario = "Woody"; dominio = " 192.168.12.30 "; pwd="910913 "
c. En este momento, nuestro SipManager y la información del usuario están configurados, y luego usamos esto. frase Entonces SipProfile. constructor constructor = nuevo.
Perfil Sip. Builder (nombre de usuario, nombre de dominio); veamos qué hace SipProfile. Constructor:
si Puri mUri = maddressfactory. crear SipURI(nombre de usuario, dominio del servidor);
archivo mpro de perfil sip. m dominio = dominio del servidor; p>
(En el método mAddressFactory.createSipURl, seleccioné algo de código central).
búfer de cadena uri string = new string buffer(" sip:");
uriString .append(user);
uri string .append("@");
//Si el host es una cadena IPv6, debemos encerrarlo entre corchetes
if(host.indexOf(':')!= host . lastindexof(':')&& amphost.trim().charAt(0)!='[')
host = '['+host+']';
uriString.append(host);
StringMsgParser SMP = new StringMsgParser();
si purl si Puri = SMP .parse SipUrl(uri string . tostring());
Devuelve sipUri
Como se puede ver en el código anterior, en realidad está en formato SipURL. realizado, si el host es IPV6 (IPv4 es de 32 bits, decimal; IPv6 es de 128 bits, 16 hexadecimal). El final de urlString es "sip:woody@192.168.12.30". En el método smp.parseSIPUrl(), no hay una descripción detallada de cómo analizar, pero finalmente se devuelve un SipUri.
d. El siguiente paso es sip perfil sip perfil = sip perfil build() // Devuelve el objeto SipProfile.
En SipProfile.
Builder.build(), establece el valor pwd de sipProfile y elimina el objeto SipUrl anterior.
Contraseña (muri. setuser contraseña(null));), establezca el atributo de dirección de sipProfile en un valor de objeto de tipo AddressImpl y llame a AddressFactory.createURI para devolver un SipUri, SipProfile. mprroxyadress=SiPuri. gethost();
E. Cree un objeto PendingIntent: (La diferencia entre Intent y PendingIntent es que Intent se inicia a tiempo, mientras que PendingIntent no responde de inmediato y solo se inicia bajo circunstancias o notificaciones específicas, aplicables a AlertClock, etc.)
Intent I = new Intent();
i.setAction("demo de android.sip. INCOMING _ CALL ");
pendiente Intent pi = pendiente Intent.get broadcast(this,0,I,Intent.FILL_IN_DATA);
Mujer,
SipManager.open(sipProfile,PendingIntent,null); SIPService en realidad está realizando la operación) Establezca el CallingID de localSIPProfile>Establecer conexión SIP (registrarse en el servidor SIP)->;Abrir respuesta de llamadas.
El establecimiento de una conexión SIP se remonta al método reset() de SipSessionGroup.java, que se logra registrando el servidor.
Los pasos para registrar el servidor son los siguientes:
(1) Establecer las propiedades del servidor, como la dirección del servidor (IP_ADDRESS_PROP), el nombre de la pila (javax.sip.STACK_NAME), el envío ruta (en localProfile javax.sip.OUTBOUND_PROXY) y tamaño del grupo de subprocesos (gov.nist.javax.sip.thread).
(2) Obtenga una instancia a través del método estático de sipfactory y luego cree una instancia de SipFactory a través de SipFactory.
(3) Cree una instancia de SipStack sipstack (este paso obtiene IP_address_prop, cadena dirección = propiedades. getproperty("javax.sip.IP_address");)
(4) Utilice sipstack para cree una instancia de SipProvider.
(5) Registre SipListener.
Los pasos G y A ~ F son trabajos de preparación. Los pasos generales son los siguientes: Crear un nuevo servicio SIP->Nuevo administrador SIP-& gt; gt; Crear un nuevo perfil SIP->Nuevo contenido pendiente->Establecer ID de llamada del perfil SIP->(si el perfil es . getautoregistration)abrir para recibir llamadas->Registrar SipService
Ahora llama a alguien~ El trabajo de llamada lo completa la clase SipAudioCall (se puede crear una instancia mediante sipManager.makeAudioCall o takeAudioCall, SipAudioCall.startAudio requiere Record_Audio, Access_WiFi_State, Wake_LockPermissions.
, SipAudioCall.startAudio requiere record_audio, access_wifi_state, wake_lockpermission, setSpeakerMode () requiere permiso modificar_audio_settings).
1 Cuando necesites realizar una llamada, utiliza Sipmanager. hacer audiocall (uri de perfil local de cadena, uri de perfil de par de cadena, Siaudiocall. Listener, int timeout Cree un SipAudioCall donde el tiempo de espera sea en segundos, después del cual la llamada expirará). Cuando necesite llamar a alguien, use makeAudioCall para crearlo y cuando responda la llamada, use takeAudioCall para crear sipAudioCall.
2 Hay una clase anidada en sipaudiocall: sipaudiocall. Oyente (Esta clase se utiliza principalmente para escuchar llamadas SIP cuando [llama o recibe llamadas]).
SipAudioCall. oyente oyente = nuevo SipAudioCall. oyente(){
@override
anulación pública en llamada establecida(sipaudiocall){//Llamada establecida
llamada start audio();/ /Iniciar. audio
call . setspeakermode(true); //Ajustar al modo de habla
call . //Activar silencio
updateStatus( call) ;
}
};
Llamada SipAudioCall = administrador . hacer llamada de audio(me . geturistring(), sipAddress, oyente,
);p>
(El ejemplo anterior es makeAudioCall)
3 Echemos un vistazo al método makeAudioCall() (makeaudiocall requiere 2 perfiles sip):
Llamada SipAudioCall = new SipAudioCall(m contexto, perfil local);
call.setListener(listener); //Estas dos oraciones son muy simples: crea un sipAudioCall local.
sip session s = createSipSession(perfil local, nulo); -> msipservice .crea sesión(perfil local, nulo); // sipService crea la sesión y la guarda en SipSessionGroupExt.
call.makeCall(peerProfile, s, null); // Esta oración es una llamada, que se puede rastrear hasta SipSession.makecall.
Resumen: Al iniciar una llamada
El primer paso es crear SipAudioCall.listener para monitorear el establecimiento y final de la conversación, y luego realizar las operaciones correspondientes.
Entonces sorbe el administrador. makeAudioCall (add local, lllistener, xxxx), en el método makeAudioCall.
a. Cree un sipAudioCall(localProfile)
b. Cree una SipSession para establecer una sesión.
c.sip session.make call(perfil de par, XXXX); //SipSession llama al archivo de configuración remota.
El motivo para contestar el teléfono es similar, takeAudioCall
Busque msipservice. getpendingsession (CallID) obtiene la SipSession a través del callID previamente configurado. y cree un SipAudioCall y luego acepte el adjuntoCall.