我需要在我的安卓应用中根据上传速度做一些操作。这是一个广播应用,我想根据网络上传速度更新分辨率和码率。例如,如果上传速度低于0.5 Mb,我想设置不同的码率和分辨率为360p。如何测量上传速度?我试过使用连接管理器,但它只给出了整体强度。但不是确切的速度。
mec1mxoz1#
我使用以下代码每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")
nnsrf1az2#
有两种方法1.实现服务器端字节接收报告当大文件上传到服务器时,服务器应该计算每秒接收字节和对客户端的响应,这样您就可以通过简单的计算来计算准确的速度1.如果您服务器无法报告BYTES_RECEIVED,您可以实现NDK(c++)模块,该模块使用HTTP客户端点对点传输,您可以将字节从java/Kotlin部分发送到ndk,它将计算上一秒的WHOLE_BYTES / TRANSFERED_BYTES,并计算每秒的速度
2条答案
按热度按时间mec1mxoz1#
我使用以下代码每5秒检查一次下载/上传速度。
以及
以及
nnsrf1az2#
有两种方法
1.实现服务器端字节接收报告当大文件上传到服务器时,服务器应该计算每秒接收字节和对客户端的响应,这样您就可以通过简单的计算来计算准确的速度
1.如果您服务器无法报告BYTES_RECEIVED,您可以实现NDK(c++)模块,该模块使用HTTP客户端点对点传输,您可以将字节从java/Kotlin部分发送到ndk,它将计算上一秒的WHOLE_BYTES / TRANSFERED_BYTES,并计算每秒的速度