gpt4 book ai didi

使用 NetworkRequest 执行 Android 运行时

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:53 25 4
gpt4 key购买 nike

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

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

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

一般在Lollipop或以上版本,Android默认是连接到internet的网络。要在没有互联网的情况下访问 WiFi 网络,您需要使用 NetworkRequest,例如:https://stackoverflow.com/a/27958106/1847734 .

如何将获得的 Network 传递给上述 Process,以便连接通过我的 WiFi 网络,而不是我的蜂窝网络?

我是否需要使用 ConnectivityManager#bindProcessToNetwork ?如何加入使用此方法设置网络的进程?好像没有给进程的选项。

最佳答案

从 Lollipop Network 开始是 Parcelable,因此您可以将其写入字节数组,然后再读回。让我们从写作部分开始吧。

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。如果你想让它在 Lollipop 上工作,你应该使用 ConnectivityManager.setProcessDefaultNetwork(Network)而不是 ConnectivityManager.bindProcessToNetwork(Network)。并且此代码不适用于 Android 5.0 之前的设备。

更新:

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

如果前面的方法对你不起作用,你可以从 multipetwork.h 调用 NDK 函数 android_setsocknetwork 或者甚至尝试做 Android 在你绑定(bind)一个处理给定的网络。您可能感兴趣的一切都发生在 netd client 中. NetdClient 发送消息给fwmarkd here传递网络 ID。实际消息发送发生 here .但我建议使用这种方法作为解决问题的最后机会。

关于使用 NetworkRequest 执行 Android 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34044468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com