在 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。