Что я делаю:
У меня есть флажок в моем приложении, чтобы включить/выключить VPN. Методы вызова флажка в примере ниже.
Как это ведет себя:
После включения VPN все работает нормально. Проблема в том, что иногда, когда я его выключаю или отключаюсь, Интернет перестает работать. Я не могу загрузить ни один сайт в Интернете. У меня есть "!" на моем индикаторе Wi-Fi, и запуск/остановка VPN не поможет. Единственное, что я могу сделать, это снова подключиться к VPN, и все начнет работать, но только пока я подключен. После отключения я больше не смогу пользоваться Интернетом.
Вы можете посмотреть видео по этой ссылке.
Этого не произойдет. всегда. Прямо сейчас мне удалось воспроизвести это с помощью быстрого включения/выключения VPN.
Что помогает:
Только так у меня было Чтобы решить эту проблему, перезагрузите планшет.
Это мой класс VpnService:
Код: Выделить всё
package sk.backbone.bbhub.android.services
import android.app.Activity.DEVICE_POLICY_SERVICE
import android.app.Activity.VPN_MANAGEMENT_SERVICE
import android.app.admin.DevicePolicyManager
import android.content.Context
import android.net.Ikev2VpnProfile
import android.net.VpnManager
import android.os.Build
import dagger.hilt.android.qualifiers.ApplicationContext
import sk.backbone.bbhub.android.receivers.BBHubAdminReceiver.Companion.adminComponent
import sk.backbone.bbhub.android.repositories.local.ConfigSharedPreferences
import sk.backbone.bbhub.shared.entities.DeviceVpnProfileType
import java.io.ByteArrayInputStream
import java.security.cert.CertificateFactory
import java.security.cert.X509Certificate
import javax.inject.Inject
import javax.inject.Singleton
@Singleton
class VpnService @Inject constructor() {
@Inject @ApplicationContext lateinit var context: Context
@Inject lateinit var deviceService: dagger.Lazy
@Inject lateinit var configSharedPreferences: ConfigSharedPreferences
val vpnManager by lazy {
context.getSystemService(VPN_MANAGEMENT_SERVICE) as VpnManager
}
val devicePolicyManager by lazy {
context.getSystemService(DEVICE_POLICY_SERVICE) as DevicePolicyManager
}
private fun startVpn(){
stopVpn()
val deviceSettings = deviceService.get()?.deviceConfigurationFlow?.value?.snapshot?.deviceSetting
if(deviceSettings?.vpnProfileType == null){
return
}
if(deviceSettings.vpnServerAddress == null){
return
}
if(deviceSettings.vpnIdentity == null){
return
}
val cert = deviceSettings.vpnServerRootCa?.let {
ByteArrayInputStream(it.toByteArray()).use { inStream ->
val cf = CertificateFactory.getInstance("X.509")
cf.generateCertificate(inStream) as X509Certificate
}
}
vpnManager.provisionVpnProfile(
Ikev2VpnProfile.Builder(deviceSettings.vpnServerAddress!!, deviceSettings.vpnIdentity!!).apply {
when(deviceSettings.vpnProfileType!!){
DeviceVpnProfileType.TYPE_IKEV2_IPSEC_PSK -> {
setAuthPsk((deviceSettings.vpnPreSharedKey ?: "").toByteArray())
}
DeviceVpnProfileType.TYPE_IKEV2_IPSEC_RSA -> {
// Todo:
// setAuthDigitalSignature()
}
DeviceVpnProfileType.TYPE_IKEV2_IPSEC_USER_PASS -> {
setAuthUsernamePassword(deviceSettings.vpnUser ?: "", deviceSettings.vpnPassword ?: "", cert)
}
}
}.build()
)
devicePolicyManager.setAlwaysOnVpnPackage(context.adminComponent, context.packageName, false)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
vpnManager.startProvisionedVpnProfileSession()
} else {
@Suppress("DEPRECATION")
vpnManager.startProvisionedVpnProfile()
}
}
private fun stopVpn() {
devicePolicyManager.setAlwaysOnVpnPackage(context.adminComponent, null, false)
vpnManager.stopProvisionedVpnProfile()
vpnManager.deleteProvisionedVpnProfile()
}
}
Обновить
[*]добавлены журналы logcat с использованием «vpn» в фильтре OnStart OnStop.
добавлены журналы logcat с использованием «сети» в фильтре OnStop
Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-vpn-off
Мобильная версия