2013-09-28 363 views
12

Tôi gặp lỗi lạ trên ứng dụng Android của mình. Tôi đang thử nghiệm với một máy chủ địa phương sử dụng Xampp. Ứng dụng là truy xuất các bản ghi từ Cơ sở dữ liệu và lưu trữ chúng trong điện thoại.Mạng Android không thể truy cập được - ENETUNREACH

Điều tôi đã thử nghiệm ứng dụng trong Motorola XT550 với Android 2.3.6 và trong Sony Xperia S của tôi với Android 4.0.4 và ứng dụng hoạt động tốt. Nhưng khi tôi thử nghiệm nó với một Samsung Fame với Android 4.1.2 (điện thoại của khách hàng của tôi) nó không hoạt động.

Đây là LogCat:

02-22 04:48:33.001 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183) 
02-22 04:48:33.001 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
02-22 04:48:33.001 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at com.sistel.manantiales.SyncActivity$DatabaseSync.updateDatabase(SyncActivity.java:198) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at com.sistel.manantiales.SyncActivity$DatabaseSync.doInBackground(SyncActivity.java:165) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at com.sistel.manantiales.SyncActivity$DatabaseSync.doInBackground(SyncActivity.java:147) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:287) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
02-22 04:48:33.011 3961-3976/com.sistel.manantiales W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
02-22 04:48:33.021 3961-3976/com.sistel.manantiales W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
02-22 04:48:33.021 3961-3976/com.sistel.manantiales W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
02-22 04:48:33.021 3961-3976/com.sistel.manantiales W/System.err﹕ at java.lang.Thread.run(Thread.java:856) 
02-22 04:48:33.021 3961-3976/com.sistel.manantiales W/System.err﹕ Caused by: java.net.ConnectException: failed to connect to /10.0.0.7 (port 80) after 15000ms: connect failed: ENETUNREACH (Network is unreachable) 
02-22 04:48:33.021 3961-3976/com.sistel.manantiales W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:114) 
02-22 04:48:33.031 3961-3976/com.sistel.manantiales W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
02-22 04:48:33.031 3961-3976/com.sistel.manantiales W/System.err﹕ at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
02-22 04:48:33.031 3961-3976/com.sistel.manantiales W/System.err﹕ at java.net.Socket.connect(Socket.java:842) 
02-22 04:48:33.031 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
02-22 04:48:33.031 3961-3976/com.sistel.manantiales W/System.err﹕ at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 
02-22 04:48:33.031 3961-3976/com.sistel.manantiales W/System.err﹕ ... 15 more 
02-22 04:48:33.041 3961-3976/com.sistel.manantiales W/System.err﹕ Caused by: libcore.io.ErrnoException: connect failed: ENETUNREACH (Network is unreachable) 
02-22 04:48:33.081 1216-1467/? V/AudioFlinger﹕ presentationComplete() session 35 complete: framesWritten 940032 
02-22 04:48:33.081 1216-1467/? V/AudioFlinger﹕ TrackBase::reset 
02-22 04:48:33.091 3961-3976/com.sistel.manantiales W/System.err﹕ at libcore.io.Posix.connect(Native Method) 
02-22 04:48:33.091 3961-3964/com.sistel.manantiales D/dalvikvm﹕ GC_CONCURRENT freed 197K, 13% free 7645K/8775K, paused 16ms+16ms, total 54ms 
02-22 04:48:33.091 3961-3976/com.sistel.manantiales W/System.err﹕ at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
02-22 04:48:33.091 3961-3976/com.sistel.manantiales W/System.err﹕ at libcore.io.IoBridge.connectErrno(IoBridge.java:144) 
02-22 04:48:33.101 3961-3976/com.sistel.manantiales W/System.err﹕ at libcore.io.IoBridge.connect(IoBridge.java:112) 
02-22 04:48:33.101 3961-3976/com.sistel.manantiales W/System.err﹕ ... 20 more 
02-22 04:48:33.101 1577-1800/? D/PowerManagerService﹕ acquireDVFSLockLocked : type : DVFS_MIN_LIMIT frequency : 999999 uid : 1000 pid : 1577 tag : ActivityManager 
02-22 04:48:33.101 1577-1800/? W/ActivityManager﹕ mDVFSLock.acquire() 
02-22 04:48:33.141 1577-1800/? D/BatteryStatsImpl﹕ ++++++xy WakeLock start : pid=1577, name=, type=0, tid=1800, pid=1577, pName=null 
02-22 04:48:33.161 1577-1588/? D/WindowManager﹕ PhoneWindowManager: focusChangedLw 
02-22 04:48:33.161 1577-1588/? D/WindowManager﹕ updateReadingMode 
02-22 04:48:33.161 1577-1588/? D/KeyguardViewMediator﹕ setHidden false 
02-22 04:48:33.161 1577-1588/? D/WindowManager﹕ mInputFocus is not null. 
02-22 04:48:33.161 1577-1588/? D/WindowManager﹕ mInputFocus is not null. 
02-22 04:48:33.161 1577-1588/? D/WindowManager﹕ mInputFocus is not null. 
02-22 04:48:33.191 3961-3961/com.sistel.manantiales D/AbsListView﹕ Get MotionRecognitionManager 
02-22 04:48:33.211 3961-3976/com.sistel.manantiales W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x411ba2a0) 
02-22 04:48:33.211 1577-1810/? D/WindowManager﹕ mInputFocus is not null. 
02-22 04:48:33.211 3961-3976/com.sistel.manantiales E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
     java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 
     Caused by: java.lang.IllegalArgumentException: HTTP entity may not be null 
     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:110) 
     at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146) 
     at com.sistel.manantiales.SyncActivity$DatabaseSync.updateDatabase(SyncActivity.java:217) 
     at com.sistel.manantiales.SyncActivity$DatabaseSync.doInBackground(SyncActivity.java:165) 
     at com.sistel.manantiales.SyncActivity$DatabaseSync.doInBackground(SyncActivity.java:147) 
     at android.os.AsyncTask$2.call(AsyncTask.java:287) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 

Và đây là mã của tôi:

public class DatabaseSync extends AsyncTask<String, Void, Boolean> { 

     @Override 
     protected Boolean doInBackground(String... url) { 

      try { 
       clientDataSource.open(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

      try { 
       movementDataSource.open(); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 

      clientDataSource.deleteAllClients(); 
      updateDatabase(url[0]); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Boolean bool) { 
      super.onPostExecute(bool); 
     } 

     public void updateDatabase(String url) { 

       ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("Operation", "Download")); 
       nameValuePairs.add(new BasicNameValuePair("Value", "Download")); 

       HttpParams httpParams = new BasicHttpParams(); 

       HttpConnectionParams.setConnectionTimeout(httpParams, 15000); 
       HttpConnectionParams.setSoTimeout(httpParams, 15000); 

      HttpClient httpClient = new DefaultHttpClient(httpParams); 
      HttpPost httpPost = new HttpPost(url); 

      try { 
       httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 

      HttpResponse httpResponse = null; 

      try { 
       httpResponse = httpClient.execute(httpPost); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      HttpEntity httpEntity = null; 

      try { 
       httpEntity = httpResponse.getEntity(); 
      }catch (NullPointerException e) { 

       Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
       startActivity(intent); 

      } 


      String result = "empty"; 
      try { 
       result = EntityUtils.toString(httpEntity); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      JSONObject jsonObject = null; 
      try { 
       jsonObject = new JSONObject(result); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
      JSONArray jsonClients = null; 

      try { 
       jsonClients = jsonObject.getJSONArray("clients"); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      long id = 0; 
      String name; 
      String address; 
      String locality; 
      long bonus = 0; 
      double price = 0.0; 
      double prev_balance = 0.0; 
      double balance = 0.0; 
      long prev_bottles = 0; 
      long bottles = 0; 
      String update_date; 
      String sync_date; 

      for(int i = 0; i < jsonClients.length(); i++) { 
       JSONObject json = null; 
       try { 
        json = jsonClients.getJSONObject(i); 

        String s_id = new String(Base64.decode(json.get("id").toString(),Base64.DEFAULT)); 
        name = new String(Base64.decode(json.get("name").toString(),Base64.DEFAULT)); 
        address = new String(Base64.decode(json.get("address").toString(), Base64.DEFAULT)); 
        locality = new String(Base64.decode(json.get("locality").toString(), Base64.DEFAULT)); 
        String s_bonus = new String(Base64.decode(json.get("bonus").toString(), Base64.DEFAULT)); 
        String s_price = new String(Base64.decode(json.get("price").toString(), Base64.DEFAULT)); 
        String s_prev_balance = new String(Base64.decode(json.get("prev_balance").toString(), Base64.DEFAULT)); 
        String s_balance = new String(Base64.decode(json.get("balance").toString(), Base64.DEFAULT)); 
        String s_prev_bottles = new String(Base64.decode(json.get("prev_bottles").toString(), Base64.DEFAULT)); 
        String s_bottles = new String(Base64.decode(json.get("bottles").toString(), Base64.DEFAULT)); 
        update_date = new String(Base64.decode(json.get("update_date").toString(), Base64.DEFAULT)); 
        sync_date = new String(Base64.decode(json.get("sync_date").toString(), Base64.DEFAULT)); 

        id = Long.parseLong(s_id); 
        bonus = Long.parseLong(s_bonus); 
        price = Double.parseDouble(s_price); 
        prev_balance = Double.parseDouble(s_prev_balance); 
        balance = Double.parseDouble(s_balance); 
        prev_bottles = Long.parseLong(s_prev_bottles); 
        bottles = Long.parseLong(s_bottles); 

        Client client = new Client(id, name, address, locality, bonus, price, 
          prev_balance, balance, prev_bottles, bottles, update_date, sync_date); 

        clientDataSource.insertClient(client); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

      Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
      startActivity(intent); 

     } 

    } 
+0

Nó nói Mạng không thể truy cập được, nhưng thử nghiệm với 3 điện thoại, và nó không hoạt động trên Samsung FAME (4.1.2) –

Trả lời

40

tôi đã tìm ra vấn đề là gì! Samsung Fame không được kết nối với Wi-Fi. Nó không có internet.

+2

nó xảy ra :) (với tôi ngay bây giờ;)) –

+2

Đôi khi chúng ta quá bận rộn để nhớ .... cảm ơn cho nhắc nhở :-P – Umair

+1

Tôi đã làm điều tương tự ... router của tôi đã được thiết lập lại cứng một tháng trước và tôi không bao giờ reauthenticated máy tính bảng của tôi ... – Shadoninja

8

Bạn cũng có thể thêm kiểm tra kết nối internet trước khi thực hiện bất kỳ yêu cầu nào để người dùng sẽ biết Internet không có ở đó.

Sử dụng mã bên dưới và nếu mã đó trả về false hiển thị Toast/Alert.

private boolean isNetworkAvailable() { 
ConnectivityManager connectivityManager 
     = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 
+4

Trong trường hợp bất kỳ ai gặp sự cố với điều này, lưu ý rằng bạn cần phải thêm 'android.permission.ACCESS_NETWORK_STATE' làm quyền trong tệp kê khai – Chris

+2

lưu ý rằng trường hợp này sẽ có ** KHÔNG có hiệu lực ** nếu không có WI-FI nhưng dữ liệu di động (3G, 4G, EDGE) được kích hoạt và không nằm trong phạm vi, hoặc giới hạn lưu lượng vượt quá !!! Giải pháp là phát triển kiểm tra này thêm một loại [ping] (http://stackoverflow.com/a/22256277/3595288) – Choletski

1

Có trường hợp khi ứng dụng của tôi đang kết nối rồi tắt wifi> lỗi ứng dụng và không thể đi vào trong lệnh bắt Ngoại lệ.