如何在android中获得上传速度?



我需要根据上传速度在我的android应用程序中做一些操作。这是一个广播应用程序,基于网络上传速度,我想更新分辨率和比特率。例如,如果上传速度低于0.5 Mb,我想设置不同的比特率和分辨率为360p。如何测量上传速度?

我尝试了连接管理器,但它只给出了整体强度。但不是确切的速度。

我使用以下方法每5秒检查一次下载/上传速度。

import android.net.TrafficStats
object RetrieveData {
private var totalDownload: Long = 0
private var totalDownload_n: Long = 0
private var totalUpload: Long = 0
private var totalUpload_n: Long = 0
fun findData(uid: Int): List<Long?> {
val allData: MutableList<Long?> = ArrayList<Long?>()
if (totalDownload == 0L) {
totalDownload = TrafficStats.getUidRxBytes(uid)
}
if (totalUpload == 0L) {
totalUpload = TrafficStats.getUidTxBytes(uid)
}
val newTotalDownload = TrafficStats.getUidRxBytes(uid)
val incDownload = newTotalDownload - totalDownload
val newTotalUpload = TrafficStats.getUidTxBytes(uid)
val incUpload = newTotalUpload - totalUpload
totalDownload = newTotalDownload
totalUpload = newTotalUpload
allData.add(incDownload)
allData.add(incUpload)
return allData
}

val timer=fixedRateTimer("ss",false,1000,5000){
getData()
}

fun getData() {
val allData = findData(applicationInfo.uid)
val mDownload = allData[0]
val mUpload = allData[1]
val df = DecimalFormat("#.##")
var downloadSpeedApi=0
var uploadSpeedApi=0
var upSpeed: String = if (mUpload!! < 128) {
mUpload.toInt().toString() + " B/s"
} else if (mUpload < 1048576) {
(mUpload.toInt() / 1024).toString() + " KB/s"
} else {
df.format(mUpload.toDouble() / 1048576.0).toString() + " MB/s"
}
var downSpeed: String = if (mDownload!! < 128) {
mDownload.toInt().toString() + " B/s"
} else if (mDownload < 1048576) {
(mDownload.toInt() / 1024).toString() + " KB/s"
} else {
df.format(mDownload.toDouble() / 1048576.0).toString() + " MB/s"
}
Log.d("MyTAG", "$downSpeed, $upSpeed")

有两种方法

  1. 实现服务器端字节接收报告当一个大文件上传到服务器时服务器应该计算接收到的字节数,并每次响应客户端秒,所以你可以计算准确的速度通过简单的计算

  2. 如果你的服务器不能报告BYTES_RECEIVED你可以实现NDK (c++)模块使用http客户端ptp传输你可以从java/kotlin部分发送字节到ndk,它会在最后计算WHOLE_BYTES/TRANSFERED_BYTES秒,计算每秒速度

最新更新