gpt4 book ai didi

java - 如何使用 Android SIP API 向 SIP 服务器注册 SIP 配置文件?

转载 作者:搜寻专家 更新时间:2023-11-01 09:34:52 28 4
gpt4 key购买 nike

我一直非常坚持解决这个问题,我去过几乎所有谈论这个主题的网站(包括旧的堆栈溢出帖子),现在我正在尝试遵循 Android“官方”文档以便让我的 SIP 客户端在我的 Asterisk 服务器上注册,应用程序甚至不显示我在函数中设置的状态消息,The official Android Studio code太糟糕了,我进行了修改和更正以使其编译,但仍然在 3 天后,我没有得到结果,我无法取得突破,这是我唯一的 Activity Java 文件中的内容:

import android.Manifest;
import android.content.pm.PackageManager;
import android.net.sip.SipAudioCall;
import android.net.sip.SipException;
import android.net.sip.SipManager;
import android.net.sip.SipProfile;
import android.net.sip.SipRegistrationListener;
import android.net.sip.SipSession;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.text.ParseException;


public class MainActivity extends AppCompatActivity {

public void updatestatus(TextView tv, String st){
tv.setText(st);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//cancel begin

TextView tv1=(TextView) findViewById(R.id.txt1);
TextView tv2=(TextView) findViewById(R.id.txt2);
TextView tv3=(TextView) findViewById(R.id.txt3);
TextView tv4=(TextView) findViewById(R.id.txt4);
final TextView tv5=(TextView) findViewById(R.id.txt5);
tv1.setText("THIS IS BEFORE MANAGER");
SipManager mSipManager = null;
SipSession ss=null;
if(mSipManager == null) {
mSipManager = SipManager.newInstance(this);

}


// ss.setListener(new SipSession.Listener());

tv2.setText("THIS IS AFTER MANAGER");
SipProfile mSipProfile = null;
SipProfile.Builder builder = null;
tv3.setText("THIS IS BEFORE PRIFILE");
try {
builder = new SipProfile.Builder("hey2", "192.168.0.5");
builder.setPassword("tech1");
} catch (ParseException e) {
tv1.setText(e.toString());
}


mSipProfile = builder.build();
//mSipProfile = builder.build();


if (ContextCompat.checkSelfPermission(this,
Manifest.permission.USE_SIP)
== PackageManager.PERMISSION_GRANTED) {

System.out.println("GRANTEDDDDDDDDDDDDDDDDD");
}
else{
// No explanation needed, we can request the permission.

ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.USE_SIP},
1);
}

try {
mSipManager.register(mSipProfile,30, new SipRegistrationListener() {

public void onRegistering(String localProfileUri) {
updatestatus(tv5,"Registering with SIP Server...");
}

public void onRegistrationDone(String localProfileUri, long expiryTime) {
updatestatus(tv5,"Ready...");
}

public void onRegistrationFailed(String localProfileUri, int errorCode,
String errorMessage) {

updatestatus(tv5,"Registration failed.");
}
});
} catch (SipException e) {
e.printStackTrace();
}
SipAudioCall call ;

SipAudioCall.Listener listener;


listener = new SipAudioCall.Listener() {

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


}

@Override
public void onCallEnded(SipAudioCall call) {

}
};

try {
call = mSipManager.makeAudioCall(mSipProfile.getUriString(), "sip:1234@192.168.0.5", listener, 30);
} catch (SipException e) {
e.printStackTrace();
}
}
}

代码运行并且 Activity 在 Android 上启动,但什么也没有发生,没有向服务器注册,没有音频调用,没有显示 updatestatus TextView(参见 updateStatus 函数),什么也没有。

有什么想法吗?有什么建议吗?

更新 在 IvBaranov 的回答之后:

仍然没有效果,我也尝试向 SIP 提供商(不是我的 Asterisk 服务器)注册,但仍然没有(我的意思是 Android Studio 控制台中的监视器没有打印预期的内容,即:向服务器注册... ),所以程序似乎没有进入注册方法(因为它没有到达打印/日志记录部分),但是我得到的输出带有一些运行时异常和其他警告,这是我当前的代码与 IvBaranov 的答案集成:

import android.Manifest;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.sip.SipAudioCall;
import android.net.sip.SipException;
import android.net.sip.SipManager;
import android.net.sip.SipProfile;
import android.net.sip.SipRegistrationListener;
import android.net.sip.SipSession;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import java.text.ParseException;


public class MainActivity extends AppCompatActivity {


public void updatestatus(TextView tv, String st){
tv.setText(st);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//cancel begin

TextView tv1=(TextView) findViewById(R.id.txt1);
TextView tv2=(TextView) findViewById(R.id.txt2);
TextView tv3=(TextView) findViewById(R.id.txt3);
TextView tv4=(TextView) findViewById(R.id.txt4);
final TextView tv5=(TextView) findViewById(R.id.txt5);
tv1.setText("THIS IS BEFORE MANAGER");
SipManager mSipManager = null;
SipSession ss=null;
if(mSipManager == null) {
mSipManager = SipManager.newInstance(this);

}



// ss.setListener(new SipSession.Listener());

tv2.setText("THIS IS AFTER MANAGER");
SipProfile mSipProfile = null;
SipProfile.Builder builder = null;
tv3.setText("THIS IS BEFORE PRIFILE");
try {
builder = new SipProfile.Builder("hey2", "192.168.0.5");//my asterisk server running on that IP, to make sure it's reachable i made sure that I can register with Zoiper App (softphone) and I can
builder.setPassword("tech1");
} catch (ParseException e) {
tv1.setText(e.toString());
}


mSipProfile = builder.build();
//mSipProfile = builder.build();




if (ContextCompat.checkSelfPermission(this,
Manifest.permission.USE_SIP)
== PackageManager.PERMISSION_GRANTED) {

System.out.println("GRANTEDDDDDDDDDDDDDDDDD");
}
else{

// No explanation needed, we can request the permission.

ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.USE_SIP},
1);

}

//begin IvBaranov answer
try {
mSipManager.setRegistrationListener(mSipProfile.getUriString(),
new SipRegistrationListener() {

public void onRegistering(String localProfileUri) {
Log.i("SipTest", "Registering with SIP Server...");
}

public void onRegistrationDone(String localProfileUri, long expiryTime) {
Log.i("SipTest", "Ready");
}

public void onRegistrationFailed(String localProfileUri, int errorCode,
String errorMessage) {
Log.i("SipTest", "Registration failed. Please check settings.");
}
});
} catch (SipException e) {
e.printStackTrace();
}

Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
try {
mSipManager.open(mSipProfile, pendingIntent, null);
} catch (SipException e) {
e.printStackTrace();
}

//end IvBaranov answer
SipAudioCall call ;

SipAudioCall.Listener listener;



listener = new SipAudioCall.Listener() {

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


}

@Override
public void onCallEnded(SipAudioCall call) {

}
};

try {
call = mSipManager.makeAudioCall(mSipProfile.getUriString(), "sip:1234@192.168.0.5", listener, 30); //where 1234 is the extension of a user called hey1, the registered user (caller) is hey2 with extension 4321
} catch (SipException e) {
e.printStackTrace();
}

}
}

还有我的 list 文件:

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


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

<uses-sdk android:minSdkVersion="9" />


<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" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

</manifest>

我从监视器得到的输出:

05-30 13:03:36.710 7812-7937/? W/art: Native thread exiting without having called DetachCurrentThread (maybe it's going to use a pthread_key_create destructor?): Thread[22,tid=7937,Native,Thread*=0xb9c787e8,peer=0x22c03b30,"CL--1643955920"]
05-30 13:03:36.854 7751-7771/? E/MC_LineReader: Error opening /sys/class/power_supply/bms/resistance
java.io.FileNotFoundException: /sys/class/power_supply/bms/resistance: open failed: ENOENT (No such file or directory)
at libcore.io.IoBridge.open(IoBridge.java:452)
at java.io.FileInputStream.<init>(FileInputStream.java:76)
at java.io.FileInputStream.<init>(FileInputStream.java:103)
at java.io.FileReader.<init>(FileReader.java:66)
at com.motorola.motocare.util.LineReader.<init>(LineReader.java:20)
at com.motorola.motocare.util.LineReader$1.<init>(LineReader.java:53)
at com.motorola.motocare.util.LineReader.firstLineReader(LineReader.java:53)
at com.motorola.motocare.util.BatteryUtils.getBatteryResistance(BatteryUtils.java:130)
at com.motorola.motocare.action.BatteryLevelAction.onReceiveImpl(BatteryLevelAction.java:42)
at com.motorola.motocare.util.BackgroundReceiver$1.run(BackgroundReceiver.java:14)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)
Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
at libcore.io.Posix.open(Native Method)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
at libcore.io.IoBridge.open(IoBridge.java:438)
at java.io.FileInputStream.<init>(FileInputStream.java:76) 
at java.io.FileInputStream.<init>(FileInputStream.java:103) 
at java.io.FileReader.<init>(FileReader.java:66) 
at com.motorola.motocare.util.LineReader.<init>(LineReader.java:20) 
at com.motorola.motocare.util.LineReader$1.<init>(LineReader.java:53) 
at com.motorola.motocare.util.LineReader.firstLineReader(LineReader.java:53) 
at com.motorola.motocare.util.BatteryUtils.getBatteryResistance(BatteryUtils.java:130) 
at com.motorola.motocare.action.BatteryLevelAction.onReceiveImpl(BatteryLevelAction.java:42) 
at com.motorola.motocare.util.BackgroundReceiver$1.run(BackgroundReceiver.java:14) 
at android.os.Handler.handleCallback(Handler.java:746) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.os.HandlerThread.run(HandlerThread.java:61) 

还有这个(在运行程序期间):

05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: android.net.sip.SipException: SipService.createSession() returns null
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.net.sip.SipManager.register(SipManager.java:496)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at com.aeronavigator.voip.MainActivity.onCreate(MainActivity.java:84)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.Activity.performCreate(Activity.java:6245)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.os.Looper.loop(Looper.java:148)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5443)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at java.lang.reflect.Method.invoke(Native Method)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
05-30 13:04:14.203 8436-8436/com.aeronavigator.voip W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: android.net.sip.SipException: VOIP API is not supported
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.net.sip.SipManager.makeAudioCall(SipManager.java:368)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at com.aeronavigator.voip.MainActivity.onCreate(MainActivity.java:133)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.Activity.performCreate(Activity.java:6245)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.-wrap11(ActivityThread.java)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.os.Looper.loop(Looper.java:148)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5443)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at java.lang.reflect.Method.invoke(Native Method)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
05-30 13:04:14.205 8436-8436/com.aeronavigator.voip W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

最佳答案

尽量不要手动注册,而是通过 open() SIP 配置文件:

try {
mSipManager.setRegistrationListener(mSipProfile.getUriString(),
new SipRegistrationListener() {

public void onRegistering(String localProfileUri) {
Log.i("SipTest", "Registering with SIP Server...");
}

public void onRegistrationDone(String localProfileUri, long expiryTime) {
Log.i("SipTest", "Ready");
}

public void onRegistrationFailed(String localProfileUri, int errorCode,
String errorMessage) {
Log.i("SipTest", "Registration failed. Please check settings.");
}
});
} catch (SipException e) {
e.printStackTrace();
}

Intent intent = new Intent();
intent.setAction("android.SipDemo.INCOMING_CALL");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, Intent.FILL_IN_DATA);
try {
mSipManager.open(mSipProfile, pendingIntent, null);
} catch (SipException e) {
e.printStackTrace();
}

并在 Manifest.xml 中仔细检查您的权限。你应该:

  <uses-sdk android:minSdkVersion="9" />
<uses-permission android:name="android.permission.USE_SIP" />
<uses-permission android:name="android.permission.INTERNET" />
...
<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" />

更新。

要检查您的设备是否支持 Android SIP 堆栈,请使用以下方法:

SipManager.isApiSupported(), SipManager.isVoipSupported()

否则请考虑使用 third party SIP stacks 之一.

关于java - 如何使用 Android SIP API 向 SIP 服务器注册 SIP 配置文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192827/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com