update
This commit is contained in:
parent
4cbcb7b743
commit
613e58767e
@ -10,6 +10,8 @@
|
|||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
<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.RECEIVE_BOOT_COMPLETED" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<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.READ_EXTERNAL_STORAGE" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
|||||||
@ -46,6 +46,7 @@ import melody.offline.music.bean.FavoriteBean
|
|||||||
import melody.offline.music.bean.OfflineBean
|
import melody.offline.music.bean.OfflineBean
|
||||||
import melody.offline.music.bean.Playlist
|
import melody.offline.music.bean.Playlist
|
||||||
import melody.offline.music.bean.PlaylistItem
|
import melody.offline.music.bean.PlaylistItem
|
||||||
|
import melody.offline.music.http.MyHttpUtil
|
||||||
import melody.offline.music.service.MyDownloadService
|
import melody.offline.music.service.MyDownloadService
|
||||||
import melody.offline.music.util.AnalysisUtil
|
import melody.offline.music.util.AnalysisUtil
|
||||||
import melody.offline.music.util.DownloadUtil
|
import melody.offline.music.util.DownloadUtil
|
||||||
@ -398,8 +399,12 @@ class MoHomeFragment : MoBaseFragment<FragmentMoHomeBinding>(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun showNoContentUi(string: String) {
|
private fun showNoContentUi(string: String) {
|
||||||
|
val networkType = MyHttpUtil.mInstance.getNetworkType(requireActivity())
|
||||||
|
val isVpnConnected = MyHttpUtil.mInstance.isVpnConnected(requireActivity())
|
||||||
val jsonObject = JSONObject()
|
val jsonObject = JSONObject()
|
||||||
jsonObject.put("fail", string)
|
jsonObject.put("fail", string)
|
||||||
|
jsonObject.put("networkType", networkType)
|
||||||
|
jsonObject.put("isVpnConnected", isVpnConnected)
|
||||||
val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString()))
|
val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString()))
|
||||||
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_SHOW_FAIL_ACTION, map)
|
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_SHOW_FAIL_ACTION, map)
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,7 @@ package melody.offline.music.http
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.net.ConnectivityManager
|
import android.net.ConnectivityManager
|
||||||
|
import android.net.NetworkCapabilities
|
||||||
import okhttp3.Callback
|
import okhttp3.Callback
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
@ -87,4 +88,30 @@ class MyHttpUtil {
|
|||||||
//同步执行会话请求
|
//同步执行会话请求
|
||||||
call.enqueue(callback)
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -21,6 +21,7 @@ import io.ktor.http.HttpHeaders
|
|||||||
import io.ktor.serialization.kotlinx.json.json
|
import io.ktor.serialization.kotlinx.json.json
|
||||||
import kotlinx.serialization.ExperimentalSerializationApi
|
import kotlinx.serialization.ExperimentalSerializationApi
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
|
import melody.offline.music.innertube.utils.CustomDns
|
||||||
|
|
||||||
object Innertube {
|
object Innertube {
|
||||||
val TAG = LogTag.VO_API_LOG
|
val TAG = LogTag.VO_API_LOG
|
||||||
@ -29,6 +30,12 @@ object Innertube {
|
|||||||
|
|
||||||
expectSuccess = true
|
expectSuccess = true
|
||||||
|
|
||||||
|
engine {
|
||||||
|
config {
|
||||||
|
dns(CustomDns())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
install(ContentNegotiation) {
|
install(ContentNegotiation) {
|
||||||
@OptIn(ExperimentalSerializationApi::class)
|
@OptIn(ExperimentalSerializationApi::class)
|
||||||
json(Json {
|
json(Json {
|
||||||
|
|||||||
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user