2016-08-13 94 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

相关问题