2012-06-24 3 views
5

Мне нужно разработать приложение VOIP между двумя устройствами Android.
Как я знаю, для этой цели используется протокол SIP, но для регистрации SIP требуется регистрация на SIP-сервер и доступ к Интернету для сигнализации SIP.
Можно ли создать приложение VOIP в андроиде без доступа в Интернет?Приложение VOIP для Android без доступа в Интернет

+0

ли вы имеете в виду как своего рода рация? Есть ли способы сделать peer to peer с Wi-Fi и Bluetooth, это удовлетворит ваши потребности? – MikeIsrael

+0

Да. На самом деле мне нужно ОДНО, чтобы МНОГО рации, с Wi-Fi. Вид конференции без доступа в Интернет –

+0

SIP не требует доступа в Интернет и не требует ничего большего, чем сами пользовательские агенты. (Эти вещи _useful_, но не _required_.) –

ответ

3

Конечно, это возможно! Зачем вам нужен интернет? Пока вы оба подключены к одной и той же сети, это нормально! Ниже приведена java и xml для рабочего приложения.

При запуске он предоставит вам собственный локальный порт, например «52022» .. это случайный каждый раз и, к сожалению, это не поможет. Затем мы вводим IP-адрес другого телефона и их произвольно сгенерированный номер порта и нажимаем connect. Они делают точно то же самое и BAM вы подключены :) Это тестовое приложение, очевидно, требует, чтобы вы были рядом, чтобы обмениваться номерами портов, но в моем правильном приложении я мог легко запросить каждый номер порта перед подключением. Надеюсь это поможет!

public class MainActivity extends Activity { 

AudioGroup m_AudioGroup; 
AudioStream m_AudioStream; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
     try { 
      AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
      audio.setMode(AudioManager.MODE_IN_COMMUNICATION); 
      m_AudioGroup = new AudioGroup(); 
      m_AudioGroup.setMode(AudioGroup.MODE_NORMAL); 
      m_AudioStream = new AudioStream(InetAddress.getByAddress(getLocalIPAddress())); 
      int localPort = m_AudioStream.getLocalPort(); 
      m_AudioStream.setCodec(AudioCodec.PCMU); 
      m_AudioStream.setMode(RtpStream.MODE_NORMAL); 

      ((TextView)findViewById(R.id.lblLocalPort)).setText(String.valueOf(localPort)); 

      ((Button) findViewById(R.id.button1)).setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       String remoteAddress = ((EditText)findViewById(R.id.editText2)).getText().toString(); 
       String remotePort = ((EditText)findViewById(R.id.editText1)).getText().toString(); 

        try { 
        m_AudioStream.associate(InetAddress.getByName(remoteAddress), Integer.parseInt(remotePort)); 
       } catch (NumberFormatException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (UnknownHostException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
        m_AudioStream.join(m_AudioGroup); 
      } 
     }); 

      ((Button) findViewById(R.id.button2)).setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
         m_AudioStream.release(); 
       } 
      }); 

     } catch (Exception e) { 
     Log.e("----------------------", e.toString()); 
     e.printStackTrace(); 
     } 
} 

public static byte[] getLocalIPAddress() { 
    byte ip[]=null; 
     try { 
      for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
       NetworkInterface intf = en.nextElement(); 
       for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
        InetAddress inetAddress = enumIpAddr.nextElement(); 
        if (!inetAddress.isLoopbackAddress()) { 
        ip= inetAddress.getAddress(); 
        } 
       } 
      } 
     } catch (SocketException ex) { 
      Log.i("SocketException ", ex.toString()); 
     } 
     return ip; 

} 

}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/LinearLayout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<TextView 
    android:id="@+id/lblLocalPort" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/localPort" /> 

<EditText 
    android:id="@+id/editText2" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp" 
    android:ems="10" 
    android:hint="@string/iPHint" 
    android:inputType="phone" /> 

<EditText 
    android:id="@+id/editText1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp" 
    android:ems="10" 
    android:hint="@string/portHint" 
    android:inputType="number" > 

    <requestFocus /> 
</EditText> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp"> 

    <Button 
     android:id="@+id/button1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/connect" /> 

    <Button 
     android:id="@+id/button2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/Disconnect" /> 
</LinearLayout> 

EDIT: Метод IP-адрес перестал работать на API 22, используйте код ниже:

private byte[] getLocalIPAddress() { 
    byte[] bytes = null; 

    try { 
     // get the string ip 
     WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); 
     String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); 

     // convert to bytes 
     InetAddress inetAddress = null; 
     try { 
      inetAddress = InetAddress.getByName(ip); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 

     bytes = new byte[0]; 
     if (inetAddress != null) { 
      bytes = inetAddress.getAddress(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Toast.makeText(this, R.string.phone_voip_incompatible, Toast.LENGTH_SHORT).show(); 
    } 

    return bytes; 
} 
+0

Я получаю это исключение E/----------------------: java.net.SocketException: Недопустимый аргумент –

+0

Это был в то время как я использовал это, и я знаю, что способ получить IP-адрес изменился в последних обновлениях Android. – Murphybro2

+0

Можете ли вы посоветовать мне, как сделать голосовое вызов через локальный Wi-Fi от одного устройства Android до другого? –

2

Это невозможно, потому что вызов VOIP проходит через Интернет и через сервер sip.

для примера. если вы хотите позвонить за границу из своей страны с помощью VOIP dailer, вам необходим интернет-доступ, потому что невозможно общаться через Bluetooth.

Спасибо.

+0

Но если я просто хочу, чтобы 2 телефона подключались через WIFI, разговаривали друг с другом без подключения к Интернету? –

+0

невозможно, потому что вам нужен сервер для общения друг с другом ..... –

+0

Но это только для SIP. Может быть, есть способ создать приложение VOIP в Java vithout SIP? –

3

Фактически клиенты SIP могут разговаривать одноранговыми, они просто должны знать свои IP-адреса и порты UDP, где они прослушивают сообщения SIP.

Вы можете поиграть с обычными SIP-клиентами на двух компьютерах (X-Lite для Windows, Twinkle для Linux и некоторые другие существуют) и попытаться установить вызов между ними без регистрации сервера. Это вполне возможно.

Также вы можете запустить минималистичный SIP-сервер в локальной локальной сети. Например, FreeSWITCH можно свести к минимуму до небольшого размера.

+0

FreeSWITCH может быть установлен на Android? –

+0

нет, я так не считаю. Это написано на C, а андроид - на основе java –

+0

Android основан на LINUX C, Java добавлен ontop из C –

2

ОК, поэтому, если вы ищете некоторые сообщения peer-2-peer, я думаю, что Wi-Fi - это путь (лучшее расстояние и скорость). Если вы можете разрабатывать только новые версии Android, то WI-FI Direct - это путь, но это будет работать только на Android 4.0 и выше.

Для того, чтобы что-то работало ниже 4.0, вам придется идти с Сторонняя библиотека. Я знаю, что Qualcomm имеет библиотеку под названием alljoyn, но не уверен, насколько она хороша.

+0

Это здорово, но мне нужно приложение VOIP :) –

+0

, как только у вас есть соединение, вы можете запускать любую услугу, которую вы хотите по ней. Если вы ищете voip с уже встроенной возможностью p2p, то я не думаю, что вы ее найдете. – MikeIsrael

+0

На самом деле мне нужна функция Point To Multi Points :) –

2

Я думаю, вы можете использовать JITSI для службы p2p voip на нескольких платформах, включая Andriod.

Это мои выводы об этом проекте: -

  1. Не нужно никакого сервера или интернет-подключение.
  2. Пользователи должны находиться в одной сети.
  3. Открытый исходный код.
  4. Android apk доступен, скорее всего, вы можете найти его на веб-сайте или его можно скомпилировать.
Смежные вопросы