List all listening network interfaces

This commit is contained in:
edr
2020-05-13 21:36:33 +02:00
parent 9b5857e2c8
commit b2df26e13b
9 changed files with 134 additions and 87 deletions

View File

@@ -8,7 +8,7 @@ device and receive an audio stream.
The project is a fork of _Protect Baby Monitor_ which is declared as "on hiatus" by its developer. The project is a fork of _Protect Baby Monitor_ which is declared as "on hiatus" by its developer.
_Child Monitor_ works on Android 4.4 (KitKat) and newer, i.e. Android SDK 19. _Child Monitor_ works on Android 5.0 (Lollipop) and newer, i.e. Android SDK 21.
The current version of _Child Monitor_ is rudimentary at best. It is capable The current version of _Child Monitor_ is rudimentary at best. It is capable
of successfully advertising itself on the network, allows clients to connect, of successfully advertising itself on the network, allows clients to connect,

View File

@@ -11,7 +11,7 @@ android {
defaultConfig { defaultConfig {
applicationId "child.monitor" applicationId "child.monitor"
minSdkVersion 19 minSdkVersion 21
targetSdkVersion 26 targetSdkVersion 26
versionCode 4 versionCode 4
versionName "0.4" versionName "0.4"

View File

@@ -4,6 +4,7 @@
android:versionCode="2" android:versionCode="2"
android:versionName="0.2" > android:versionName="0.2" >
<uses-permission android:required="true" android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:required="true" android:name="android.permission.INTERNET"/> <uses-permission android:required="true" android:name="android.permission.INTERNET"/>
<uses-permission android:required="true" android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:required="true" android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:required="true" android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:required="true" android:name="android.permission.ACCESS_WIFI_STATE"/>

View File

@@ -18,20 +18,24 @@ package de.rochefort.childmonitor;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.media.AudioRecord; import android.media.AudioRecord;
import android.media.MediaRecorder; import android.media.MediaRecorder;
import android.net.ConnectivityManager;
import android.net.LinkAddress;
import android.net.Network;
import android.net.NetworkInfo;
import android.net.nsd.NsdManager; import android.net.nsd.NsdManager;
import android.net.nsd.NsdServiceInfo; import android.net.nsd.NsdServiceInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle; import android.os.Bundle;
import android.text.format.Formatter;
import android.util.Log; import android.util.Log;
import android.widget.TextView; import android.widget.TextView;
@@ -138,23 +142,47 @@ public class MonitorActivity extends Activity {
} }
}).start(); }).start();
final TextView addressText = (TextView) findViewById(R.id.address); final TextView addressText = findViewById(R.id.address);
// Use the application context to get WifiManager, to avoid leak before Android 5.1 List<String> listenAddresses = getListenAddresses();
final WifiManager wifiManager = if(!listenAddresses.isEmpty()) {
(WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE); StringBuilder sb = new StringBuilder();
final WifiInfo info = wifiManager.getConnectionInfo(); for (int i = 0; i < listenAddresses.size(); i++) {
final int address = info.getIpAddress(); String listenAddress = listenAddresses.get(i);
if(address != 0) { sb.append(listenAddress);
@SuppressWarnings("deprecation") if (i != listenAddresses.size() -1) {
final String ipAddress = Formatter.formatIpAddress(address); sb.append("\n\n");
addressText.setText(ipAddress); }
}
addressText.setText(sb.toString());
} else { } else {
addressText.setText(R.string.wifiNotConnected); addressText.setText(R.string.notConnected);
} }
} }
private List<String> getListenAddresses() {
String service = Context.CONNECTIVITY_SERVICE;
ConnectivityManager cm = (ConnectivityManager)getSystemService(service);
List<String> listenAddresses = new ArrayList<>();
if (cm != null) {
for (Network network : cm.getAllNetworks()) {
NetworkInfo networkInfo = cm.getNetworkInfo(network);
boolean connected = networkInfo.isConnected();
if (connected) {
List<LinkAddress> linkAddresses = cm.getLinkProperties(network).getLinkAddresses();
for (LinkAddress linkAddress : linkAddresses) {
InetAddress address = linkAddress.getAddress();
if (!address.isLinkLocalAddress() && !address.isLoopbackAddress()) {
listenAddresses.add(address.getHostAddress() + " (" + networkInfo.getTypeName() + ")");
}
}
}
}
}
return listenAddresses;
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
Log.i(TAG, "ChildMonitor stop"); Log.i(TAG, "ChildMonitor stop");

View File

@@ -23,6 +23,19 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="15dip" /> android:layout_height="15dip" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:id="@+id/LinearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:keepScreenOn="true"
tools:context="de.rochefort.childmonitor.MonitorActivity" >
<TextView <TextView
android:id="@+id/serviceTitle" android:id="@+id/serviceTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -47,19 +60,9 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="15dip" /> android:layout_height="15dip" />
<TextView <Space
android:id="@+id/addressTitle" android:layout_width="match_parent"
android:layout_width="wrap_content" android:layout_height="15dip" />
android:layout_height="wrap_content"
android:text="@string/addressTitle"
android:textSize="20sp" />
<TextView
android:id="@+id/address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textSize="20sp"/>
<TextView <TextView
android:id="@+id/portTitle" android:id="@+id/portTitle"
@@ -75,11 +78,27 @@
android:text="@string/loading" android:text="@string/loading"
android:textSize="20sp"/> android:textSize="20sp"/>
<Space
android:layout_width="match_parent"
android:layout_height="15dip" />
<TextView <TextView
android:id="@+id/addressDescription" android:id="@+id/addressTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/addressDescription" /> android:text="@string/addressTitle"
android:textSize="20sp" />
<Space
android:layout_width="match_parent"
android:layout_height="15dip" />
<TextView
android:id="@+id/address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="15sp"/>
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
@@ -91,5 +110,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="" android:text=""
android:textSize="20sp" /> android:textSize="20sp" />
</LinearLayout>
</ScrollView>
</LinearLayout> </LinearLayout>

View File

@@ -20,10 +20,9 @@
<string name="connectedTo">Verbunden mit:</string> <string name="connectedTo">Verbunden mit:</string>
<string name="disconnected">Getrennt</string> <string name="disconnected">Getrennt</string>
<string name="listening">Lausche...</string> <string name="listening">Lausche...</string>
<string name="addressTitle">Adresse:</string> <string name="addressTitle">Adressen:</string>
<string name="portTitle">Port:</string> <string name="portTitle">Port:</string>
<string name="addressDescription">Adresse und Port zum Koppeln mit Eltern</string> <string name="notConnected">Mit keinem Netzwerk verbunden</string>
<string name="wifiNotConnected">Nicht mit WLAN-Netzwerk verbunden</string>
<string name="enterAddressInstructions">Gib die IP-Adresse und den Port des Kind-Gerätes ein und klicke auf Verbinden</string> <string name="enterAddressInstructions">Gib die IP-Adresse und den Port des Kind-Gerätes ein und klicke auf Verbinden</string>
<string name="connect">Verbinden</string> <string name="connect">Verbinden</string>
<string name="exampleAddress">192.168.1.2</string> <string name="exampleAddress">192.168.1.2</string>

View File

@@ -22,8 +22,7 @@
<string name="listening">リスニング中...</string> <string name="listening">リスニング中...</string>
<string name="addressTitle">アドレス:</string> <string name="addressTitle">アドレス:</string>
<string name="portTitle">ポート:</string> <string name="portTitle">ポート:</string>
<string name="addressDescription">親機がペアにする先のアドレスとポート</string> <string name="notConnected">ネットワークに接続されていません</string>
<string name="wifiNotConnected">Wi-Fi ネットワークに接続されていません</string>
<string name="enterAddressInstructions">子機の IP アドレスとポートを入力して、接続をクリックしてください</string> <string name="enterAddressInstructions">子機の IP アドレスとポートを入力して、接続をクリックしてください</string>
<string name="connect">接続</string> <string name="connect">接続</string>
<string name="exampleAddress">192.168.1.2</string> <string name="exampleAddress">192.168.1.2</string>

View File

@@ -20,10 +20,9 @@
<string name="connectedTo">Verbonden met:</string> <string name="connectedTo">Verbonden met:</string>
<string name="disconnected">Verbinding verbroken</string> <string name="disconnected">Verbinding verbroken</string>
<string name="listening">Bezig met luisteren...</string> <string name="listening">Bezig met luisteren...</string>
<string name="addressTitle">Adres:</string> <string name="addressTitle">Adressen:</string>
<string name="portTitle">Poort:</string> <string name="portTitle">Poort:</string>
<string name="addressDescription">Adres en poort waar de ouder mee moet verbinden</string> <string name="notConnected">Niet verbonden met een netwerk</string>
<string name="wifiNotConnected">Niet verbonden met een Wi-Fi-netwerk</string>
<string name="enterAddressInstructions">Voer het IP-adres en de poort van een kindapparaat in en druk op Verbinden</string> <string name="enterAddressInstructions">Voer het IP-adres en de poort van een kindapparaat in en druk op Verbinden</string>
<string name="connect">Verbinden</string> <string name="connect">Verbinden</string>
<string name="exampleAddress">192.168.1.2</string> <string name="exampleAddress">192.168.1.2</string>

View File

@@ -20,10 +20,9 @@
<string name="connectedTo">Connected To:</string> <string name="connectedTo">Connected To:</string>
<string name="disconnected">Disconnected</string> <string name="disconnected">Disconnected</string>
<string name="listening">Listening...</string> <string name="listening">Listening...</string>
<string name="addressTitle">Address:</string> <string name="addressTitle">Addresses:</string>
<string name="portTitle">Port:</string> <string name="portTitle">Port:</string>
<string name="addressDescription">Address and port that parent must pair to</string> <string name="notConnected">Not connected to any network</string>
<string name="wifiNotConnected">Not connected to a Wi-Fi network</string>
<string name="enterAddressInstructions">Enter the IP Address and port of a child and click Connect</string> <string name="enterAddressInstructions">Enter the IP Address and port of a child and click Connect</string>
<string name="connect">Connect</string> <string name="connect">Connect</string>
<string name="exampleAddress">192.168.1.2</string> <string name="exampleAddress">192.168.1.2</string>