2016-08-13 96 views
0

我正在使用WiFi連接的Sony遠程相機上工作。我需要使用相機單擊圖片,然後將其上傳到我的另一個活動的FTP服務器。因爲比我需要斷開我的相機WiFi並連接到另一個WiFi網絡或移動數據。當我連接到另一個WiFi /移動數據,並要在FTP服務器上傳圖片時,我得到了這個錯誤。IOException無法解析主機,沒有與主機名關聯的地址

IOException異常無法解析主機沒有與主機名

相關地址當關閉程序並重新啓動,然後直接上傳照片,無需連接/斷開相機比它工作正常。 有人,請告訴我如何解決這個問題,因爲我檢查了堆棧溢出的每一個解決方案,而不是一個解決方案爲我工作。

我增加波紋管權限

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_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.INTERNET" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WRITE_SETTINGS"/> 
+0

你忘了權限? <使用權限android:name =「android.permission.INTERNET」/> <使用權限android:name =「android.permission.ACCESS_NETWORK_STATE」/>' – 2016-08-13 18:35:28

+0

我已經添加了此權限 – Ahmed

+0

此錯誤有時可能發生如果您在啓用WiFi的情況下構建/運行應用程序。請完全關閉應用程序,關閉WiFi,然後再打開。 – 2016-08-13 18:41:35

回答

0

連接到網絡不inmediate。 此外,如果所需的網絡沒有互聯網連接,在最新版本的Android中,它將不會連接(如果連接是由用戶進行的,則彈出窗口會顯示確認連接)。

我解決了使用Android API(兩個版本,一個用於API < 21,另一個用於API> = 21)的兩個問題。

試試這個代碼(我使用依賴注入AndroidAnnotations,但不要求):

public class WifiHelper extends BroadcastReceiver { 
    @RootContext 
    Context context; 

    @SystemService 
    ConnectivityManager connectivityManager; 

    @SystemService 
    WifiManager wifiManager; 

    // For API>=21 
    private WifiHelperNetworkCallback wnc; 

    // For API<21 
    private boolean isBroadcastRegistered; 

    private String desiredSSID; 

    private Runnable callback; 

    public void enableNetwork(String ssid, int networkId, Runnable callback) { 
     desiredSSID = ssid; 
     wifiManager.enableNetwork(networkId, true); 
     configureNetworkRequest(); 
    } 

    private void networkAvailable() { 
     // this method will be called when the network is available 
     callback.run(); 
    } 

    private void configureNetworkRequest() { 
     if (android.os.Build.VERSION.SDK_INT >= 21) { 
      configureNetworkRequestAPI21(); 
     } else { 
      configureNetworkRequestLegacy(); 
     } 
    } 

    @TargetApi(21) 
    private void configureNetworkRequestAPI21() { 
     NetworkRequest request = new NetworkRequest.Builder() 
       .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) 
       .build(); 
     if (wnc == null) wnc = new WifiHelperNetworkCallback(this, connectivityManager); 

     connectivityManager.requestNetwork(request, wnc); 
    } 

    private void configureNetworkRequestLegacy() { 
     unregisterReceiver(); 

     connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_WIFI, null); 
     IntentFilter intent = new IntentFilter(); 
     intent.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
     intent.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); 

     context.registerReceiver(this, intent); 
     isBroadcastRegistered = true; 
    } 

    @TargetApi(21) 
    private void disableNetworkRequest() { 
     if (android.os.Build.VERSION.SDK_INT >= 21) { 
      if (wnc != null) connectivityManager.unregisterNetworkCallback(wnc); 

      ConnectivityManager.setProcessDefaultNetwork(null); 
     } else { 
      unregisterReceiver(); 
     } 
    } 

    private void unregisterReceiver() { 
     if (isBroadcastRegistered) { 
      context.unregisterReceiver(this); 
      isBroadcastRegistered = false; 
     } 
    } 

    // API<21 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) { 
      NetworkInfo networkInfo = 
        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
      if(networkInfo.isConnected()) { 
       // Wifi is connected 

       if (desiredSSID.equals(getCurrentSSID())) { 
        // Callback and unregister 
        networkAvailable(); 
        unregisterReceiver(); 
       } 
      } 
     } 
    } 

    public String getCurrentSSID() { 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     if (wifiInfo != null && wifiInfo.getSupplicantState()== SupplicantState.COMPLETED) { 
      return ssidWithoutQuotes(wifiInfo.getSSID()); 
     } 
     else return null; 
    } 

    protected static String ssidWithoutQuotes(String ssid) { 
     if (ssid == null) return null; 
     else if (ssid.startsWith("\"") && ssid.endsWith("\"")) { 
      return ssid.substring(1, ssid.length() - 1); 
     } else { 
      return ssid; 
     } 
    } 

    protected String getDesiredSSID() { 
     return desiredSSID; 
    } 

    @TargetApi(21) 
    public static class WifiHelperNetworkCallback extends ConnectivityManager.NetworkCallback { 
     public final String LOG_TAG = WifiHelper.class.getSimpleName(); 

     private ConnectivityManager connectivityManager; 
     private WifiHelper wifiHelper; 

     public WifiHelperNetworkCallback(WifiHelper wifiHelper, ConnectivityManager connectivityManager) { 
      this.wifiHelper = wifiHelper; 
      this.connectivityManager = connectivityManager; 
     } 

     public void onAvailable(Network network) { 
      // Do something once the network is available 
      NetworkInfo info = connectivityManager.getNetworkInfo(network);; 

      Log.i(LOG_TAG, "networkcallback!! " + info.getExtraInfo()); 

      String desiredSSID = wifiHelper.getDesiredSSID(); 

      if (desiredSSID != null && desiredSSID.equals(ssidWithoutQuotes(info.getExtraInfo()))) { 
       ConnectivityManager.setProcessDefaultNetwork(network); 
       wifiHelper.networkAvailable(); 
      } 
     } 

    } 

} 

您將需要此權限:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_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.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" android:maxSdkVersion="18"/> 
+0

非常感謝。我會盡力讓你知道:) – Ahmed

+0

謝謝@sergio它現在的工作:) – Ahmed

相關問題