2023-02-20
查看详情
最近连接自己的 Android 手机发现手机选项设置正确,但是一直无法传文件。但是 Adb 是连接正常的。 自己是一款小米 Mix1; Android 10,已经很久没有更新了;自己回想了唯一变化的是,就是我最近 Mac 升级到了 Mac Os Ventrue; 自己尝试重启手机,尝试重启电脑都不行;只能求助谷歌了;然后搜索到唯一一个有关联的变更;就是 allow accessory to connect | 允许配件连接; 你需要将这里设置为 Always。 然后重新连上手机就可以了,当然自己也不太确认这个能不能完全解决这样的问题;因为我谷歌的手机至今没有遇到这个问题; 详情 »
2021-03-01
查看详情
对于很多初次尝试播放器的同学而言,在完成基本的开发的下一步,是需要对整个播放状况有个初步的认识,其中需要涉及到埋点设计和实现,因此这一块,对于新手而言是非常有难度的。 之前写过文章 基于 Android EXOPlayer 创建视频播放器 介绍过 ExoPlayer。它是谷歌开源的一款播放器,目前用于 YouTube 生产线,我推荐新手区学习它的原因,它整体包很小,里面有很多不错的实现帮助我们去理解播放最基本的事情。当然如果在生产线,还需要结合自己的实际情况取舍,可以参考 Ijkplayer、ExoPlayer、VLC播放器综合比较 的对比,再做实际选择,这里从 ExoPlayer 为基础,分析整个如何确保我们播放体验(QoE)文档。 接入 AnalyticsListener AnalyticsListener 是 Exoplayer 里面实现的一个接口,用于使用该播放器的开发同学方便的进行播放指标相关的统计。 class VideoQoEListener() : AnalyticsListener { override fun onRenderedFirstFrame(eventTime: AnalyticsListener.EventTime, surface: Surface?) { // Add Your Code to 详情 »
2020-12-18
查看详情
这是因为之前遇到一个线上问题引起的,这篇文章阅读的对象也比较适合 Android 和前端阅读。 我们说下 标题的 Document 对象,这个对 Android 开发者而言有些陌生,可以详见 MDN 里面的解释,简单的说就是它可以去代表我们要加载的这个网页对象。里面包含一些基本的信息和所谓生命周期。 Android WebView 提供了基于 WebViewClient 的页面周期的监听方法,常见的有: onPageStarted 当页面开始请求 onPageFinished 页面完成加载 onReceivedError 当加载出现错误的时候 更多方法可以详见 https://developer.android.com/reference/android/webkit/WebViewClient 在 JS 中,我们监听页面加载有两种常见的方法,一种是监听 window.onload 另外一个是 document 里的 readychange 来实现的。 其中 window.onload 定义是当页面完全加载时候触发,包括页面的上包含的图片和样式资源,脚本资源。 而 详情 »
2020-06-15
查看详情
做前端肯定离不开设计师要求自定义滚动条内容,相对于 iOS / Web ,Android 相对比较容易控制,我们可以非常方便的改变 View 或者 WebView 的样式。Android 提供了两个 xml 属性 android:scrollbarThumbVertical android:scrollbarTrackVertical 他们分别表示我们需要改变滚动条的拖拽部分和底部轨道的样式。 如下图 比较常规的设计,我们实现一个带圆角的矩形,我们在 drawable 目录下新建两个文件 custom_scrollbar_thumbnail.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > 详情 »
2020-05-22
查看详情
如果我们需要需要实现一个类似打印当前函数调用的文件名和函数的化,我们需要借助一些类库。 在 swift 中我们可以借助 #file 和 #line 来实现数据获取/。 类似 public static func log(file: String = #file, line: Int = #line) { } 而在 Android 我们需要借助 Thread 来实现 var str = "" try { val filename = Thread.currentThread().stackTrace[your_trace_index].fileName val line = Thread.currentThread().stackTrace[your_trace_index].lineNumber str = " $filename [l$line]" } catch (err: 详情 »