diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9ae704b..17f08bb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,8 @@ + + diff --git a/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt b/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt index 657a40c..01154da 100644 --- a/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt +++ b/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt @@ -46,6 +46,7 @@ import melody.offline.music.bean.FavoriteBean import melody.offline.music.bean.OfflineBean import melody.offline.music.bean.Playlist import melody.offline.music.bean.PlaylistItem +import melody.offline.music.http.MyHttpUtil import melody.offline.music.service.MyDownloadService import melody.offline.music.util.AnalysisUtil import melody.offline.music.util.DownloadUtil @@ -398,8 +399,12 @@ class MoHomeFragment : MoBaseFragment(), } private fun showNoContentUi(string: String) { + val networkType = MyHttpUtil.mInstance.getNetworkType(requireActivity()) + val isVpnConnected = MyHttpUtil.mInstance.isVpnConnected(requireActivity()) val jsonObject = JSONObject() jsonObject.put("fail", string) + jsonObject.put("networkType", networkType) + jsonObject.put("isVpnConnected", isVpnConnected) val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString())) AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_SHOW_FAIL_ACTION, map) diff --git a/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt b/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt index 4894bf2..9a78acf 100644 --- a/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt +++ b/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt @@ -2,6 +2,7 @@ package melody.offline.music.http import android.content.Context import android.net.ConnectivityManager +import android.net.NetworkCapabilities import okhttp3.Callback import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient @@ -87,4 +88,30 @@ class MyHttpUtil { //同步执行会话请求 call.enqueue(callback) } + + fun getNetworkType(context: Context): String { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val activeNetwork = connectivityManager.activeNetwork + val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) + + return when { + networkCapabilities == null -> "No connection" + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "Wi-Fi" + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "Mobile Data" + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> "Ethernet" + else -> "Unknown" + } + } + + fun isVpnConnected(context: Context): Boolean { + val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val networks = connectivityManager.allNetworks + for (network in networks) { + val networkCapabilities = connectivityManager.getNetworkCapabilities(network) + if (networkCapabilities != null && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + return true + } + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/melody/offline/music/innertube/Innertube.kt b/app/src/main/java/melody/offline/music/innertube/Innertube.kt index b7c50be..b734c0f 100644 --- a/app/src/main/java/melody/offline/music/innertube/Innertube.kt +++ b/app/src/main/java/melody/offline/music/innertube/Innertube.kt @@ -21,6 +21,7 @@ import io.ktor.http.HttpHeaders import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json +import melody.offline.music.innertube.utils.CustomDns object Innertube { val TAG = LogTag.VO_API_LOG @@ -29,6 +30,12 @@ object Innertube { expectSuccess = true + engine { + config { + dns(CustomDns()) + } + } + install(ContentNegotiation) { @OptIn(ExperimentalSerializationApi::class) json(Json { diff --git a/app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt b/app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt new file mode 100644 index 0000000..70cfeab --- /dev/null +++ b/app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt @@ -0,0 +1,39 @@ +package melody.offline.music.innertube.utils + +import okhttp3.Dns +import java.net.InetAddress +import java.net.UnknownHostException + +// 自定义 DNS 解析器 +class CustomDns : Dns { + override fun lookup(hostname: String): List { + return try { + // 使用系统默认的 DNS 解析器 + val systemAddresses = Dns.SYSTEM.lookup(hostname) + // 如果系统 DNS 解析失败,使用备用 DNS + if (systemAddresses.isEmpty()) { + mutableListOf().apply { + // 备用 DNS + add(InetAddress.getByName("1.1.1.1")) // Cloudflare DNS + add(InetAddress.getByName("8.8.8.8")) // Google DNS + add(InetAddress.getByName("8.8.4.4")) // Google DNS + add(InetAddress.getByName("200.1.123.5")) // Level3 DNS + add(InetAddress.getByName("200.1.123.6")) // Level3 DNS + add(InetAddress.getByName("189.38.95.95")) // NIC.br DNS + } + } else { + systemAddresses + } + } catch (e: UnknownHostException) { + // 处理异常情况,使用备用 DNS + mutableListOf().apply { + add(InetAddress.getByName("1.1.1.1")) // Cloudflare DNS + add(InetAddress.getByName("8.8.8.8")) // Google DNS + add(InetAddress.getByName("8.8.4.4")) // Google DNS + add(InetAddress.getByName("200.1.123.5")) // Level3 DNS + add(InetAddress.getByName("200.1.123.6")) // Level3 DNS + add(InetAddress.getByName("189.38.95.95")) // NIC.br DNS + } + } + } +} \ No newline at end of file