Socket.io 无法在 Android 9(API 级别 28)上运行

Posted

技术标签:

【中文标题】Socket.io 无法在 Android 9(API 级别 28)上运行【英文标题】:Socket.io not working on Android 9 (API level 28) 【发布时间】:2019-04-16 12:23:33 【问题描述】:

最近我想掌握 android 编程。当我完成本教程时:https://dev.to/medaymentn/creating-a-realtime-chat-app-with-android--nodejs-and-socketio-4o55 事实证明,对于 Android 9(API 级别 28),我无法从 android 设备模拟器连接到我的本地 nodejs 服务器。如果我只是更改所有构建依赖项以使用较低的 API 级别(

public class ChatBoxActivity extends AppCompatActivity 

    //declare socket object
    private Socket socket;

    public String Nickname;

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

        // get the nickame of the user
        Nickname = (String) getIntent().getExtras().getString(MainActivity.NICKNAME);
        //connect you socket client to the server
        try 
            socket = IO.socket("http://192.168.2.106:3000");
            socket.connect();
            socket.emit("join", Nickname);
         catch (URISyntaxException e) 
            e.printStackTrace();

        
    

【问题讨论】:

【参考方案1】:

只需在清单中添加以下内容即可:

android:usesCleartextTraffic="true"

【讨论】:

就是这样!谢谢! 没有什么比这些情况更能阻止开发了。 真的救了我的命【参考方案2】:

从 Android 9.0(API 级别 28)开始,默认情况下禁用明文支持。您可能需要为您的域 url 启用。 更多信息参考这个 https://developer.android.com/training/articles/security-config#CleartextTrafficPermitted

创建文件 res/xml/network_security_config.xml -

 <?xml version="1.0" encoding="utf-8"?>
  <network-security-config>
    <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">Your URL</domain>
  </domain-config>
 </network-security-config>

你需要在 android Manifest 中给出这个文件的参考

     <?xml version="1.0" encoding="utf-8"?>
      <manifest ...>
        <uses-permission android:name="android.permission.INTERNET" />
       <application
         android:networkSecurityConfig="@xml/network_security_config"
          ...>
      </application>

【讨论】:

【参考方案3】:

转到 AndroidManifest.xml 在应用程序标签中添加这个

android:usesCleartextTraffic="true"

喜欢这个

<application
        android:usesCleartextTraffic="true"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        tools:targetApi="m">

【讨论】:

以上是关于Socket.io 无法在 Android 9(API 级别 28)上运行的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android 客户端和 Node.js socket.io 服务器之间进行通信

Native Socket.IO and Android

Android 和 Socket.io ,发送和接收数据

android studio连接io.socket:sokect.io-client服务器的条件

Android 客户端未从 node.js 服务器接收到 socket.io 消息

无法从android okhttp3连接到节点websocket