Android audio calls using android's sip

2019-04-11 00:54发布

I developed an application for a customer to internet calling using sip.For that he provided me two valid sip user_id and password. Am Using SIP API for SIP implementation.customer says that the call is not going.he don't get any notification about missed calls when he logged using his account.i cant find any mistakes in the code.please help me .the code is given below.

public class CallActivity extends Activity {
        public String sipAddress = null;
        public SipManager mSipManager = null;
        public SipProfile mSipProfile = null;
        public SipAudioCall call = null;
        Button b1;
        TextView sipadd;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.calling);
            sipAddress = (String) getIntent().getExtras().get("sipAddress");
            b1 = (Button) findViewById(R.id.sipcallbtnend);
            b1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    finish();
                }
            });

            sipadd = (TextView) findViewById(R.id.sipcalltvdialedaddress);

            sipadd.setText(sipAddress);
            b1.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if (call != null) {
                        call.close();
                    }
                    finish();
                }
            });
            initializeManager();
        }

        @Override
        public void onStart() {
            super.onStart();
            // When we get back from the preference setting Activity, assume
            // settings have changed, and re-login with new auth info.
            initializeManager();
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            if (call != null) {
                call.close();
            }

            closeLocalProfile();

            // if (callReceiver != null) {
            // this.unregisterReceiver(callReceiver);
            // }
        }

        public void initializeManager() {
            if (mSipManager == null) {
                mSipManager = SipManager.newInstance(this);
            }

            initializeLocalProfile();
        }

        public void initializeLocalProfile() {
            if (mSipManager == null) {
                return;
            }

            if (mSipProfile != null) {
                closeLocalProfile();
            }
            SharedPreferences prefs = PreferenceManager
                    .getDefaultSharedPreferences(getBaseContext());
            String username = prefs.getString("namePref", "");
            String domain = prefs.getString("domainPref", "");
            String password = prefs.getString("passPref", "");

            if (username.length() == 0 || domain.length() == 0
                    || password.length() == 0) {
                // showDialog(UPDATE_SETTINGS_DIALOG);
                return;
            }

            try {
                SipProfile.Builder builder = new SipProfile.Builder(username,
                        domain);
                builder.setPassword(password);
                builder.setDisplayName(username);
                builder.setAuthUserName(username);
                mSipProfile = builder.build();

                Intent i = new Intent();
                i.setAction("android.SipDemo.INCOMING_CALL");
                PendingIntent pi = PendingIntent.getBroadcast(this, 0, i,
                        Intent.FILL_IN_DATA);
                mSipManager.open(mSipProfile, pi, null);
                //
                //
                // // This listener must be added AFTER manager.open is called,
                // // Otherwise the methods aren't guaranteed to fire.

                mSipManager.setRegistrationListener(mSipProfile.getUriString(),
                        new SipRegistrationListener() {
                            public void onRegistering(String localProfileUri) {
                                // updateStatus("Registering with SIP Server...");
                                Log.d("onRegistering",
                                        "Registering with SIP Server...");
                            }

                            public void onRegistrationDone(String localProfileUri,
                                    long expiryTime) {
                                // updateStatus("Ready");
                                Log.d("onRegistrationDone",
                                        "RegistrationDone..Ready");

                            }

                            public void onRegistrationFailed(
                                    String localProfileUri, int errorCode,
                                    String errorMessage) {
                                // updateStatus("Registration failed.  Please check settings.");
                                Log.d("onRegistrationFailed", "RegistrationFailed");

                            }
                        });
            } catch (ParseException pe) {
                // updateStatus("Connection Error.");
            } catch (SipException se) {
                // updateStatus("Connection error.");
            }

            initiateCall();
        }

        public void closeLocalProfile() {
            if (mSipManager == null) {
                return;
            }
            try {
                if (mSipProfile != null) {
                    mSipManager.close(mSipProfile.getUriString());
                }
            } catch (Exception ee) {
                Log.d("WalkieTalkieActivity/onDestroy",
                        "Failed to close local profile.", ee);
            }
        }

        public void initiateCall() {

            // updateStatus(sipAddress);
            Log.d("nzm", "initiatecall");

            try {
                SipAudioCall.Listener listener = new SipAudioCall.Listener() {
                    // Much of the client's interaction with the SIP Stack will
                    // happen via listeners. Even making an outgoing call, don't
                    // forget to set up a listener to set things up once the call is
                    // established.
                    @Override
                    public void onCallEstablished(SipAudioCall call) {
                        call.startAudio();
                        call.setSpeakerMode(true);
                        call.toggleMute();
                        Log.d("on call established", "on call established");
                        // updateStatus(call);
                    }

                    @Override
                    public void onCallEnded(SipAudioCall call) {
                        // updateStatus("Ready.");
                        // Intent i = new
                        // Intent(getBaseContext(),DialActivity.class);
                        // startActivity(i);
                        finish();
                    }
                };

                call = mSipManager.makeAudioCall(mSipProfile.getUriString(), sipAddress,
                        listener, 3000);
                Log.d("call", "" + call.getState());
            } catch (Exception e) {
                Log.i("WalkieTalkieActivity/InitiateCall",
                        "Error when trying to close manager.", e);
                if (mSipProfile != null) {
                    try {
                        mSipManager.close(mSipProfile.getUriString());
                    } catch (Exception ee) {
                        Log.i("WalkieTalkieActivity/InitiateCall",
                                "Error when trying to close manager.", ee);
                        ee.printStackTrace();
                    }
                }
                if (call != null) {
                    call.close();
                }
            }
        }

    }

The permissions in manifest is given below

<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" />

please help me .Thanks in Advance.

标签: android sip
2条回答
冷血范
2楼-- · 2019-04-11 01:39

Do you have this in manifest?:

<receiver android:name=".IncomingCallReceiver" android:label="Call Receiver"/>

See: https://developer.android.com/guide/topics/connectivity/sip.html and https://android.googlesource.com/platform/development/+/master/samples/SipDemo/

查看更多
疯言疯语
3楼-- · 2019-04-11 01:45

Maybe add these

<uses-permission android:name="android.permission.CONFIGURE_SIP" />

<uses-feature android:name="android.software.sip" android:required="true" />
<uses-feature android:name="android.software.sip.voip" android:required="true" />
<uses-feature android:name="android.hardware.telephony" android:required="false" />

Are you using the android's example? It should work on device that support SIP.

And add receiver in onCreate

IntentFilter filter = new IntentFilter();
filter.addAction("android.SipDemo.INCOMING_CALL");
callReceiver = new IncomingCallReceiver();
this.registerReceiver(callReceiver, filter);
查看更多
登录 后发表回答