Я экспериментирую с VpnService, который был добавлен в Android в SDK 4.0. Я дошел до запуска VpnService, однако я не могу создать виртуальный интерфейс. Мой код вызывает исключение IllegalStateException, и я не могу понять, почему. Код находится внутри Thread, который является внутренним классом моего класса VPNService.
Мой урезанный пример выглядит так:
ParcelFileDescriptor pfd = null;
VpnService.Builder b = new VpnService.Builder();
try{
b.addAddress("10.0.6.2", 24);
b.setMtu(1460);
b.setSession("TunnelTest");
} catch(IllegalArgumentException e){
Log.v("Service", "Address is invalid!");
stopSelf();
return;
}
try{
pfd = b.establish();
} catch (IllegalArgumentException e){
Log.v("Service", "Interface was provided with an illegal argument");
} catch (IllegalStateException e){
e.printStackTrace();
Log.v("Service", "Illegal state");
} catch (SecurityException e){
Log.v("Service", "Security exception thrown");
Я пытаюсь создать виртуальный интерфейс с IP 10.0.6.2, принадлежащий подсети 10.6.0.0/24. Исключение выдается вызовом b.establish ().
Это полная трассировка стека:
11-30 17:51:10.863: W/System.err(2741): java.lang.IllegalStateException: Cannot create interface
11-30 17:51:10.875: W/System.err(2741): at android.os.Parcel.readException(Parcel.java:1335)
11-30 17:51:10.875: W/System.err(2741): at android.os.Parcel.readException(Parcel.java:1281)
11-30 17:51:10.875: W/System.err(2741): at android.net.IConnectivityManager$Stub$Proxy.establishVpn(IConnectivityManager.java:1321)
11-30 17:51:10.875: W/System.err(2741): at android.net.VpnService$Builder.establish(VpnService.java:472)
11-30 17:51:10.875: W/System.err(2741): at no.simtel.TestVpnService$TestVpn.run(TestVpnService.java:37)