2012-06-24 8 views
5

Ich muss die VOIP-Anwendung zwischen 2 Android-Geräten entwickeln.
Wie ich weiß gibt es ein SIP-Protokoll für diesen Zweck verwendet, aber es erfordert die Registrierung für SIP-Server und den Zugang zum Internet für SIP-Signalisierung.
Ist eine Möglichkeit, VOIP-Anwendung in Android ohne Internetzugang zu erstellen?Android VOIP-Anwendung ohne Zugriff auf das Internet

+0

Meinten Sie wie eine Art Walkie-Talkie? Es gibt Möglichkeiten, Peer zu Peer mit WiFi und Bluetooth zu tun, würde das Ihre Bedürfnisse erfüllen? – MikeIsrael

+0

Ja. Eigentlich brauche ich eins zu vielen Walkie-Talkie, mit WLAN. Art der Konferenz ohne Zugang zum Internet –

+0

SIP benötigt keinen Internetzugang, noch benötigt es mehr als die Benutzeragenten selbst. (Diese Dinge sind _useful_, aber nicht _erforderlich_.) –

Antwort

3

Natürlich ist es möglich! Warum brauchst du das Internet? Solange Sie beide mit dem gleichen Netzwerk verbunden sind, ist das in Ordnung! Unten finden Sie das Java und XML für eine funktionierende App.

Beim Start wird es Ihnen einen eigenen lokalen Port geben, zum Beispiel "52022". Dies ist jedes Mal zufällig und leider kann nicht geholfen werden. Wir geben dann die IP-Adresse des anderen Telefons und ihre zufällig generierte Portnummer ein und drücken die Verbindungstaste. Sie tun genau das gleiche und BAM Sie sind verbunden :) Diese Test-App erfordert offensichtlich, dass Sie in der Nähe von Portnummern austauschen, aber in meiner richtigen App war ich leicht in der Lage, jede Portnummer vor dem Verbinden anzufordern. Hoffe das hilft!

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: Die IP-Adresse Methode aufhörte bei API 22 arbeiten, unter Code verwenden:

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

Ich bekomme diese Ausnahme E/----------------------: java.net.SocketException: Ungültiges Argument –

+0

Es war a während ich dies verwendet habe und mir bewusst ist, dass der Weg, um eine IP-Adresse zu erhalten, hat sich auf den letzten Android-Updates geändert. – Murphybro2

+0

Können Sie mir helfen, Sprachanrufe über lokales WLAN von einem Android-Gerät zum anderen zu führen? –

2

Es ist nicht möglich, weil VoIP-Anruf über das Internet und über SIP-Server übergeben.

für Beispiel. Wenn Sie über den VOIP-Dailer von Ihrem Land aus anrufen möchten, benötigen Sie einen Internetzugang, da eine Kommunikation über Bluetooth nicht möglich ist.

Danke.

+0

Aber wenn ich will nur 2 Telefone mit WIFI miteinander verbunden ohne die Internetverbindung verbunden? –

+0

ist es nicht möglich, weil Sie einen Server benötigen, um miteinander zu kommunizieren ..... –

+0

Aber es ist nur für SIP. Vielleicht gibt es eine Möglichkeit, VOIP-Anwendung in Java ohne SIP zu bauen? –

3

tatsächlich SIP-Clients können Peer-to-Peer sprechen, sie müssen nur ihre IP-Adressen und UDP-Ports wissen, wo sie auf SIP-Nachrichten hören.

Sie können mit normalen SIP-Clients auf zwei Comutern herumspielen (X-Lite für Windows, Twinkle für Linux und einige andere existieren auch) und versuchen, einen Anruf zwischen ihnen ohne Serverregistrierung aufzubauen. Es ist durchaus möglich.

Sie können auch einen minimalistischen SIP-Server irgendwo im lokalen LAN betreiben. Zum Beispiel kann FreeSWITCH auf eine sehr kleine Stellfläche minimiert werden.

+0

FreeSWITCH kann auf Android installiert werden? –

+0

Nein, das glaube ich nicht. Es ist in C geschrieben, und Android ist Java-basierte –

+0

Android ist LINUX C basiert, Java ist ontop C –

2

OK also, wenn Sie nach Peer-2-Peer-Kommunikation suchen, denke ich, WLAN ist der Weg zu gehen (bessere Entfernung und Geschwindigkeiten). Wenn Sie nur für neuere Versionen von Android entwickeln können, dann ist WI-FI Direct der Weg zu gehen, aber das wird nur auf Android 4.0 und höher funktionieren

Um etwas unter 4,0 laufen zu haben, müssen Sie mit einem gehen Bibliothek von Drittanbietern. Ich weiß, Qualcomm hat eine Bibliothek namens alljoyn, aber nicht sicher, wie gut es ist.

+0

Es ist großartig, aber ich brauche VOIP-Anwendung :) –

+0

Sobald Sie die Verbindung haben, können Sie ausführen, was auch immer Sie wollen. Wenn Sie nach einer voip mit P2P-Fähigkeit suchen, die bereits eingebaut ist, dann denke ich nicht, dass Sie es finden werden. – MikeIsrael

+0

Eigentlich brauche ich Point to Multi Points Fähigkeit :) –

2

Ich denke, Sie können JITSI für P2P-VoIP-Dienst auf mehreren Plattformen einschließlich Andriod verwenden.

Dies sind meine Erkenntnisse zu diesem Projekt: -

  1. Sie einen beliebigen Server oder Internet-Konnektivität nicht benötigen.
  2. Benutzer müssen sich in demselben Netzwerk befinden.
  3. Open Source.
  4. Android apk ist verfügbar, wahrscheinlich können Sie es Code auf der Website finden, oder Sie können es dekompilieren.