比来在做新营业需求的同时,我们在 Android 上碰到了一些之前没有碰着过的问题,截屏分享、 WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享掉败等问题,在这过程中踩了很多坑,到今朝为止绝大年夜部分的问题都还算是有了比较知足的解决筹划。以下就安闲个方面来总结一下过程中碰到的挑衅和最后的解决筹划。
一、概述
比来在做新营业需求的同时,我们在 Android 上碰到了一些之前没有碰着过的问题,截屏分享、 WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享掉败等问题,在这过程中踩了很多坑,到今朝为止绝大年夜部分的问题都还算是有了比较知足的解决筹划。以下就安闲个方面来总结一下过程中碰到的挑衅和最后的解决筹划。
二、截图分享
在 Android 原生体系中是没有供给截图的广播或者监听事宜的,也就是说代码层面无法获知用户的截屏操作,如许就无法知足用户截屏后彪炳分享提示的需求。既然无法大年夜根本上解决截屏监听的问题,那么就要推敲经由过程其他方法借居实现,今朝比较成熟稳定的筹划是监听体系媒体数据库资本的变更,具体筹划道理如下:
Android 体系有一个媒体数据库,每拍一张照片,或应用体系截屏朝长进步一张图片,都邑把这张图片的具体信息参加到这个媒体数据库,并发出内容改变通知,我们可以应用内容不雅察者(ContentObserver)监听媒体数据库的变更,当数据库有变更时,获取最后插入的一条图片数据,如不雅该图片相符特定的规矩,则认为被截屏了。
推敲到手机存储包含内部存储器和外部存储器,为了加强兼容性,最好同时监听两种储存空间的变更,以下是须要 ContentObserver 监听的资本 URI :
- MediaStore.Images.Media.INTERNAL_CONTENT_URI
- MediaStore.Images.Media.EXTERNAL_CONTENT_URI
攫取外部存储器资本,须要添加权限:
- android.permission.READ_EXTERNAL_STORAGE
关于第3点须要弥补解释一下,因为要断定图片文件路径是否包含关键字,所以今朝仅支撑中英文情况,如不雅须要支撑其他说话,须要手动添加一些该说话的关键词,不然有可能获取不到图片。
1. 截屏断定规矩
以上3点根本上可以包管截图的┞俘常监听,当然在实际测试过程中,还会发明有些机型存在多报的情况,所以还须要做一些去重等工作,关于去重下面还会再说起。
2. 关键代码
道理都懂得清跋扈了,那么接下来就是若何实现的问题了。这里最关键是媒体内容不雅察者的设置,大年夜数据库中掏出第一条数据并解析图片信息,然后再考验图片信息是否相符以上3条规矩。
为了说清跋假使何监听媒体数据库改变,先要稍微讲一下 ContentObserver 的道理。 ContentObserver ——内容不雅察者,目标是不雅察(捕获)特定 Uri 引起的数据库的变更,继而做一些响应的处理,它类似于数据库技巧中的触发器(Trigger),当 ContentObserver 所不雅察的 Uri 产生变更时,便会触发它。当然想要不雅察就必须先要注册, Android 体系供给了 ContentResolver#registerContentObserver 办法用来注册不雅察器。此部分不熟悉的同窗可以复习一下 Android 的 ContentProvider 相干常识。
接下来直接用代码解释全部注册和触发流程,代码如下:
- private void initMediaContentObserver() {
- // 运行在 UI 线程的 Handler, 用于运行监听器回调
- private final Handler mUiHandler = new Handler(Looper.getMainLooper());
- // 创建内容不雅察者,包含内部存储和外部存储
- mInternalObserver = new MediaContentObserver(MediaStore.Images.Media.INTERNAL_CONTENT_URI, mUiHandler);
- mExternalObserver = new MediaContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mUiHandler);
- // 注册内容不雅察者
- mContext.getContentResolver().registerContentObserver(
- MediaStore.Images.Media.INTERNAL_CONTENT_URI, false, mInternalObserver);
- mContext.getContentResolver().registerContentObserver(
- MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false, mExternalObserver);
- }
- /**
推荐阅读
赓续增长的存储需求促使很多企业转向云计算。云计算是新实际,但确保云存储在安然,机能和可扩大性方面获得恰当构建也至关重要。 云计算响应筹划成“大年夜杂烩”怎么办?分析机构>>>详细阅读
本文标题:Android截屏与WebView长图分享经验总结
地址:http://www.17bianji.com/lsqh/35456.html
1/2 1