[Android] HTTPS verbinding gebruiken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Stay1ed
  • Registratie: Oktober 2008
  • Laatst online: 20-08 15:56
Hallo mede-tweakers,

Als hobby project probeer ik een Android applicatie te ontwikkelen. Het is niet mijn bedoeling dat deze meteen in de Android Market verschijnt, maar ik vond het leuk om wat meer praktijkervaring op te doen met Java. Ik heb gekozen voor een redelijk simpele applicatie die URL's kan synchroniseren met een desktop mbv Firefox Sync. De API van Firefox Sync vereist een HTTPS verbinding met de server, en dat krijg ik niet voor elkaar. Ik heb redelijk wat algoritmes geprobeerd:

In deze code zijn HTTPS_PORT, URL en HOSTNAME (van de server) allen constanten.

Gebruik maken van DefaultHttpClient en SSLSocket:
Java:
1
2
3
4
5
6
7
8
9
10
DefaultHttpClientConnection client = new DefaultHttpClient();

SSLSocketFactory sslFactory = SSLSocketFactory.getSocketFactory();
sslFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Socket sslSocket = sslFactory.connectSocket(null, HOSTNAME, HTTPS_PORT, null, 0, new BasicHttpParams());

client.bind(sslSocket, new BasicHttpParams());
HttpGet method = new HttpGet(URL);
client.sendRequestHeader(method);
//antwoord hier afhandelen

Dit levert een java.net.SocketException: Permission denied, op regel 5.

Gebruik maken van DefaultHttpClient en SchemeRegistry:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
SSLSocketFactory sslFactory = SSLSocketFactory.getSocketFactory();
sslFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

Scheme https = new Scheme("https", (SocketFactory) sslFactory, HTTPS_PORT);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(https);

connectionMann = new SingleClientConnManager(null, schemeRegistry);
DefaultHttpClient  client = new DefaultHttpClient(connectionMann, null);

HttpGet method = new HttpGet(URL);
HttpResponse response = client.execute(method);
//antwoord hier afhandelen

Dit levert een java.net.UnknownHostException (regel 12) op met als toevoeging de host die ik probeer te bereiken.

Direct gebruik maken van Socket:
Java:
1
2
3
4
5
6
7
8
9
10
SSLSocketFactory sslFactory = SSLSocketFactory.getSocketFactory();
sslFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Socket sslSocket = sslFactory.connectSocket(null, HOSTNAME, HTTPS_PORT, null, 0, new BasicHttpParams());
    
InputStream in = sslSocket.getInputStream();
OutputStream out = sslSocket.getOutputStream();
            
out.write(url.getBytes());
out.flush();
//in gebruiken om antwoord af te handelen

Dit levert een java.net.SocketException: Permission denied, op regel 3.

Ik kon uit de documentatie van Android niet echt wijsworden wat ik nou met HttpParams aan moet. Soms mag een HttpParams als parameter niet null zijn, dus dan heb ik maar gewoon een nieuwe BasicHttpParams meegegeven, iets anders kon ik niet verzinnen. Ik weet ook niks van het verschil tussen een Client en een Connection, die in principe de zelfde functie hebben als ik kijk naar de methodes die in documentatie staan.

Ik heb geprobeerd hier iets over op te zoeken met Google, maar erg veel succes had ik niet. Misschien dat iemand van jullie het beter kan? ;) De enige goede documentatie die ik kon vinden over dit onderwerp staat hier.

Zelf bezit ik nog geen Android telefoon, ik doe daarom al mijn tests op een emulator, al denk ik niet dat dat van invloed is op de resultaten.

Groeten, Thomas.

Acties:
  • 0 Henk 'm!

  • noNamer
  • Registratie: Juli 2000
  • Niet online
Zonder verder naar je code gekeken te hebben, maar heb je wel in je Manifest opgegeven dat je de permissies hiervoor wilt hebben?

http://developer.android.....permission.html#INTERNET

Acties:
  • 0 Henk 'm!

  • Stay1ed
  • Registratie: Oktober 2008
  • Laatst online: 20-08 15:56
Bedankt, dat heeft in ieder geval al iets opgelost :). Nu zijn er weer andere bugs die geplet moeten worden voordat het werkt, de gebruikelijke gang van zaken ;).

Even voor anderen met dit probleem: in de AndroidManifest.xml moet komen te staan
XML:
1
<uses-permission android:name="android.permission.INTERNET" />


edit: Ook de laatste bugs zijn verholpen, ik kan nu met mijn applicatie checken of een userid in gebruik is.

[ Voor 14% gewijzigd door Stay1ed op 23-10-2010 19:19 ]