Android : 앱에서 연결할 때 Wi-Fi 네트워크에서 기기를 핑할 수 없음

Lonergan6275

Socket.io 및 Android 네트워크 검색을 사용하여 앱을 만들었습니다. 서버가 시작되고 안드로이드 장치가 서비스를 해결하면 소켓을 만들려고 시도하지만 첫 번째 시도에서는 작동하지 않습니다. 앱을 종료하고 다시 시작하면 제대로 작동합니다. 서버가 액세스 포인트에서 실행 중입니다. 네트워크 연결은 정상이지만 서버에 ping을 할 수 없습니다. 그러나 이전에 언급했듯이 앱을 종료하고 다시 실행하면 정상적으로 작동합니다.


Eidt 2

추가 디버깅 후 내 앱이 Wi-Fi 연결을 설정할 때마다 충돌 범위를 좁혔습니다. ssid 및 암호는 qrcode에서 가져오고 앱은 Wi-Fi 연결을 설정합니다.


qr 코드 데이터 읽기

        @Override
        public void receiveDetections(Detector.Detections<Barcode> detections) {
            final SparseArray<Barcode> barCodes = detections.getDetectedItems();

            if (!receivedDetection) {
                if (barCodes.size() != 0) {

                    Log.i(TAG, "received a Barcode");
                    receivedDetection = true;

                    Gson g = new Gson();
                    try {
                        barCodeData = g.fromJson(barCodes.valueAt(0).rawValue, AccessPointCredentials.class);
                    } catch (Exception e) {
                        barCodeData = new AccessPointCredentials();
                        barCodeData.setSsid(barCodes.valueAt(0).rawValue);
                        barCodeData.setPass(null);
                        e.printStackTrace();
                    }

                    connectToWifi(barCodeData);

                }
            }
        }

connectToWifi ()

private void connectToWifi(final AccessPointCredentials credentials) {

    new AsyncTask<Object, Object, Object>() {
        @Override
        protected Object doInBackground(Object... objects) {
            WifiManager wifiManager = (WifiManager) mActivity.getSystemService(Context.WIFI_SERVICE);

            wifiManager.setWifiEnabled(true);
            int netId;

            try {
                Thread.sleep(100);
            } catch (InterruptedException ie) {
                ie.printStackTrace();
            }

            for (WifiConfiguration tmp : wifiManager.getConfiguredNetworks()) {
                if (tmp.SSID.equals("\"" + credentials.getSsid() + "\"")) {

                    netId = tmp.networkId;
                    boolean enabled = wifiManager.enableNetwork(netId, true);

                    Log.i(TAG, "doInBackground: Enabled? " + enabled);

                    mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mActivity.onBackPressed();
                        }
                    });
                    return null;
                }
            }


            final String[] apSettings = {credentials.getSsid(), credentials.getPass()};
            final WifiConnect WifiTask = new WifiConnect(mActivity);
            mActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    WifiTask.execute(apSettings);
                }
            });
            this.cancel(true);
            return null;
        }

        @TargetApi(23)
        @Override
        protected void onPostExecute(Object aVoid) {
            super.onPostExecute(aVoid);

            if (Build.VERSION.RELEASE.equalsIgnoreCase("6.0")) {
                if (!Settings.System.canWrite(mActivity)) {
                    Intent goToSettings = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
                    goToSettings.setData(Uri.parse("package:" + mActivity.getPackageName()));
                    mActivity.startActivity(goToSettings);
                } else {
                    bindToNetwork();
                }


            } else {
                bindToNetwork();
            }
        }
    }.execute();
}

bindToNetwork ()

private void bindToNetwork() {
    final ConnectivityManager connectivityManager = (ConnectivityManager) mActivity.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder builder;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        builder = new NetworkRequest.Builder();
        //set the transport type do WIFI
        builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
        connectivityManager.requestNetwork(builder.build(), new ConnectivityManager.NetworkCallback() {
            @Override
            public void onAvailable(Network network) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    connectivityManager.bindProcessToNetwork(network);

                } else {
                    //This method was deprecated in API level 23
                    ConnectivityManager.setProcessDefaultNetwork(network);
                }
                try {
                    //do a callback or something else to alert your code that it's ok to send the message through socket now
                } catch (Exception e) {
                    e.printStackTrace();
                }
                connectivityManager.unregisterNetworkCallback(this);
            }
        });
    }
}

편집하다

부울 메소드 isServerReachable ()은 예외를 발생시킵니다.

java.net.SocketException: socket failed: ENONET (Machine is not on the network)


public boolean isServerReachable(){

        boolean isReachable;
        try {
            isReachable = InetAddress.getByName(mService.getHost().getHostAddress()).isReachable(5000);

        } catch (Exception e) {
            e.printStackTrace();
            isReachable = false;
        }
        Log.i(TAG, "onServiceResolved: Server reachable? " + String.valueOf(isReachable));

        Log.i(TAG, "onServiceResolved: Is Network online? " + String.valueOf(isNetworkOnline()));

    if (isReachable){
        return true;
    } else {
        return false;
    }
}
Lonergan6275

나는 그것을 해결했지만 그것이 최선의 해결책이라고 확신하지 않으며 그것이 추가되면 더 나은 해결책을 받아 들일 것입니다.

이후 connectToWifi()Thread.sleep(500);호출 을 추가 하여 메서드 에서 for 루프를 수정했으며 wifiManager.enableNetwork()이제 작동 중입니다.

for (WifiConfiguration tmp : wifiManager.getConfiguredNetworks()) {
    if (tmp.SSID.equals("\"" + credentials.getSsid() + "\"")) {
        netId = tmp.networkId;
        boolean enabled = wifiManager.enableNetwork(netId, true);

        try {
            Thread.sleep(500);
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }

        mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mActivity.onBackPressed();
            }
        });
        return null;
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Lubuntu / Ubuntu-Wi-Fi 네트워크에 연결할 수 없음

분류에서Dev

Lubuntu 14.04에서 Wi-Fi 네트워크에 연결할 수 없습니다.

분류에서Dev

Wi-Fi를 통해 동일한 네트워크에 연결된 장치에서 localhost에 액세스 할 수 없음

분류에서Dev

숨겨진 Wi-Fi 네트워크에 연결할 수 없습니다.

분류에서Dev

새 Wi-Fi 네트워크에 연결할 수 없습니다.

분류에서Dev

특정 Wi-Fi 네트워크에 연결할 수 없습니다.

분류에서Dev

Windows 10에서 학교 Wi-Fi 네트워크의 인터넷에 연결할 수 없습니다.

분류에서Dev

네트워크에 연결할 수 없음 : Wi-Fi에 inet 주소가 없습니다.

분류에서Dev

Android 10 Wi-Fi 연결이 게이트웨이에 도달 할 수 없음

분류에서Dev

Android 기기를 Wi-Fi없이 소니 카메라에 연결할 수 있나요?

분류에서Dev

공용 (보안되지 않은) Wi-Fi 네트워크에 연결할 수 없음 (Ubuntu 16.04)

분류에서Dev

Wi-Fi가 Ubuntu 13.10에 연결할 수 없음

분류에서Dev

Wi-Fi가 Ubuntu 13.10에 연결할 수 없음

분류에서Dev

Ubuntu 13.10 : Wi-Fi에 연결할 수 없음

분류에서Dev

Windows 8/10 Wi-Fi에 연결할 수 없음

분류에서Dev

Intel Link 5100으로 Wi-Fi에 연결할 수 없음

분류에서Dev

새 네트워크 어댑터에서 Wi-Fi를 사용할 수 없습니다.

분류에서Dev

Wi-Fi 네트워크에서 Wireshark로 나가는 트래픽을 캡처 할 수 없음

분류에서Dev

Wi-Fi는 네트워크를 사용할 수있을 때까지 로그인 화면에서 기다리는 경우에만 작동

분류에서Dev

우분투 16.04 Realtek Semiconductor RTL8723DE 장치 문제에서 Wi-Fi 네트워크를 감지 할 수 없습니다. Wi-Fi 활성화에 체크 표시가 있지만 Wi-Fi 네트워크는 없습니다.

분류에서Dev

내 PC가 학교의 Wi-Fi 네트워크를 찾을 수 있지만 연결할 수 없음

분류에서Dev

라우터에 가까울 때 Wi-Fi에 연결할 수 없습니다.

분류에서Dev

13.10에서 Wi-Fi에 연결할 수 없습니다.

분류에서Dev

Ubuntu 17.04에서 Wi-Fi에 연결할 수 없습니다.

분류에서Dev

16.04 LTS에서 Wi-Fi에 연결할 수 없습니다.

분류에서Dev

Debian 10에서 Wi-Fi에 연결할 수 없습니다.

분류에서Dev

내 우분투 12.04에서 Wi-Fi 연결 끊기를 클릭 할 수 없습니다.

분류에서Dev

Wi-Fi에 연결할 수 없지만 Android 핫스팟에 연결할 수 있습니다.

분류에서Dev

핑 PC를 제외하고는 Wi-Fi 인터페이스에 연결할 수 없습니다.

Related 관련 기사

  1. 1

    Lubuntu / Ubuntu-Wi-Fi 네트워크에 연결할 수 없음

  2. 2

    Lubuntu 14.04에서 Wi-Fi 네트워크에 연결할 수 없습니다.

  3. 3

    Wi-Fi를 통해 동일한 네트워크에 연결된 장치에서 localhost에 액세스 할 수 없음

  4. 4

    숨겨진 Wi-Fi 네트워크에 연결할 수 없습니다.

  5. 5

    새 Wi-Fi 네트워크에 연결할 수 없습니다.

  6. 6

    특정 Wi-Fi 네트워크에 연결할 수 없습니다.

  7. 7

    Windows 10에서 학교 Wi-Fi 네트워크의 인터넷에 연결할 수 없습니다.

  8. 8

    네트워크에 연결할 수 없음 : Wi-Fi에 inet 주소가 없습니다.

  9. 9

    Android 10 Wi-Fi 연결이 게이트웨이에 도달 할 수 없음

  10. 10

    Android 기기를 Wi-Fi없이 소니 카메라에 연결할 수 있나요?

  11. 11

    공용 (보안되지 않은) Wi-Fi 네트워크에 연결할 수 없음 (Ubuntu 16.04)

  12. 12

    Wi-Fi가 Ubuntu 13.10에 연결할 수 없음

  13. 13

    Wi-Fi가 Ubuntu 13.10에 연결할 수 없음

  14. 14

    Ubuntu 13.10 : Wi-Fi에 연결할 수 없음

  15. 15

    Windows 8/10 Wi-Fi에 연결할 수 없음

  16. 16

    Intel Link 5100으로 Wi-Fi에 연결할 수 없음

  17. 17

    새 네트워크 어댑터에서 Wi-Fi를 사용할 수 없습니다.

  18. 18

    Wi-Fi 네트워크에서 Wireshark로 나가는 트래픽을 캡처 할 수 없음

  19. 19

    Wi-Fi는 네트워크를 사용할 수있을 때까지 로그인 화면에서 기다리는 경우에만 작동

  20. 20

    우분투 16.04 Realtek Semiconductor RTL8723DE 장치 문제에서 Wi-Fi 네트워크를 감지 할 수 없습니다. Wi-Fi 활성화에 체크 표시가 있지만 Wi-Fi 네트워크는 없습니다.

  21. 21

    내 PC가 학교의 Wi-Fi 네트워크를 찾을 수 있지만 연결할 수 없음

  22. 22

    라우터에 가까울 때 Wi-Fi에 연결할 수 없습니다.

  23. 23

    13.10에서 Wi-Fi에 연결할 수 없습니다.

  24. 24

    Ubuntu 17.04에서 Wi-Fi에 연결할 수 없습니다.

  25. 25

    16.04 LTS에서 Wi-Fi에 연결할 수 없습니다.

  26. 26

    Debian 10에서 Wi-Fi에 연결할 수 없습니다.

  27. 27

    내 우분투 12.04에서 Wi-Fi 연결 끊기를 클릭 할 수 없습니다.

  28. 28

    Wi-Fi에 연결할 수 없지만 Android 핫스팟에 연결할 수 있습니다.

  29. 29

    핑 PC를 제외하고는 Wi-Fi 인터페이스에 연결할 수 없습니다.

뜨겁다태그

보관