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