【问题标题】:Create a VPN profile programatically Android以编程方式创建 VPN 配置文件 Android
【发布时间】:2018-12-07 17:18:15
【问题描述】:

我一直在解析网络以寻找在 Android 上创建 VPN 客户端的方法。我似乎找不到任何关于如何做到这一点的好资源。

目标是,我希望能够使用 Android 中的内置 VPN 功能(可能以编程方式添加新连接)或其他方式设置 VPN。

我确实在文档中遇到过VpnService,但不清楚如何使用它。有没有人有一个很好的例子,现在Android SDK可以做到吗?

【问题讨论】:

    标签: java android vpn android-vpn-service


    【解决方案1】:

    Android 提供了一个sample code ToyVpn,您可以根据需要查看和重用逻辑。


    这里有来自documentation的一些细节

    这个类中有两个主要方法:prepare(Context) 和 VpnService.Builder.establish()。前者处理用户操作并停止由另一个应用程序创建的 VPN 连接。后者使用提供给 VpnService.Builder 的参数创建一个 VPN 接口。应用程序必须调用 prepare(Context) 来授予使用该类中其他方法的权限,并且可以随时撤销该权限。以下是创建 VPN 连接的一般步骤:

    1. 当用户按下按钮连接时,调用prepare(Context)并启动返回的intent,如果非null。

    2. 应用准备就绪后,启动服务。

    3. 创建通往远程服务器的隧道并协商 VPN 连接的网络参数。

    4. 将这些参数提供给 VpnService.Builder 并通过调用 VpnService.Builder.establish() 创建 VPN 接口。

    5. 在隧道和返回的文件描述符之间处理和交换数据包。

    6. 调用 onRevoke() 时,关闭文件描述符并正常关闭隧道。

    扩展此类的服务需要使用适当的权限和意图过滤器进行声明。他们的访问必须由 Manifest.permission.BIND_VPN_SERVICE 权限保护,并且他们的意图过滤器必须匹配 SERVICE_INTERFACE 操作。以下是在 AndroidManifest.xml 中声明 VPN 服务的示例:

    <service android:name=".ExampleVpnService"
             android:permission="android.permission.BIND_VPN_SERVICE">
         <intent-filter>
             <action android:name="android.net.VpnService"/>
         </intent-filter>
     </service>
    

    【讨论】:

    • 嗨,Pankaj!是否可以只更改dns地址并保留其余地址?我真的不知道 .addAddress 或 .addRoute 做了什么,我只想更改 dns
    猜你喜欢
    • 2015-10-26
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2012-05-13
    • 2012-07-17
    • 2012-03-31
    • 2013-12-23
    相关资源
    最近更新 更多