android7.0 电子书,Android 7.0 适配

关于

最近在软件的维护和更新过程中,了解到一些关于Android7.0的适配,在这里和大家分享一下,据我所知,需要对Notification、拍照、图片的裁剪进行适配

Notification

关于 Android7.0 Notication 增加的特性,在此我就不详细说明了,因为关于这类介绍的文章,早有一些大牛已经发布过了。我主要讲的是我在应用更新功能中使用 Notification 踩到的坑。可以这么说,应用更新功能对于每个上线App都必不少,因为App的需求或者功能,都是会在不断的变化和完善的。

我遇到的情况是:在 Android7.0 以下,以下代码是显示下载App新版本成功后的通知栏,点击可以跳转到安装App的页面:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

以上代码,在 Android7.0 以下,可以实现点击通知栏拦跳转到安装App界面的功能,但是在安卓7.0或以上,点击事件就出现问题了,点击通知栏没有任何反应,通知栏也不会显示,但是会有error等级的log输出,出现 FileUriExposedException 这样的异常,原因是 Andorid7.0 的“私有目录被限制访问”,“StrictMode API 政策”。

由于从 Android7.0 开始,直接使用真实的路径的Uri会被认为是不安全的,会抛出一个 FileUriExposedException 这样的异常。需要使用 FileProvider,选择性地将封装过的Uri共享到外部。于是,需要对上面的代码进行修改:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

以上代码增加了对系统版本的判断,如果是 Andorid7.0 或以上,则不再使用 Uri.fromFile()方法 获取文件的Uri,而是通过使用 FileProvider(support.v4提供的类) 的getUriForFile()。同时要添加多这么一行代码 installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

由于 FileProvider 是继承 ContentProvider,属于四大组件之一,需要在AndroidManifest.xml中配置,配置如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

配置中的 authorities 按照江湖规矩一般加上包名,${applicationId}是获取当前项目的包名,前提是 defaultConfig{} 闭包中要有applicationId属性。

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

标签中的 resource 填写配置 fileprovider 的配置文件,在res资源目录下新建xml文件下,在该文件夹下创建 file_provider_paths.xml文件,这个xml文件名并不是一定要这么起,只要和清单文件中配置的文件名一致就行。

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

file_provider_paths.xml 的内容如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

上述代码中path="",是有特殊意义的,它代码根目录,也就是说你可以向其它的应用共享根目录及其子目录下任何一个文件了,如果你将 path 设为 path=”pictures”, 那么它代表着根目录下的 pictures目录(eg:/storage/emulated/0/pictures),如果你向其它应用分享 pictures目录 范围之外的文件是不行的。

完成上述的代码修改和 FileProvider 的配置后,就可以兼容 Android7.0 或以上系统了,点击通知栏可以跳转到安装App的界面了。到此,关于 Notification 在 Android7.0 的兼容就完成了。

拍照

在 Andorid7.0 以下,以下代码可以实现跳转到拍照界面的功能,拍完照会在对应开启拍照界面的 Activity 中的 onActivityResult()方法 中回调:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

但是在 Android7.0 或者以上,以上代码在调用拍照功能的时候,会导致应用Crash,会报 FileUriExposedException 异常,需要对以上代码进行修改,对使用App的系统版本进行判断,修改后代码如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

修改完成后,在 Android7.0 或以上的手机调用就可以调用拍照功能了,拍照完后,在 onActivityResult() 回调中,imgFile就是保存拍照后图片的文件对象,就可以进行相应的处理,比如说对图片进行裁剪。

图片的剪裁

在 Android7.0 以下,以下代码可以调用手机自带的图片裁剪功能:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

但是在 Android7.0 或以上,以上代码就需要进行修改,修改如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

getImageContentUri()方法 具体如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

由于自己将发起裁剪请求的方法进行封装,所以在 onActivityResult() 中,拍照完成后,如果需要对图片进行裁剪,则可以这么操作:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

ImageTools 的 decodeUriAsBitmap() 方法,是将Uri转换为Bitmap对象,具体的代码如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

FileUtils.saveBitmapByQuality()方法,是对图片进行压缩,第一个参数传入的是图片的Bitmap对象,第二个参数是压缩的保留率,比如上面使用的是80,即压缩后为原来的80%,则是对其压缩了20%,具体的代码如下:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

上述代码可以实现和兼容 Android7.0 或以上系统的拍照+裁剪图片的功能了。在这里顺便把调用相册功能写贴出来吧,毕竟实际开发中需要上传图片的时候,通常会让用户选择是拍照或者从相册中获取。

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

如果需要在选择完相册图片后对图片进行裁剪,则可以像上面拍照代码那样,需要在 onActivityResult() 回调中,发起裁剪请求。这里一次性贴出 onActivityResult 的处理:

c1941856503f?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

好了,写到这里,我的第一篇博客终于完成了,花了接近四个小时,因为这是属于技术性的博客,文字要求严谨,所以不像写作文那样信手拈来。不过我尽量将文章写得通俗易懂,希望可以帮助到更多的人,之前虽然在做项目的时候,有写过不少笔记,但是从来没有写过博客,要是有哪些地方写得不够好,还请各位大牛提出意见,彼此交流和学习。

我之所以萌发写博客的念头,也是因为在开发过程中查询问题的时候,无意间看到郭霖(人称郭神)的博客,于是一篇篇的看了他的博客,也逐渐了解他,对他非常敬佩,昨天问了他写博客对提升能力有没有帮助,他也推荐我写博客,所以今天我写了第一篇博客,希望可以一直坚持下去,毕竟我对于安卓开发,一直都很热衷。

标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
MathorCup高校数学建模挑战赛是一项旨在提升学生数学应用、创新和团队协作能力的年度竞赛。参赛团队需在规定时间内解决实际问题,运用数学建模方法进行分析并提出解决方案。2021年第十一届比赛的D题就是一个典型例子。 MATLAB是解决这类问题的常用工具。它是一款强大的数值计算和编程软件,广泛应用于数学建模、数据分析和科学计算。MATLAB拥有丰富的函数库,涵盖线性代数、统计分析、优化算法、信号处理等多种数学操作,方便参赛者构建模型和实现算法。 在提供的文件列表中,有几个关键文件: d题论文(1).docx:这可能是参赛队伍对D题的解答报告,详细记录了他们对问题的理解、建模过程、求解方法和结果分析。 D_1.m、ratio.m、importfile.m、Untitled.m、changf.m、pailiezuhe.m、huitu.m:这些是MATLAB源代码文件,每个文件可能对应一个特定的计算步骤或功能。例如: D_1.m 可能是主要的建模代码; ratio.m 可能用于计算某种比例或比率; importfile.m 可能用于导入数据; Untitled.m 可能是未命名的脚本,包含临时或测试代码; changf.m 可能涉及函数变换; pailiezuhe.m 可能与矩阵的排列组合相关; huitu.m 可能用于绘制回路图或流程图。 matlab111.mat:这是一个MATLAB数据文件,存储了变量或矩阵等数据,可能用于后续计算或分析。 D-date.mat:这个文件可能包含与D题相关的特定日期数据,或是模拟过程中用到的时间序列数据。 从这些文件可以推测,参赛队伍可能利用MATLAB完成了数据预处理、模型构建、数值模拟和结果可视化等一系列工作。然而,具体的建模细节和解决方案需要查看解压后的文件内容才能深入了解。 在数学建模过程中,团队需深入理解问题本质,选择合适的数学模
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值