自己动手做一个屏幕扩展APP(?)让老平板作为扩展屏幕
作者:V君 发布于:2021-4-12 23:25 Monday 分类:我的应用
这次先扯一句再开始:对标题中问号的解释,由于这玩意儿不仅仅是个APP,也支持Web方式,而且还有PC桌面端,姑且就叫做APP(?)吧 乂目
效果:将指定窗口截图并以以下方式广播,可以将移动设备或者另一台电脑作为扩展屏幕
- HTTP、MjpegOverHttp(?实为 PNG in multipart/x-mixed-replace)
- Socket(APP)
环境:
- PC端基于 .NET Framework 4.0 编译,未在低于 Win 10 环境下测试
- 为不支持 MjegOverHttp 的旧版本 Android 平板做了 APP,已在 Android 3.0.1 上测试
用法:
1. 在PC端启动 ScreenExtender.exe 检查监听IP和端口
2. 点击Listen启动监听,如果弹出防火墙,请允许
3. 点击 Add 按钮,点击要添加窗口,添加完之后可在预览画面上拖动
4. 在浏览器访问监听IP和端口
- http://192.168.x.x:61234/frame 获取当前帧
- http://192.168.x.x:61234/ 使用性能较低的画布方式轮询绘制帧
- 较新的设备(浏览器)可以访问 http://192.168.x.x:61234/mjpeg 可获得更高性能
A. 为老设备准备的Android端
- 安装启动后会弹出输入IP和端口的输入框,输入正确IP和端口
- 触摸OK即可开始工作,APP会记住最后一次使用的IP和端口
限制:指定的窗口不能最小化,可以被其他窗口遮住在后台运行
稍微扯扯:
尽管目前用了5块1080p显示器,但还是不能满足需求,仍有一些需要监视的东西没能摆下,手里虽然还有闲置的显示器,但电脑桌已经没有地方放第六块显示器了,大概只能钉在墙上了吧……
想起还有一块闲置的老Android平板,那就折腾折腾把他当一块扩展屏幕来用吧。起初用了第三方APP,发现平板的Android版本太低,而且找不到包可以刷(我不会说经历多次变砖然后救回来,直到放弃治疗的)。
想起早些年玩浏览器视讯直播的 MJPEG 了,但遗憾的是老平板的Android版本只有3.0.1,连MJPEG都不支持(然而还好支持画布,但性能太低了),那就专门给它做了个APP,用着效果还不错。
对于版本较新的移动设备,可以直接用浏览器访问 mjpeg 方式
标签: 软件开发 C# Winform HTTP Android
Xamarin Android 新手历险记之 AccessibilityService
作者:V君 发布于:2019-11-30 19:49 Saturday 分类:折腾手记
最近开始折腾 Android 的原生功能,想获取显示在屏幕上的界面元素。说到 Android 还想用我大 C♯ 去写,当然就是 Xamarin 啦!和往常一样,还是从 TL;DR 开始,然后再展开详细。
- TL;DR -
1. 在项目中新增一个类,本例命名为 MyAccessibilityService
2. 使其继承于 AccessibilityService (Android.AccessibilityServices)
3. 追加必要的 Attribute ,如 Service、IntentFilter、MetaData
4. 重写 OnServiceConnected 方法增加 SetServiceInfo 调用
5. 重写 OnAccessibilityEvent 根据 ServiceInfo 做对应动作,达到目的
- 展开 -
1. 略 (o ‵-′)ノ”(ノ﹏<。)
2. 略 (o ‵-′)ノ”(ノ﹏<。)
3. 这里可以稍稍展开
✸ Service 特性主要是 Label 和 Permission
> 用 Label 来指定服务的显示名称
> 用 Permission 指定必须的权限 BindAccessibilityService
✸ IntentFilter 喂进去一个 "android.accessibilityservice.AccessibilityService"
✸ MetaData 喂进去 "android.accessibilityservice" 和 Resource = XML 资源路径
> XML 路径一般是 "@xml/accessibility_service_config",在对应地方写好配置文件即可
> 为了能访问界面元素,确保在配置文件中启用 android:canRetrieveWindowContent
⚠ 注意 MetaData 第一个参数写错不会有检查,只会让服务不按XML配置文件工作
4. 这里主要是创建一个 AccessibilityServiceInfo 实例,然后喂给 SetServiceInfo 方法
> Flags 属性确保有 RetrieveInteractiveWindows 位
> EventTypes 用来给接下来的地方做事件筛选,比如用 WindowsChanged
5. 到这里就可以开始搞事情啦
> 使用当前对象的 RootInActiveWindow 属性获取界面元素的树状结构根节点
- 再稍稍补充一下 -
如果只有 Service 而没有主界面,那就得手动跑到系统设置的辅助功能去启动服务。
有的国产Android手机系统界面被魔改得连辅助功能入口都被砍掉,这太尴尬。
我们可以在主界面做个按钮来导航到辅助功能设置:
1. 使用 Android.Provider.Settings.ActionAccessibilitySettings 实例化 Intent
2. 将其喂给 StartActivity 就可以实现捷径了
- 感受 -
这次能分担给大家的东西并不多。
我不会说因为 MetaData 第一个参数写错,然而没有报错,也获取不到界面元素,让我花了很多时间才找到问题所在。这个细节上咕狗做得很不厚道呀……
说好的每月一篇文章,这次有点踩线呀,虽然创建时间是19点,但发布时已经超过零点了,咕咕咕
Mono Android WebView 应用之 JavascriptInterface
作者:V君 发布于:2017-2-26 18:45 Sunday 分类:折腾手记
上次咱初体验了 Android 的 WebView 随着使用中发现,
原来这货也可以把原生对象实例,作为接口丢进 js.实现在网页脚本直接调用原生功能.
只是方式有点坑, 不过咱还是填上了. 能够挺愉快的使用.
查阅了许多资料,具体限制为只能将字符串作为脚本调用的返回值.
如果你用字符串数组,那么 js 调用端会得到 undefined.
如果被调用的方法发生异常, 则整个应用挂掉...
接下来泥应该知道咱会怎样解决了吧.
是的, 用 JSON 包裹参数和返回值,并且封装调用结果(成功与否、异常信息).
只是, 没想到一直使用的 JSON 库 Newtonsoft.Json 在 2.2 版安卓上并不支持.
只好再找一个叫做 fastJson 的实现, 做个条件编译分别使用了.
到这里, 剩下的就是各种花样展开了.
如果每次都写完参数和返回值的 JSON 转换, 那要不要太呛?
于是,咱们需要封装, 同时也要自动生成 js 的 function stub.
就酱: 一个未经性能优化的初版封装出来了.
继承它,添加公开实例方法,打上 JsApi 特性.
将实例打进 WebView, 同时把 stub 打进 Razor 模板. 定义一个标识符存放输出的 stub.
这样就可以愉快的从 js 直接调用原生功能辣!
标签: 软件开发 移动端 Android HybridApp
Mono Android WebView 应用初体验[Updated]
作者:V君 发布于:2017-2-16 20:38 Thursday 分类:折腾手记
Hybrid App 这个技术诞生的时间很早, 到现在已经颇为成熟.
虽然略有所闻, 也在 Windows forms 上面用 CEF 玩得很溜, 但还是没去实际接触开发.
由于最近有想折腾的玩意儿, 况且公司在不久之后有需要做APP的可能.
就开始去接触吧!
略去安装开发环境的过程, 打开 VS2015. (当然要用我大井来写, 做什么都要用我大井才爽啊)
首先新建 WebView 项目, 然后观察.
和常见的 Android 项目一样, 也见到了熟悉的 Assets Resources MainActivity 这些玩意儿.
不过多了 Models 和 Views 这两个文件夹.
MainActivity 的模板初始化代码也从按钮事件处理, 替换成了 WebView 视图初始化.
还没来得及纠结如何实现页面与原生功能交互时, 已经能看到模板类 HybridWebViewClient 了.
虽然方式有点土, 只能通过请求拦截来实现调用原生代码.
但这已经满足了 APP 开发的最低要求.
那问题来了: (挖掘机哪家强) 跑在手机应用的网页要怎样调试脚本呢?
我们知道 Chrome 的 F12 很好用, 但 APP 能这样整吗?
答案是可以! 咕狗关键字 Android Web View Debug 第一条就找到了官方文档.
官方文档也是先 TL;DR 地列出3个粗略的步骤, 然后再对其逐一详细解释.
1) 启用 WebView 调试属性.
2) 开个Chrome浏览器访问 chrome://inspect 这个 URI.
3) 在页面上列出的视图列表上找到你的应用对应视图, 点击 inspect 链接.
山口山! 一个 F12 工具蹦出来了! 鼠标在元素列表上划过, 手机端视图也和浏览器一样高亮!
整个就像是 Chrome的 F12 一样! (´∀((☆ミつ 本来这就是 Chrome 的 F12!
初体验结束. 接下来可以愉快地写 APP 辣!
Update:
发现要做到这样调试还有一个前提, 也就是需要科学咳咳. 不信你就看 → git/issues
在另一台机做了同样操作,发现白屏了,咕狗一下才知道原来只要这样搞.
因为一直都有自动电梯, 所以没察觉到有这要求...
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)