在 Android 手机上,应用程序可以选择使用 APN 吗?
On Android mobile phones, can applications choose the APN to use?
移动网络能够同时建立多个 APN,phone 连接到网络。
当 Android phone 上的 android 应用程序需要通过网络通信时,Android OS 是否允许其应用程序选择哪个 APN会用来承载他们的通讯吗?
请注意,我不是询问如何更改默认 APN。
用例是有一个或多个应用程序需要使用特定的 APN(例如访问通过默认 APN 连接不可用的网络资源)但其他应用程序(例如 gmail、网页浏览、youtube ,信号等)仍然需要能够访问互联网,因此在使用“特定”APN 时需要同时建立“默认”APN(反之亦然)。
通常情况下,如果您想要一个 APN,您会要求一个具有 TRANSPORT_CELLULAR. Now, you need to have a NetworkCapability on the particular APN that you can use to uniquely identify it. In this case, I am going to choose NET_CAPABILITY_NOT_RESTRICTED 的网络。
此特定功能用于识别不应被选为默认网络的受限网络。现在,欢迎您选择任何 NetworkCapability that you like. Keep in mind, NET_CAPABILITY_NOT_RESTRICTED 是受限功能,因此您需要提升权限才能请求它。
最后,假设您有第一个 APN 设置以及第二个 APN 设置NetworkCapabilities that make it unique, you can then update those apps to create a NetworkRequest,然后他们可以使用它们来唯一地请求第二个 APN。
因此,在第二个 APN 上,您必须使用其唯一的 NetworkCapability configuration. In our case, remove the NET_CAPABILITY_NOT_RESTRICTED which in turn makes it a restricted network. Now, you create a network request, but ask for TRANSPORT_CELLULAR and remove NET_CAPABILITY_NOT_RESTRICTED 进行设置,因为这是默认包含的。
下面是演示上述内容的示例:
final NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.build();
final ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkCallback networkCallback = new NetworkCallback() {
...
@Override
void onAvailable(...) {
// Triggers when this network is available so you can bind to it.
}
@Override
void onUnavailable(...) {
// Triggers when this network is lost.
}
...
};
connectivityManager.requestNetwork(request, networkCallback);
假设您已正确设置第二个 APN,以上将允许应用程序唯一请求它,而其他应用程序将继续使用第一个 APN。
移动网络能够同时建立多个 APN,phone 连接到网络。
当 Android phone 上的 android 应用程序需要通过网络通信时,Android OS 是否允许其应用程序选择哪个 APN会用来承载他们的通讯吗?
请注意,我不是询问如何更改默认 APN。
用例是有一个或多个应用程序需要使用特定的 APN(例如访问通过默认 APN 连接不可用的网络资源)但其他应用程序(例如 gmail、网页浏览、youtube ,信号等)仍然需要能够访问互联网,因此在使用“特定”APN 时需要同时建立“默认”APN(反之亦然)。
通常情况下,如果您想要一个 APN,您会要求一个具有 TRANSPORT_CELLULAR. Now, you need to have a NetworkCapability on the particular APN that you can use to uniquely identify it. In this case, I am going to choose NET_CAPABILITY_NOT_RESTRICTED 的网络。
此特定功能用于识别不应被选为默认网络的受限网络。现在,欢迎您选择任何 NetworkCapability that you like. Keep in mind, NET_CAPABILITY_NOT_RESTRICTED 是受限功能,因此您需要提升权限才能请求它。
最后,假设您有第一个 APN 设置以及第二个 APN 设置NetworkCapabilities that make it unique, you can then update those apps to create a NetworkRequest,然后他们可以使用它们来唯一地请求第二个 APN。
因此,在第二个 APN 上,您必须使用其唯一的 NetworkCapability configuration. In our case, remove the NET_CAPABILITY_NOT_RESTRICTED which in turn makes it a restricted network. Now, you create a network request, but ask for TRANSPORT_CELLULAR and remove NET_CAPABILITY_NOT_RESTRICTED 进行设置,因为这是默认包含的。
下面是演示上述内容的示例:
final NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
.build();
final ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkCallback networkCallback = new NetworkCallback() {
...
@Override
void onAvailable(...) {
// Triggers when this network is available so you can bind to it.
}
@Override
void onUnavailable(...) {
// Triggers when this network is lost.
}
...
};
connectivityManager.requestNetwork(request, networkCallback);
假设您已正确设置第二个 APN,以上将允许应用程序唯一请求它,而其他应用程序将继续使用第一个 APN。