如何使用Android SIP进行双向语音呼叫

时间:2014-06-26 12:46:00

标签: java android xml

因为我是SIP的新手,所以无法理解它。请帮助我。

我已经下载了Android SDK中提供的示例项目“SipDemo”,但由于显示“注册失败”,因此无法理解。请检查设置'

Android代码如下:

WalkieTalkieActivity.java

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.*;
import android.net.sip.*;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.ToggleButton;
import java.text.ParseException;

public class WalkieTalkieActivity extends Activity implements
    View.OnTouchListener {

public String sipAddress = null;

public SipManager manager = null;
public SipProfile me = null;
public SipAudioCall call = null;
public IncomingCallReceiver callReceiver;

private static final int CALL_ADDRESS = 1;
private static final int SET_AUTH_INFO = 2;
private static final int UPDATE_SETTINGS_DIALOG = 3;
private static final int HANG_UP = 4;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.walkietalkie);

    ToggleButton pushToTalkButton =(ToggleButton)findViewById(R.id.pushToTalk);
    pushToTalkButton.setOnTouchListener(this);

    IntentFilter filter = new IntentFilter();
    filter.addAction("android.SipDemo.INCOMING_CALL");
    callReceiver = new IncomingCallReceiver();
    this.registerReceiver(callReceiver, filter);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    initializeManager();
}

@Override
public void onStart() {
    super.onStart();
    initializeManager();
}

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

    closeLocalProfile();

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

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

    initializeLocalProfile();
}

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

    if (me != 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);
        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);

        manager.setRegistrationListener(me.getUriString(),
                new SipRegistrationListener() {
                    public void onRegistering(String   localProfileUri) {
                        updateStatus("Registering with SIP Server...");
                    }

                    public void onRegistrationDone(String localProfileUri,
                            long expiryTime) {
                        updateStatus("Ready");
                    }

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

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

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

public void initiateCall() {

    updateStatus(sipAddress);

    try {
        SipAudioCall.Listener listener = new SipAudioCall.Listener() {

            @Override
            public void onCallEstablished(SipAudioCall call) {
                call.startAudio();
                call.setSpeakerMode(true);
                call.toggleMute();
                updateStatus(call);
            }

            @Override
            public void onCallEnded(SipAudioCall call) {
                updateStatus("Ready.");
            }
        };

        call = manager.makeAudioCall(me.getUriString(), sipAddress,
                listener, 30);

    } catch (Exception e) {
        Log.i("WalkieTalkieActivity/InitiateCall",
                "Error when trying to close manager.", e);
        if (me != null) {
            try {
                manager.close(me.getUriString());
            } catch (Exception ee) {
                Log.i("WalkieTalkieActivity/InitiateCall",
                        "Error when trying to close manager.", ee);
                ee.printStackTrace();
            }
        }
        if (call != null) {
            call.close();
        }
    }
}

public void updateStatus(final String status) {
    // Be a good citizen. Make sure UI changes fire on the UI thread.
    this.runOnUiThread(new Runnable() {
        public void run() {
            TextView labelView = (TextView)findViewById(R.id.sipLabel);
            labelView.setText(status);
        }
    });
}

public void updateStatus(SipAudioCall call) {
    String useName = call.getPeerProfile().getDisplayName();
    if (useName == null) {
        useName = call.getPeerProfile().getUserName();
    }
    updateStatus(useName + "@" + call.getPeerProfile().getSipDomain());
}

public boolean onTouch(View v, MotionEvent event) {
    if (call == null) {
        return false;
    } else if (event.getAction() == MotionEvent.ACTION_DOWN && call != null
            && call.isMuted()) {
        call.toggleMute();
    } else if (event.getAction() == MotionEvent.ACTION_UP
            && !call.isMuted()) {
        call.toggleMute();
    }
    return false;
}

public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, CALL_ADDRESS, 0, "Call someone");
    menu.add(0, SET_AUTH_INFO, 0, "Edit your SIP Info.");
    menu.add(0, HANG_UP, 0, "End Current Call.");

    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case CALL_ADDRESS:
        showDialog(CALL_ADDRESS);
        break;
    case SET_AUTH_INFO:
        updatePreferences();
        break;
    case HANG_UP:
        if (call != null) {
            try {
                call.endCall();
            } catch (SipException se) {
                Log.d("WalkieTalkieActivity/onOptionsItemSelected",
                        "Error ending call.", se);
            }
            call.close();
        }
        break;
    }
    return true;
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case CALL_ADDRESS:

        LayoutInflater factory = LayoutInflater.from(this);
        final View textBoxView = factory.inflate(
                R.layout.call_address_dialog, null);
        return new AlertDialog.Builder(this)
                .setTitle("Call Someone.")
                .setView(textBoxView)
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                EditText textField = (EditText) (textBoxView
                                        .findViewById(R.id.calladdress_edit));
                                sipAddress = textField.getText().toString();
                                initiateCall();

                            }
                        })
                .setNegativeButton(android.R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                // Noop.
                            }
                        }).create();

    case UPDATE_SETTINGS_DIALOG:
        return new AlertDialog.Builder(this)
                .setMessage("Please update your SIP Account Settings.")
                .setPositiveButton(android.R.string.ok,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                updatePreferences();
                            }
                        })
                .setNegativeButton(android.R.string.cancel,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                // Noop.
                            }
                        }).create();
    }
    return null;
}

public void updatePreferences() {
    Intent settingsActivity = new Intent(getBaseContext(),
            SipSettings.class);
    startActivity(settingsActivity);
 }
  }

SipSettings.java

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class SipSettings extends PreferenceActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    // Note that none of the preferences are actually defined here.
    // They're all in the XML file res/xml/preferences.xml.
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);

}
}

IncomingCallReceiver.java

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.sip.*;
import android.util.Log;

public class IncomingCallReceiver extends BroadcastReceiver {

@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();
        }
    }
}

}

RES \布局\ walkietalkie.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<RelativeLayout
    android:id="@+id/mainlayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="12dp" >

    <TextView
        android:id="@+id/sipLabel"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <ToggleButton
        android:id="@+id/pushToTalk"
        android:layout_width="400dp"
        android:layout_height="400dp"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_marginTop="-20dp"
        android:background="@drawable/btn_record"
        android:text="@+string/talk"
        android:textOff=""
        android:textOn="" />
 </RelativeLayout>
</FrameLayout>

RES \布局\ call_address_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:id="@+id/calladdress_view"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginLeft="20dip"
    android:layout_marginRight="20dip"
    android:text="@+string/contactAddress"
    android:gravity="left"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
    android:id="@+id/calladdress_edit"
    android:layout_height="wrap_content"
    android:layout_width="fill_parent"
    android:layout_marginLeft="20dip"
    android:layout_marginRight="20dip"
    android:scrollHorizontally="true"
    android:autoText="false"
    android:capitalize="none"
    android:gravity="fill_horizontal"
    android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

RES \ XML \的preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference
    android:name="SIP Username"
    android:summary="Username for your SIP Account"
    android:defaultValue=""
    android:title="Enter Username"
    android:key="namePref" />
<EditTextPreference
    android:name="SIP Domain"
    android:summary="Domain for your SIP Account"
    android:defaultValue=""
    android:title="Enter Domain"
    android:key="domainPref" />
<EditTextPreference
    android:name="SIP Password"
    android:summary="Password for your SIP Account"
    android:defaultValue=""
    android:title="Enter Password"
    android:key="passPref"
    android:password="true" />
</PreferenceScreen>

清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.sip" >

<application
    android:icon="@drawable/icon"
    android:label="SipDemo" >
    <activity
        android:name=".WalkieTalkieActivity"
        android:configChanges="orientation|keyboardHidden" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".SipSettings"
        android:label="set_preferences" />

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

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

</manifest>

请指导我,以便我了解如何使用SIP并继续进行双向语音呼叫。

提前Thanxs

0 个答案:

没有答案