5

VPNService に接続する意図を使用せずに、トラフィックが VPN を通過しているかどうかをプログラムで検出する方法。システムコールはありますか?

4

5 に答える 5

2

Android API 21 以降で確認することは可能ですが、動作しないようです (nexus 5 @ 5.0.1、nexus 7 @ 5.0.2)。なぜ機能しないのですか?

チェック用の新しい API のスニペット (接続されている場合、すべてのトラフィックは vpn によってルーティングされます):

@Inject
boolean checkVPN(ConnectivityManager connMgr) {
    //don't know why always returns null:
    NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_VPN);

    boolean isVpnConn = networkInfo == null ? false : networkInfo.isConnected();
    return isVpnConn;
}
于 2015-04-02T17:22:55.567 に答える
1

Android では、次のコードで VPN を検出できます。コードは、新しいバージョンと古いバージョンの Android で動作します。以下のコードは Kotlin です。

    class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if(checkVPNStatus()) {
            Log.d("VPN-RAJ", "is VPN Connected YES")
        } else {
            Log.d("VPN-RAJ", "is VPN Connected NO")
        }
    }


    private fun checkVPNStatus(): Boolean {
        val connectivityManager = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            val network = connectivityManager.activeNetwork
            val capabilities = connectivityManager.getNetworkCapabilities(network)
            Log.d("VPN-RAJ", "in New Android Version")

            capabilities!= null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)

        } else {
            Log.d("VPN-RAJ", "in Old Android Version")

            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN)!!.isConnectedOrConnecting
        }


    }


}
于 2019-06-27T10:49:20.820 に答える