This commit is contained in:
ocean 2024-07-22 16:00:06 +08:00
parent 4cbcb7b743
commit 613e58767e
5 changed files with 80 additions and 0 deletions

View File

@ -10,6 +10,8 @@
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

View File

@ -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<FragmentMoHomeBinding>(),
}
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)

View File

@ -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
}
}

View File

@ -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 {

View File

@ -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<InetAddress> {
return try {
// 使用系统默认的 DNS 解析器
val systemAddresses = Dns.SYSTEM.lookup(hostname)
// 如果系统 DNS 解析失败,使用备用 DNS
if (systemAddresses.isEmpty()) {
mutableListOf<InetAddress>().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<InetAddress>().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
}
}
}
}