当前位置:  开发笔记 > Android > 正文

Android运行时执行与NetworkRequest

如何解决《Android运行时执行与NetworkRequest》经验,为你挑选了1个好方法。

我在我的Android应用程序中运行命令行参数,如:

ProcessBuilder pb = new ProcessBuilder(cmds);
Process process = pb.start();
process.waitFor();

cmds要运行的参数列表在哪里.我的命令通过http连接探测远程URL.我的设备连接到无法访问互联网的WiFi网络,但确实托管了我想要探测的网址.我的设备也有一个可以访问互联网的蜂窝连接,但不能访问URL.我的设备运行的是Android 6.0 Marshmallow.

通常在Lollipop或更高版本中,Android默认使用连接到互联网的网络.要访问没有互联网的WiFi网络,您需要使用NetworkRequest,例如:https://stackoverflow.com/a/27958106/1847734.

我怎样才能将获得的内容传递Network给上面Process,以便连接通过我的WiFi网络,而不是我的蜂窝网络?

我是否需要使用ConnectivityManager#bindProcessToNetwork?如何使用此方法加入设置网络的过程?似乎没有选择给予这个过程.



1> Michael..:

从棒棒糖开始NetworkParcelable,所以你可以写一个字节数组,然后回读.让我们从写作部分开始吧.

final Parcel parcel = Parcel.obtain();
try {
  // Create a byte array from Network.
  parcel.writeParcelable(network, 0);
  final byte[] data = parcel.marshall();

  // Start a process.
  ProcessBuilder pb = new ProcessBuilder(cmds);
  Process process = pb.start();

  // Send serialized Network to the process.
  final DataOutputStream out = new DataOutputStream(process.getOutputStream());
  out.write(data.length);
  out.write(data);

  // Wait until the process terminates.
  process.waitFor();
} finally {
  parcel.recycle();
}

和阅读部分.

// Read data from the input stream.
final DataInputStream in = new DataInputStream(System.in);
final int length = in.readInt();
final byte[] data = new byte[length];
in.readFully(data);

final Parcel parcel = Parcel.obtain();
try {
  // Restore Network from a byte array.
  parcel.unmarshall(data, 0, data.length);
  final Network network = parcel.readParcelable(null);

  // Use the Network object to bind the process to it.
  connectivityManager.bindProcessToNetwork(network);
} finally {
  parcel.recycle();
}

此代码仅适用于Android 6.0.如果你想让它在棒棒糖上工作,你应该使用ConnectivityManager.setProcessDefaultNetwork(Network)而不是ConnectivityManager.bindProcessToNetwork(Network).此代码在Android 5.0之前无法在设备上运行.

更新:

对于非Android进程,您可以创建套接字,将其绑定到nework Network.bindSocket(Socket)并将套接字描述符传递给子进程.

如果以前的方法不适合您,您可以从中调用NDK函数android_setsocknetwork,multinetwork.h甚至尝试执行Android将进程绑定到给定网络时执行的操作.你可能感兴趣的一切都发生在netd客户端.通过网络ID NetdClientfwmarkd 此处发送消息.实际的消息发送在这里.但我建议使用这种方法作为解决问题的最后机会.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有