Android Sip开发

这几天接触到了sip,研究了两天,用官网的demo跑了一下,其中遇到了很多坑,在此记录

 

  1. 拿到demo,迫不及待的扔到AS上运行,这里需要注意的是,sip需要Android2.3以上的版本支持,这里我用的是2.3.3
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
  2. 权限,这里需要注意,需要开启sip权限
    <uses-sdk android:minSdkVersion="9" />
    <uses-permission android:name="android.permission.USE_SIP" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
    <uses-feature android:name="android.hardware.sip.voip" android:required="true" />
    <uses-feature android:name="android.hardware.wifi" android:required="true" />
    <uses-feature android:name="android.hardware.microphone" android:required="true" />
  3. 接下来注册广播
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.SipDemo.INCOMING_CALL");
    callReceiver = new IncomingCallReceiver();
    this.registerReceiver(callReceiver, filter);
  4. 然后实例SipManager
    public void initializeManager() {
        if(manager == null) {
          manager = SipManager.newInstance(this);
        }
    
        initializeLocalProfile();
    }
  5. 设置SipProfile,登录到SIP提供程序中,将此设备注册为发送SIP调用到SIP地址的位置 , 注意注意 这里坑的要死,我在这里为手动填写的sip信息,这里的坑在于sip账户,刚接触的小盆友应该不知道,sip账户需要有sip服务器,并且在sip服务器下才能注册,否则注册不上
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
    String username = prefs.getString("namePref", "");
          String domain = prefs.getString("domainPref", "");
          String password = prefs.getString("passPref", "");
          Log.e(TAG, "initializeLocalProfile: username="+username+"  domain="+domain+"  password="+password );
          if (username.length() == 0 || domain.length() == 0 || password.length() == 0) {
              showDialog(UPDATE_SETTINGS_DIALOG);
              return;
          }
  6. 然后设置接听电话广播
    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);
  7. 接下来是登录状态的监听,三个状态,等待、成功、失败没啥好说的
    manager.setRegistrationListener(me.getUriString(), new SipRegistrationListener() {
            public void onRegistering(String localProfileUri) {
                updateStatus("Registering with SIP Server...");
                Log.e("Registration","loading");
            }
    
            public void onRegistrationDone(String localProfileUri, long expiryTime) {
                updateStatus("Ready");
                Log.e("Registration","success");
    
            }
    
            public void onRegistrationFailed(String localProfileUri, int errorCode,
                    String errorMessage) {
                updateStatus("Registration failed.  Please check settings.");
                Log.e("Registration","failed");
            }
        });
  8. 客户端与SIP的大部分交互将通过侦听器进行
    SipAudioCall.Listener listener = new SipAudioCall.Listener() {
    @Override
    public void onCallEstablished(SipAudioCall call) {
        //播出电话对方接通时调用
        call.startAudio();
        call.setSpeakerMode(true);
        if(call.isMuted()){
            call.toggleMute();
        }
        updateStatus(call);
    }
    
    @Override
    public void onCallEnded(SipAudioCall call) {
        //对方挂断时调用。主动挂断不调用
        updateStatus("Ready.");
    }
    
    @Override
    public void onError(SipAudioCall call, int errorCode, String errorMessage) {
        //无人应答接听时调用
        super.onError(call, errorCode, errorMessage);
    }
  9. 最后关闭SipProfile
    public void closeLocalProfile() {
        if (manager == null) {
            return;
        }
        try {
            if (me != null) {
                manager.close(me.getUriString());
            }
        } catch (Exception ee) {
            Log.d("WalkieTalkieActivity", "Failed to close local profile.", ee);
        }
    }
    以下几点,是让我差点自杀的地方,注意:

 

  • sip账户,需要有一个sip账户,这个sip账户是sip提供商提供的,需要有可以用的服务器地址,这个账户包括三个部分,用户名,sip地址,密码,官方也有说明x
  • 如果你的账号可以用,到这里你应该可以注册成功了,怎么打电话呢,Call someone,这里需要你输入要拨打的地址,坑又来了,我打了好久打不通,后来发现,你拨打的用户,需要 ’用户名@sip地址‘的格式,才能拨出去,用户名是你的要拨打的用户名,也可以是手机号,只要有外拨权限,sip地址是你当前注册的sip地址

官方demo地址:https://github.com/android/platform_development/tree/master/samples/SipDemo 

Android官网sip的相关使用的介绍:https://developer.android.com/reference/android/net/sip/package-summary.html 

这里官网介绍如何测试sip应用:https://developer.android.com/guide/topics/connectivity/sip.html#testing

 

 

 

Android中的SIP(Session Initiation Protocol)是一种用于实现语音通话、视频通话和即时消息传递等功能的协议。您可以使用Android SDK中提供的SIP API来开发SIP应用程序。 要使用SIP API,您需要在AndroidManifest.xml文件中声明以下权限: ``` <uses-permission android:name="android.permission.USE_SIP"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> ``` 另外,您需要创建一个SipManager对象,该对象可用于初始化、注册和注销SIP帐户和SIP监听器。 以下是一个示例代码,演示如何使用SIP API来实现呼叫功能: ``` SipManager manager = SipManager.newInstance(context); SipProfile.Builder builder = new SipProfile.Builder(username, domain); builder.setPassword(password); SipProfile profile = builder.build(); Intent intent = new Intent(); intent.setAction("android.SipDemo.INCOMING_CALL"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, Intent.FILL_IN_DATA); manager.open(profile, pendingIntent, null); manager.setRegistrationListener(profile.getUriString(), new SipRegistrationListener() { @Override public void onRegistering(String s) { } @Override public void onRegistrationDone(String s, long l) { } @Override public void onRegistrationFailed(String s, int i, String s1) { } }); ``` 此代码段将初始化SipManager对象并注册一个SIP帐户。在这个示例中,我们还注册了一个PendingIntent,以便在有呼叫进入时可以接收广播。您可以使用SipManager对象进行呼叫和接听电话的操作。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值