2012-09-27 9 views
6

Sono di fronte a qualche strano problema, Solo la mia applicazione non funziona quando passo al servizio 3G (Con proxy) ma sta funzionando benissimo in WIFI e 3G (senza proxy).Applicazione Android funzionante su Wi-Fi e 3G (senza proxy), ma non funziona su 3G (Se il proxy e la porta sono assegnati)

proxy predefinito e la porta dato dal mio Starhub (operatore di rete):

Proxy: 10.12.1.2 
Port: 80 

Per i dati, io mando richiesta SOAP al mio webserver.

Ecco il mio codice:

public class SearchThread extends Thread { 
private String mUrl; 
private SoapSerializationEnvelope mEnvelop; 
private Handler mHandler; 
private String mSoapAction; 
private KeepAliveHttpsTransportSE mTransport; 

public SearchThread(String url) { 
    this.mUrl = url; 
} 

@Override 
public void run() { 
    mEnvelop = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11); 
    mEnvelop.setOutputSoapObject(interfaceListener.getSoapObject(element)); 
    mSoapAction = interfaceListener.getSoapAction(element); 
    try { 
     TrustManagerManipulator.allowAllSSL(); 
     mTransport = new KeepAliveHttpsTransportSE(URLS.URL_MAIN, 443, mUrl, 60000); 
     mTransport.call(mSoapAction, mEnvelop); 
     if (this.isInterrupted()) { 
      Log.v(TAG,"Interrupted"); 
      return; 
     } 
     recevedSoapResponse(mEnvelop.getResponse()); 
    } catch (SocketException ex) { 
     Log.e("Error : ", "Error on soapPrimitiveData() " + ex.getMessage()); 
     ex.printStackTrace(); 
    } catch (IOException e) { 
     interfaceListener.recievedParsingResults(
       PARSER.RESULT.CONNECTION_FAILED, element, mHandler, mView); 
     e.printStackTrace(); 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
     interfaceListener.recievedParsingResults(
       PARSER.RESULT.INTERNAL_ERROR, element, mHandler, mView); 
    } 
} 
private void recevedSoapResponse(Object response) { 
    //Parsing XML here. 
} 
public class KeepAliveHttpsTransportSE extends HttpsTransportSE 
{ 
    private final String host; 
    private final int port; 
    private final String file; 
    private final int timeout; 
    private ServiceConnection serviceConnection; 

    public KeepAliveHttpsTransportSE (String host, int port, String file, int timeout) { 
     super(host, port, file, timeout); 
     this.host = host; 
     this.port = port; 
     this.file = file; 
     this.timeout = timeout; 
    } 
//@Override 
    public ServiceConnection getServiceConnection() throws IOException 
    { 
     if (serviceConnection == null) { 
      serviceConnection = new HttpsServiceConnectionSE(host, port, file, timeout); 
      serviceConnection.setRequestProperty("Connection", "keep-alive"); 
     } 
     return serviceConnection; 
    } 
} 

}

E qui è il mio codice SSL:

public class TrustManagerManipulator implements X509TrustManager { 
    private static TrustManager[] trustManagers; 
    private static final X509Certificate[] acceptedIssuers = new X509Certificate[] {}; 

public boolean isClientTrusted(X509Certificate[] chain) { 
    return true; 
} 

public boolean isServerTrusted(X509Certificate[] chain) { 
    return true; 
} 

public static void allowAllSSL() { 
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
     public boolean verify(String hostname, SSLSession session) { 
      return true; 
     } 
    }); 
    SSLContext context = null; 
    if (trustManagers == null) { 
     trustManagers = new TrustManager[] { new TrustManagerManipulator() }; 
    } 
    try { 
     context = SSLContext.getInstance("TLS"); 
     context.init(null, trustManagers, new SecureRandom()); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (KeyManagementException e) { 
     e.printStackTrace(); 
    } 
    HttpsURLConnection.setDefaultSSLSocketFactory(context 
      .getSocketFactory()); 
} 

public void checkClientTrusted(X509Certificate[] chain, String authType) 
     throws CertificateException { 
} 

public void checkServerTrusted(X509Certificate[] chain, String authType) 
     throws CertificateException { 
} 

public X509Certificate[] getAcceptedIssuers() { 
    return acceptedIssuers; 
} 
} 

eccezione:

09-27 12:21:03.295: W/System.err(8924): java.net.SocketException: Socket is closed 
09-27 12:21:03.295: W/System.err(8924):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.checkOpen(OpenSSLSocketImpl.java:262) 
09-27 12:21:03.295: W/System.err(8924):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:273) 
09-27 12:21:03.295: W/System.err(8924):  at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:257) 
09-27 12:21:03.295: W/System.err(8924):  at libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:210) 
09-27 12:21:03.295: W/System.err(8924):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:477) 
09-27 12:21:03.295: W/System.err(8924):  at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:441) 
09-27 12:21:03.295: W/System.err(8924):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
09-27 12:21:03.295: W/System.err(8924):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
09-27 12:21:03.295: W/System.err(8924):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
09-27 12:21:03.300: W/System.err(8924):  at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188) 
09-27 12:21:03.300: W/System.err(8924):  at libcore.net.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:280) 
09-27 12:21:03.300: W/System.err(8924):  at org.ksoap2.transport.HttpsServiceConnectionSE.openOutputStream(HttpsServiceConnectionSE.java:98) 
09-27 12:21:03.300: W/System.err(8924):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:157) 
09-27 12:21:03.300: W/System.err(8924):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96) 
09-27 12:21:03.300: W/System.err(8924):  at com.mobile.utils.parser.SearchThread.run(SearchThread.java:25) 

Altre Informazioni: Tutte le altre applicazioni sono in corso il 3 Rete G (con/senza impostazioni proxy) e Nella mia applicazione solo la richiesta SOAP non funziona.

Ho provato tutti i casi possibili, ma senza fortuna. Per favore forniscimi alcuni input.

Grazie in anticipo.

risposta

6

Forse è troppo tardi per te, ma spero che questo possa aiutare le persone future che arrivano qui come me, diventando pazze con lo stesso problema.

È un bug di Android. Tutto funziona correttamente con il WiFi, ma si blocca su 3G. Mi è successo su 4.1, ma nessun problema su 4.2.2.

Per risolverlo, è necessario modificare il file org.ksoap2.transport.HttpTransportSE (ho esteso uno nuovo e lo ha chiamato MyHttpTransportSE perché sto utilizzando ksoap2 barattolo di montaggio). Proprio l'override metodo pubblica chiamata void (String soapAction, busta SoapEnvelope) commentando la linea

//connection.setRequestProperty("Connection", "close"); 

Naturalmente, se si sta lavorando con SSL, è necessario estendere il proprio HttpsTransportSE da il tuo nuovo MyHttpTransportSE.

HttpTransportSE codice sorgente: https://github.com/karlmdavis/ksoap2-android/blob/master/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java?source=c

HttpsTransportSE codice sorgente: https://github.com/mosabua/ksoap2-android/blob/master/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java

Maggiori dettagli qui: https://groups.google.com/forum/#!searchin/ksoap2-android/closed/ksoap2-

+0

Questo risolto il mio problema. Dovrebbe essere accettato IMO. –

Problemi correlati