首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用API 30 (android 11)从三星物理仿真器中出错Android 11 -> java.net.SocketTimeoutException (Android 11)

使用API 30 (android 11)从三星物理仿真器中出错Android 11 -> java.net.SocketTimeoutException (Android 11)
EN

Stack Overflow用户
提问于 2021-06-28 21:34:08
回答 1查看 361关注 0票数 0

我有两个物理模拟器

  1. 三星手机配API 30 (安卓11)
  2. 三星平板电脑API 25 (Android7.1)

每当我试图使用带有API 25 (android 7.1)的三星平板电脑运行连接到套接字的应用程序时,我的套接字连接就会完美无缺,但是如果我使用带有API 30 (android 11)的三星手机运行它,我总是在堆栈跟踪中得到以下错误:

代码语言:javascript
复制
java.net.SocketTimeoutException: failed to connect to /192.168.43.1 (port 5050) from /10.144.1.42 (port 50696) after 5000ms

这是我的代码:

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {
AtomicReference<String> serverIP = new AtomicReference<>("");
String localIP;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setWiFiAddress(getApplication());
    ExecutorService executorService = Executors.newFixedThreadPool(1);
    executorService.execute(() -> {
        Socket socket = new Socket();
        try {
            socket.connect(new InetSocketAddress(serverIP.get(), 5050), 5000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("ok");
    });
}

public Boolean setWiFiAddress(Application application) {
    ConnectivityManager connectivityManager = (ConnectivityManager) application.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Network nw = connectivityManager.getActiveNetwork();
        if (nw == null) return false;
        NetworkCapabilities actNw = connectivityManager.getNetworkCapabilities(nw);
        if (actNw != null && actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            final WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            InetAddress localIP = getIntAddress(manager.getDhcpInfo().ipAddress);
            if(localIP != null) {
                this.localIP = localIP.getHostAddress();
            }
            InetAddress address = getIntAddress(manager.getDhcpInfo().serverAddress);
            if (address != null) {
                serverIP.set(address.getHostAddress());
                return true;
            }
        }
    }
    serverIP.set("");
    return false;
}

private InetAddress getIntAddress(int hostAddress) {
    // Get IP Address
    byte[] addressBytes = {(byte) (0xff & hostAddress),
            (byte) (0xff & (hostAddress >> 8)),
            (byte) (0xff & (hostAddress >> 16)),
            (byte) (0xff & (hostAddress >> 24))};

    try {
        return InetAddress.getByAddress(addressBytes);
    } catch (UnknownHostException e) {
        return null;
    }
}

}

我在网上搜索了很多建议,就是在<application ....> </application> AndroidManifest.xml中添加<application ....> </application>,但这并没有解决问题。

我还确保我拥有我的应用程序中所需的所有权限列表:

代码语言:javascript
复制
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.hardware.location.gps" />
<uses-permission android:name="android.hardware.location.network" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

我想知道为什么我会得到错误的这一部分:from /10.144.1.42 (port 50696),因为网络子网是: 192.168.43.x,服务器套接字位于192.168.43.1 (它也是wifi服务器)。

EN

回答 1

Stack Overflow用户

发布于 2021-07-21 03:14:49

这似乎是安全问题。如果网络是专用的套接字就会打开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68170246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档