我需要在托管热点时找到设备的IP地址.到目前为止我使用过这段代码:
//if is using Hotspot
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
if (intf.getName().contains("wlan")) {
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) {
return inetAddress.getHostAddress();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这工作得很好但是NetworkInterface某些设备上的wifi 名称不同.所以我必须首先找到设备的wifi NetworkInterface名称(针对其热点).我怎么能找到这个名字?或者是否有更好的方法来查找设备的IP地址?
///通过MAC查找正确的IP地址似乎也不起作用
我有一个Android应用程序和一个可通过Wi-Fi服务器.
对于某些操作(例如来自服务器的视频流),我的应用程序通过共享文件的URL来使用第三方应用程序.
从Android L设备开始可以同时连接到Wi-Fi和蜂窝网络,这打破了我的应用程序,因为服务器没有互联网,而且蜂窝网络越来越受到Android的青睐(因为它有互联网),因此URL无法解析.我通过bindProcessToNetwork()将我的应用程序绑定到Wi-Fi来修复此问题.但是,当应用程序与第三方应用程序共享URL时,由于第三方应用程序未绑定到Wi-Fi,因此仍无法解析该URL.
有没有办法让第三方应用程序在打开我的应用程序提供的URL时使用Wi-Fi而不是蜂窝?
android cellular-network android-networking android-wifi android-5.0-lollipop
似乎多播接收在某些Android设备上不起作用.我无法通过13个测试设备中的4个接收多播.在这4个设备上,应用程序似乎不发送加入多播组的IGMP请求.
接收多播的代码如下所示:
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, TAG);
WifiManager.MulticastLock multicastLock = wifiManager.createMulticastLock(TAG);
multicastLock.setReferenceCounted(true);
wifiLock.acquire();
multicastLock.acquire();
try {
MulticastSocket socket = new MulticastSocket(32123);
InetAddress group = InetAddress.getByName("224.1.2.3");
socket.joinGroup(group);
DatagramPacket packet;
byte[] buf = new byte[256];
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
socket.leaveGroup(group);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
multicastLock.release();
wifiLock.release();
Run Code Online (Sandbox Code Playgroud)
该应用具有以下权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
Run Code Online (Sandbox Code Playgroud)
为了演示这个问题,我在GitHub:MulticastTest上使用上面的代码创建了一个小测试项目.
我的代码有问题吗?我错过了许可吗?
编辑1:此问题似乎与特定的Android版本无关.我可以在Android 4.x,5.x和6.x上重现这种行为.
编辑2:有一个相关的问题.
我正在尝试使用 Android Q 上的 WifiNetworkSpecifier 连接到 WiFi。我遇到的问题是 Android 始终使用最后一个有效凭据连接到 AP,即使在我手动向 WifiNetworkSpecifier 提供新的更新凭据之后也是如此。
这是流程:
如果我颠倒逻辑,同样的事情会发生:
关键是,一旦它使用有效凭据连接到 SSID,无论我放入 WifiNetworkSpecifier 的任何内容似乎都没有任何区别,它只是一遍又一遍地使用最后一个有效凭据。
这发生在 Google Pixel 2 和华为 P30 Lite 上。但是,在三星 Galaxy S9 上一切正常(如果我更新 WiFi 网络密码并为应用程序提供新的有效密码,应用程序将连接到 WiFi 网络;如果我提供它,它将无法连接到 WiFi假密码,假设我们之前成功连接到 WiFi)。
重启设备后,Pixel 和华为的问题得到“解决”,但是当我再次连接到 WiFi 时(输入有效凭据),我们又回到了同样的问题。
我不确定我是否在这里遗漏了一些微不足道的东西,但任何帮助将不胜感激!谢谢!
编辑:事实证明,您不必输入有效凭据即可触发此循环。例如,如果您第一次尝试使用虚假密码连接AP,并且在尝试使用正确密码连接后,系统会使用此错误密码(第一次输入的密码)进行连接。同样,这种情况发生在 Pixel 2 和华为 P30 Lite 上,但在 Galaxy S9 和 S9+ 上运行良好。重新启动手机仍会清除此“状态”。
这是代码:
@RequiresApi(api = Build.VERSION_CODES.Q)
private fun connectToWiFiOnQ(context: Context, wifiCredentials: WifiCredentials) {
val connectivityManager: ConnectivityManager =
context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val …Run Code Online (Sandbox Code Playgroud) android android-networking android-wifi android-connectivitymanager android-10.0
我在连接管理器中偶尔会看到空指针异常.从意图服务我通过isOnWIFI(this)检查网络状态.在cm.getActiveNetworkInfo()行发生异常.这很奇怪,因为我在调用之前检查了null.注意:权限已设置.
public static boolean isOnWIFI(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm != null
//here occurs NullPointerException
&& cm.getActiveNetworkInfo() != null
&& ((cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && cm.getNetworkInfo(
ConnectivityManager.TYPE_WIFI).isConnected()));
}
Run Code Online (Sandbox Code Playgroud)
有没有想过为什么会这样?我无法调试它,因为它只是偶尔出现错误报告.我看到的唯一解决方案是将其放入try catch块.谢谢.
我正试图通过锁定屏幕显示Google位置服务(打开GPS,网络数据等)对话框.
我正在使用KeyguardManager来禁用锁定屏幕.这可以正常工作,因为我的MainActivity能够禁用锁定屏幕.但是,只要Google位置服务对话框显示,锁定屏幕就会恢复启用,屏幕会被锁定,除非我解锁屏幕,否则无法进入我的MainActivity.
我甚至试过...... Flag_Show_When_Locked,但它没有帮助.
这是我的代码:
private KeyguardLock DisableScreenLock;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
setContentView(R.main_layout);
KeyguardManager myKeyGuard = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
DisableScreenLock = myKeyGuard.newKeyguardLock("disableKeyguard");
DisableScreenLock.disableKeyguard();
}
protected synchronized void GoogleApiClient_Intialize() {
Log.e(TAG, "Building GoogleApiClient");
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
protected void LocationRequest_Intialize() {
locationRequest = new LocationRequest();
locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
protected void LocationSettingsRequest_Builder() {
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
builder.addLocationRequest(locationRequest);
locationSettingsRequest = builder.build();
}
@Override
public void onConnected(Bundle connectionHint) {
Log.e(TAG, "GoogleApiClient is connected"); …Run Code Online (Sandbox Code Playgroud) android lockscreen android-networking location-services android-gps
我正在开发和通过wifi(由设备生成)连接到硬件设备并通过套接字连接向其发送数据的应用程序.问题是,当移动数据(3G/4G)被激活时,android会尝试通过它发送数据而不是通过设备生成的wifi发送数据,因为因为wifi没有互联网连接.我正在考虑使用ConnectivityManager#setNetworkPreference(),但它在api 21中已被弃用.
如何设置它使用设备生成的wifi而不是移动数据接口发送数据?
sockets android android-networking android-wifi network-interface
我目前正在尝试测试实际收到的网络响应.
虽然我知道这不是我应该在测试方面做的事情,但我对自己的意志充满了好奇心,如果可能的话我想继续.
就目前而言,我已成功创建了测试.请求将毫无问题地发送到排队队列.
现在奇怪的部分:
该请求永远不会执行.这是我如何测试它的想法:
@Test
public void testSimpleGetResponseFromServerVolley() throws Exception {
final CountDownLatch signal = new CountDownLatch(1);
NetworkClass.NetworkListener listener = new NetworkClass.NetworkListener() {
@Override
public void onResponse(Response response) {
assertThat(response != null);
System.out.println("Got Response");
signal.countDown();
}
@Override
public void onError(Throwable error) {
System.out.println("No Response");
signal.countDown();
}
};
NetworkClass.getResponseFromServer(null, listener);
signal.await();
}
Run Code Online (Sandbox Code Playgroud)
此代码意外地导致测试挂起并且永远不会完成.
然而,这是我不再理解这种情况的地方:
如果我通过调试运行测试并逐行执行,则测试成功执行,并收到响应.
我认为发生了什么:
当我逐步通过调试时,凌空requestQueue成功继续并发出请求,并在await()调用之前接收响应.
当我不通过调试步进时,await()阻塞处理所有这一切的线程.
关于如何处理这个问题的任何想法?
我正在尝试查找资源或库,这些资源或库可以允许我以编程方式捕获设备的所有网络数据包的流量,无论是来自wifi还是移动网络.我相信不需要root权限才能在这个混杂模式的鲨鱼根本就请求,因为有这个程序在Play商店中,可以捕获所有网络流量(甚至解密用MITM SSL),而不需要root权限.我根本无法弄清楚如何做同样的事情.
我的问题是:这个应用程序是如何实现此捕获的?他们使用了什么API?
谢谢您的帮助.
android network-programming packet-sniffers android-networking
android ×10
android-wifi ×5
android-10.0 ×1
android-connectivitymanager ×1
android-gps ×1
igmp ×1
ip-address ×1
junit ×1
lockscreen ×1
mockito ×1
multicast ×1
networking ×1
sockets ×1
wifi ×1