I'm working on programmatically setting a VPN connection on android devices. I was successfully able to do so for devices using OS 2.3.5 and before (I used reflection to get to the hidden classes). But with android 4.0 they got rid of the old classes and use the VPNService class instead.
I figured the best place to start would be to use the ToyVPN example android provided, but I'm facing a lot of challenges with it. In the example code they only needed to send the server address:
InetSocketAddress server = new InetSocketAddress(mServerAddress, Integer.parseInt(mServerPort));
And then created the VPN tunnel by opening the channel:
tunnel = DatagramChannel.open();
But in my case I need to send the server address, username and password. So far I haven't figured out how to do so. My best guess was to do something like this:
Authenticator.setDefault(new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user","pass".toCharArray());
}});
try {
// Create a DatagramChannel as the VPN tunnel.
tunnel = DatagramChannel.open();
But this did not work. so what I'm asking is:
- Is there a way, other than what's used in ToyVpn, to create a VPN connection programmatically?
- If not, how do I send the credentials when I want to establish a connection to the server?
Edit
I forgot to mention that I need to specify the VPN type (PPTP, L2TP, L2TP/IPSec PSK or L2TP/IPSec CRT).