Недавно я захотел разобраться в программировании для Android. Пока я читал это руководство: https://dev.to/medaymentn/creating-a-realtime-chat-app-with-android--nodejs-and-socketio-4o55 оказалось, что для Android 9 (уровень API 28) Мне не удалось подключиться к моему локальному серверу nodejs из эмулятора устройства Android. Если я просто изменю все зависимости сборки для использования более низких уровней API (<= 27), он подключится правильно. Из того, что я прочитал об изменениях поведения в Android 9, я действительно не знаю, что могло вызвать такое. Вот код, который, я думаю, очень важен.

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();

        }
    }
}
5
Zmirlacz 13 Ноя 2018 в 19:01

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.

     <?xml version="1.0" encoding="utf-8"?>
      <manifest ...>
        <uses-permission android:name="android.permission.INTERNET" />
       <application
         android:networkSecurityConfig="@xml/network_security_config"
          ...>
      </application>
10
Ramesh Yankati 13 Ноя 2018 в 18:03

Это просто можно сделать, добавив в свой манифест следующее:

android:usesCleartextTraffic="true"

14
Bilal Ahmed 7 Май 2019 в 08:04