在安卓手机上,应用程序可以选择使用APN吗?

问题描述

移动网络能够与连接到网络的手机同时建立多个 APN。

当 Android 手机上的 Android 应用程序需要通过网络进行通信时,Android 操作系统是否允许其应用程序选择使用哪个 APN 来承载其通信?

请注意,我不是询问如何更改认 APN。

用例是有一个或多个应用程序需要使用特定的 APNs(例如访问无法通过认 APN 连接访问的网络资源),但其他应用程序(例如 gmail、网页浏览、youtube、Signal等)仍然需要能够访问互联网,因此需要在使用“特定”APN 时同时建立“认”APN(反之亦然)。

解决方法

通常,如果您想要一个 APN,您会要求一个带有 TRANSPORT_CELLULAR 的网络。现在,您需要在特定 APN 上拥有一个 NetworkCapability,您可以使用它来唯一标识它。在本例中,我将选择 NET_CAPABILITY_NOT_RESTRICTED

此特定功能用于识别不应被选为默认网络的受限网络。现在,欢迎您选择您喜欢的任何 NetworkCapability。请记住,NET_CAPABILITY_NOT_RESTRICTED 是一项受限功能,因此您需要提升权限才能请求它。

最后,假设您有第一个 APN 设置以及带有 NetworkCapabilities 的第二个 APN 设置,使其独一无二,然后您可以更新这些应用程序以创建一个 NetworkRequest,然后它们可以使用它来唯一请求第二个 APN。

因此,在第二个 APN 上,您必须使用其独特的 NetworkCapability 配置进行设置。在我们的例子中,删除 NET_CAPABILITY_NOT_RESTRICTED 从而使其成为受限网络。现在,您创建一个网络请求,但要求 TRANSPORT_CELLULARremove 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。