我想创建应用程序,它重新路由数据包。我使用vpnservice(因为不需要根电话),使用toyVpn和这个代码http://www.theGeekstuff.com/2014/06/android-vpn-service/但是问题是在这行DatagramChannel tunnel=DatagramChannel.open();此行抛出异常。这是我的密码
public class MyVpnService extends VpnService { public static String CONNECTION = "StartService"; public static String DISCONNECTION = "StopService"; public static boolean work = false; private Thread mThread; private ParcelFileDescriptor mInterface; Builder builder = new Builder(); // Services interface @Override public int onStartCommand(Intent intent, int flags, int startId) { // Start a new session by creating a new thread. if (intent != null && DISCONNECTION.equals(intent.getAction())) { work = false; stopForeground(true); mThread.interrupt(); stopSelf(); return START_NOT_STICKY; } work = true; mThread = new Thread(new Runnable() { @Override public void run() { try { Log.d("VPNservice", "0"); mInterface = builder.setSession("MyVPNService") .addAddress("192.168.1.3", 24) .addDnsServer("8.8.8.8") .addRoute("0.0.0.0", 0).establish(); FileInputStream in = new FileInputStream( mInterface.getFileDescriptor()); FileOutputStream out = new FileOutputStream( mInterface.getFileDescriptor()); Log.d("VPNservice", "1 " + (mInterface != null)); DatagramChannel tunnel = DatagramChannel.open(); Log.d("VPNservice", "2 " + (tunnel != null)); Log.d("VPNservice", "3 " + tunnel.connect(new InetSocketAddress("127.0.0.1", 8087))); //tunnel.connect(new InetSocketAddress("127.0.0.1", 8087)); tunnel.configureBlocking(false); protect(tunnel.socket()); //e. Use a loop to pass packets. ByteBuffer packet = ByteBuffer.allocate(Short.MAX_VALUE); Log.d("VPNservice", "4"); while (!Thread.interrupted()) { Log.d("VPNservice", "5"); int length = in.read(packet.array()); if (length > 0) { packet.limit(length); tunnel.write(packet); // There might be more outgoing packets. Log.d("VPNservice", "6"); } Log.d("VPNservice", "7"); length = tunnel.read(packet); Log.d("VPNservice", "8"); if (length > 0) { if (packet.get(0) != 0) { out.write(packet.array(), 0, length); Log.d("VPNservice", "9"); } packet.clear(); Log.d("VPNservice", "10"); } Thread.sleep(100); Log.d("VPNservice", "11"); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (mInterface != null) { mInterface.close(); mInterface = null; } } catch (Exception e) { } } } }, "MyVpnRunnable"); //start the service mThread.start(); return START_STICKY; } @Override public void onDestroy() { // TODO Auto-generated method stub if (mThread != null) { mThread.interrupt(); } super.onDestroy(); } }
这是日志:
null
07-02 15:13:09.271 8853-8853/app.my.myvpnservice D/ActivityThread: SVC-Calling onStartCommand: app.my.myvpnservice.MyVpnService@424f59f0, flags=0, startId=1
07-02 15:13:09.272 8853-8853/app.my.myvpnservice D/dalvikvm: create interp thread : stack size=128KB
07-02 15:13:09.272 8853-8853/app.my.myvpnservice D/dalvikvm: create new thread
07-02 15:13:09.274 8853-8853/app.my.myvpnservice D/dalvikvm: new thread created
07-02 15:13:09.274 8853-8853/app.my.myvpnservice D/dalvikvm: update thread list
07-02 15:13:09.274 8853-9304/app.my.myvpnservice D/dalvikvm: threadid=11: interp stack at 0x7d83d000
07-02 15:13:09.274 8853-9304/app.my.myvpnservice D/dalvikvm: threadid=11: created from interp
07-02 15:13:09.274 8853-8853/app.my.myvpnservice D/dalvikvm: start new thread
07-02 15:13:09.274 8853-9304/app.my.myvpnservice D/dalvikvm: threadid=11: notify debugger
07-02 15:13:09.274 8853-9304/app.my.myvpnservice D/dalvikvm: threadid=11 (MyVpnRunnable): calling run()
07-02 15:13:09.275 8853-8853/app.my.myvpnservice D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=android.os.BinderProxy@424ef338 startId=1 args=Intent { act=StartService cmp=app.my.myvpnservice/.MyVpnService }}
07-02 15:13:09.275 8853-9304/app.my.myvpnservice D/VPNservice: 0
07-02 15:13:09.306 8853-8853/app.my.myvpnservice D/ActivityThread: SVC-BIND_SERVICE handled : 0 / BindServiceData{token=android.os.BinderProxy@424ef338 intent=Intent { act=android.net.VpnService cmp=app.my.myvpnservice/.MyVpnService }}
07-02 15:13:09.447 8853-9304/app.my.myvpnservice D/VPNservice: 1 true
07-02 15:13:09.471 8853-9304/app.my.myvpnservice W/System.err: java.net.SocketException: socket failed: EACCES (Permission denied)
07-02 15:13:09.481 8853-9304/app.my.myvpnservice W/System.err: at libcore.io.IoBridge.socket(IoBridge.java:622)
07-02 15:13:09.481 8853-9304/app.my.myvpnservice W/System.err: at java.nio.DatagramChannelImpl.<init>(DatagramChannelImpl.java:75)
07-02 15:13:09.481 8853-9304/app.my.myvpnservice W/System.err: at java.nio.SelectorProviderImpl.openDatagramChannel(SelectorProviderImpl.java:33)
07-02 15:13:09.481 8853-9304/app.my.myvpnservice W/System.err: at java.nio.channels.DatagramChannel.open(DatagramChannel.java:66)
07-02 15:13:09.481 8853-9304/app.my.myvpnservice W/System.err: at app.my.myvpnservice.MyVpnService$1.run(MyVpnService.java:50)
07-02 15:13:09.482 8853-9304/app.my.myvpnservice W/System.err: at java.lang.Thread.run(Thread.java:848)
07-02 15:13:09.482 8853-9304/app.my.myvpnservice W/System.err: Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
07-02 15:13:09.482 8853-9304/app.my.myvpnservice W/System.err: at libcore.io.Posix.socket(Native Method)
07-02 15:13:09.482 8853-9304/app.my.myvpnservice W/System.err: at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
07-02 15:13:09.482 8853-9304/app.my.myvpnservice W/System.err: at libcore.io.IoBridge.socket(IoBridge.java:607)
07-02 15:13:09.482 8853-9304/app.my.myvpnservice W/System.err: ... 5 more
07-02 15:13:09.536 8853-9304/app.my.myvpnservice D/dalvikvm: threadid=11: exiting
07-02 15:13:09.536 8853-9304/app.my.myvpnservice D/dalvikvm: threadid=11: bye!
07-02 15:13:09.583 8853-8853/app.my.myvpnservice D/ActivityThread: SVC-UNBIND_SERVICE handled : 0 / BindServiceData{token=android.os.BinderProxy@424ef338 intent=Intent { act=android.net.VpnService cmp=app.my.myvpnservice/.MyVpnService }}
null
我还有一个问题。我是否必须使用vpn服务器,或我可以返回包默认方式(隧道),如不使用此服务?
这个问题很老,但是...
您的stacktrace有以下一行:
SocketException:套接字失败:EACCES(权限被拒绝)
这好像是个许可问题。您可以通过将INTERNET权限添加到AndroidManifest.xml中来解决这个问题(如果您已经有了这个权限,但仍然得到这个异常,只需像下面这样添加访问权限):
<manifest
..... >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
....
我需要你帮我拿这个充气机。从Activity3中,我需要获得Activity1中EditText中的内容。 例:在Activity1中,我写我的名字、电子邮件、ECC。在活动2中,我选择我的生日,在活动3中,我想看到两者。 所以我在Activity3中使用了LayoutInflater,但是当我将EditText解析为string时,字符串是空的。 谢了。
这是负责将片段添加到后堆栈的函数: 当我点击后退按钮时,最后一个片段没有被加载(什么也没有发生)。 知道是什么导致的吗? 编辑:FragmentManager日志。 http://pastebin.com/mYnVdkLG 在我看来,我的应用程序似乎在两次保存第二个视图,而不是先保存第一个视图,然后再保存第二个视图。
我想从网站获取一个字符串,并将其转换为数组。它在eclipse中工作,但如果我想在Android应用程序中使用它,它就不起作用了。我知道,这一定是一个愚蠢的错误,但我不知道它在哪里。 InternetHandler: 主要的 显示 它总是返回错误数组,但idk为什么:C logcat: HttpEngineering. sendRequest(HttpEngineering. java: 239)
MediaPlayer中的seekTo()方法有问题。看来根本不管用!我跟踪了关于这个问题的其他线索,并尝试了不同的解决方案,但seekTo()仍然什么也没做!下面是我的代码: system.out.println()显示以下输出: null
在为Android开发的Eclipse Java中······ 正如您所看到的,我根本无法获得应用程序或基本上下文。试图在没有它们的情况下获得文件目录是行不通的。我到底如何访问我的文件目录?
我找了一整天,尝试了大部分的解决方案,但仍然没有成功。在上是否存在的bug? 我有2个字段(调用),是必填字段。当我将留空并输入到,然后输入时,我希望它聚焦回,并显示错误弹出窗口“必填字段为空!”。 但是现在,中的光标仍然不集中,并显示错误 这是我的代码,当按下回车键时,是我上面提到的edtA: 这是edtA的XML: 有人能帮忙吗?谢谢你的时间。 更新:在尝试了所有建议但没有任何改变后,我决定使