
Android
文章平均质量分 87
奏奏奏奏
这个作者很懒,什么都没留下…
展开
-
白嫖Github和CDN,播放一个远程视频
前言我用手机录制了一段视频,准备用exoplayer进行播放,当我准备将mp4文件放入工程时我发现文件太大了,这样app体积会很大,于是我找了个办法,把文件放到网上,但是我又爱折腾,研究了一下准备弄个m3u8格式的播放列表,顺便学习ffmpeg的命令。下载工具并调出命令行去官网FFmpeg下载工具,获取包和可执行文件。因为我使用的windows,直接去发布版本里找到这个ffmpeg-4.4-essentials_build.zip,下载解压之后把ffmpeg.exe复制到需要使用他的地方(我的路径 J原创 2021-09-29 14:44:57 · 3180 阅读 · 0 评论 -
从AppCompat切换到MaterialComponents一些主题属性介绍
前言絮叨两句,感觉Component这个库有点傲娇,我碰到一个情景,使用Button,设置了background属性,当使用样式是AppCompat时,正常显示背景。但是当我换成MaterialComponents之后,我发现有一些Button背景正常,有一些背景不正常了。我又没用MaterialButton。。。普通写的selector都能给我失效哦。肯定是这个库搞得鬼,然后我看到了backgroundTint这个属性,总之很无语。然后找了篇文章,写了这篇笔记。主题属性总而言之在这些里面选就好了,类转载 2021-09-01 17:32:58 · 4790 阅读 · 0 评论 -
.idea文件夹一探究竟
前言有一个契机促使我去研究这个文件夹,我碰上一件奇怪的事。我有在ide里设置了gradle的usr home路径,这与系统默认的用户主目录不同。我使用的Android Studio版本为2020.3.1 北极狐版。我新建了一个项目,我发现使用的gradle-7.0.2-bin.zip,我使用gradlew -v查看Gradle的版本号确实是7.0.2,但是在.idea/gradle.xml内是这样的 <GradleProjectSettings> <optio原创 2021-08-12 15:45:47 · 2208 阅读 · 1 评论 -
gradle脚本改造from Groovy to Kotlin
前言前文buildSrc使用,依赖统一管理。gradle版本一升级我就懵逼,有些命令用不了,经常在gradle和kts之间来回切,记录一下。什么是Kotlin DSLAndroid Studio是使用Gradle来编译,而默认的构建语言是Groovy,但是Gradle实际上是支持Kotlin来编写Gradle构建脚本的,常见的构建脚本是.gradle结尾,而Koltin语法编写的脚本则是.gradle.kts。Gradle官网也是给出了Groovy迁移Kotlin的指导文章:Migrating bu原创 2021-07-30 15:31:08 · 1371 阅读 · 0 评论 -
Toolbar和ActionBar的小结
前言哼,Toolbar,有够厉害的。算google致力于简化开发,提供的封装好的控件。像这种封装好的自定义控件有很多,比如BottomNavigation、比如TextInputLayout等。贴个material design风格控件网址:Components,有兴趣的可以看看。ActionBar描述:活动中的主要工具栏,可以显示活动标题,应用程序级别的导航功能和其他交互式项。诞生:是Google在Android 3.0(api 11)时代推出的。Android 5.0之前要使用Actio原创 2021-04-30 17:17:54 · 645 阅读 · 0 评论 -
Android多渠道打包
文章目录前言打包前需了解开始打包补充1-默认打包配置补充2-多渠道打包和第三方sdk的恩怨情仇补充3-未在 build.gradle 文件中定义 applicationId 属性的情况补充4-获取应用id的方法补充4- Google Play中的多APK分发补充5-配置构建变体补充6-多使用${applicationId}后话美团多渠道打包方案wallewalle集成阿里应用分发平台小米开放平台腾讯开放平台OPPO开放平台vivo开放平台华为开发者平台前言使用版本Android Studio4.1.2。原创 2021-04-28 17:12:14 · 656 阅读 · 0 评论 -
MPAndroidChart使用记录
文章目录前言举例说明一些概念Chart设置补充1:ViewPortHandler类补充2:设置空数据文案补充3:设置触摸监听并打印当前坐标补充4:给chart设置一组数据折线图示例柱状图示例ChartData刷新列表的2种方式ComponentBaseDescriptionLimitLineLegendAxisBaseMarkerView前言说到图表,我第一时间就想到了大名鼎鼎的MPAndroidChart,这个库在在IOS端叫Charts。如果是网页端,ECharts库很好用。本文中使用库版本为M原创 2021-04-20 18:06:21 · 2156 阅读 · 1 评论 -
Android中Notification工具类
前言应用通知挺常见的,比如接入各个手机厂商的推送sdk。以前封装过一个工具类,准备分享一下。值得注意的点从 Android 5.0 开始,通知可以短暂地显示在浮动窗口中,称之为提醒式通知。从Android 8.0开始,需要做通道适配( 而Android8.0以下每个应用其实只有一个渠道)。创建通道的时机应尽可能早,在各渠道sdk初始化成功之前创建对应的通道。使用NotificationCompat.Builder作为通知构造器,他是兼容低版本的,但是如果低版本不支持某个api,则会出现空操作。(原创 2021-04-11 22:38:43 · 898 阅读 · 0 评论 -
Android Studio配置复用
前言经常要用别人的Android Studio,但是每个人的开发习惯不一样,有人之前一直用Eclipse,有人之前一直用Visual Studio,快捷键不一样,所以要设置Android Studio,最好每个人都备份一下配置文件,打个压缩包,出差在外也好,和同事协同也好,复制粘贴省了不少事。个人习惯记录Settings->KeyMap->Eclipse快捷键用习惯了,比如Ctrl+D删除一行、Alt加↑往上移动一行、Alt+←游标返回上一步操作的地方、Ctrl+G检索用到的地方原创 2021-01-25 17:15:01 · 440 阅读 · 1 评论 -
composingBuild依赖统一管理实践
前言接上文buildSrc使用,依赖统一管理,这次是用的自定义plugin实现的。和buildSrc差不多,又有细微差别新建versionPlugin文件把文件拷贝进去关于VersionConfigPluginVersionConfigPlugin就是我们自定义的plugin了,精简一点就直接实现就行了class VersionConfigPlugin : Plugin<Project> { override fun apply(project: Project) {原创 2021-01-22 17:59:29 · 1662 阅读 · 1 评论 -
buildSrc使用,依赖统一管理
前言之前我写过一篇全局统一配置文件config.gradle,把当时开发用到的一些类库还有版本号抽出来,放到工程目录下config.gradle文件下,moudle目录的gradle中设置引用就行了。记得当时还是用support包,现在开始用kotlin开发了,所以准备换成buildSrc。项目根目录下新建一个名为 buildSrc 的文件夹注意:名字必须是 buildSrc,因为运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录原创 2021-01-20 16:49:30 · 9246 阅读 · 6 评论 -
gradle常见的问题记录
前言比较神奇啊,经常会遇到gradle的问题,记录一下,方便查阅。场景张三从GitHub上拉了一个项目,瞅了一眼,C:\Users\Administrator.gradle\wrapper\dists目录发现没有gradle-5.6.4-all文件夹,但是有gradle-6.1.1-all文件,新项目要用5.6.4,张三无语了,他直接打开项目,发现报错了:Error:Failed to open zip file. Gradle’s dependency cache may be corrupt原创 2021-01-15 09:17:06 · 2809 阅读 · 0 评论 -
Android基础知识梳理
文章目录系统架构应用层应用框架层系统运行库层硬件抽象层(HAL)Linux内核层补充通信方式BinderIPC原理Binder原理Sockethandler主线程中子线程中Android类加载器Service类型前台服务后台服务绑定服务与服务有关的常用方法及作用(涉及Context类和Service类)生命周期手动调用Context#startService()开启服务手动调用Context#stopService()关闭服务手动调用Context#bindService()手动调Context#unbin原创 2020-07-09 16:30:01 · 13090 阅读 · 1 评论 -
apk解包修改后重新打包
准备工作需要用到如下工具baksmali:把dex文件转换成smali文件的工具。smali:把smali文件转换成为dex文件的工具。smali下载链接1. 使用apktool解包可以见我之前一篇:apktool,dex2jar,jd-gui简单使用以HelloWorld.apk包为例,先解包修改源码或者替换资源需要了解一点smali文件知识。重新打包//打包成功会在[路径]所在文件夹下新建dist文件,生成apkapktool b [路径]以HelloWorld.ap原创 2020-07-09 15:03:22 · 4967 阅读 · 0 评论 -
apktool,dex2jar,jd-gui简单使用
Android反编译练习使用的三个软件都是免费的,下载地址Google一下也能轻易的搜到apktool下载地址dex2jar下载地址jd-gui下载地址dex2jar在sourceforge上面,建议代理开全局访问先apktool,运行apktool是需要Java环境的,不多说。我是windows环境,apktool_2.3.3.jar因为我网有点问题,自己弄了一个bat文件,以我使用的apktool_2.3.3.jar为例子@echo offif "%PATH_BASE%" == "原创 2020-07-08 17:29:58 · 1684 阅读 · 0 评论 -
WebView使用心得
文章目录基本设置Android调用JS代码通过WebView的loadUrl()例1:调用网页端写好的方法例2:调用在客户端写的方法(网页端没有)通过WebView的evaluateJavascript()2个方法对比JS通过WebView调用 Android 代码1. 通过对象映射例子2. 拦截url示例3. 拦截JS对话框上述3方法对比补充知识点WebViewClientWebChromeClient关于在js中打印日志,java中获取打印信息以及提示、打印回调跨域参考文章基本设置WebView可原创 2020-06-28 15:48:08 · 489 阅读 · 0 评论 -
关于NDK如何生成so文件
准备工作由于ndk版本和IDE的版本可能存在不一致性,所以编译时会检查ndk的过时性,这个时候如果报警了,可以在gradle.properties文件下添加一行:## 随着gradle版本的升级,这条设置被废弃了,也就是说高版本gradle里就算设置了下面这句,也会被移除android.useDeprecatedNdk=true配置环境变量,方便通过命令提示行,在任意地方使用ndk命令linux不用配置环境,Windows需要在环境变量里找到Paht,添加ndk根目录地址路径。ndk下到哪原创 2020-06-10 16:34:05 · 975 阅读 · 0 评论 -
使用Edittext和greenDao实现模糊检索更新列表
前言需要做一个根据Edittext文本变化模糊查询本地数据库,并更新列表的需求。要求一:触摸键盘和Edittext外部的时候隐藏键盘。要求二:默认Edittext图标居中,点击获取焦点之后图标居左,点击软键盘搜索按钮是去焦点,图标居中。思考可能用到的知识点Edittext添加文本变化监听addTextChangedListenerActivity的dispatchTouchEvent方法里记录当前坐标和获取焦点的View的关系,由此判断出是否要隐藏输入法。自定义Edittext并重写on原创 2020-05-22 11:45:30 · 355 阅读 · 0 评论 -
greendao使用记录
简介greenDAO是Android的对象/关系映射(ORM)工具。 它为关系数据库SQLite提供了一个面向对象的接口。像greenDAO一类的ORM工具为你做很多重复性的任务,提供简单的数据接口。添加依赖工程目录下build.gradlebuildscript { repositories { mavenCentral() } dependencies { classpath 'org.greenrobot:greendao-grad原创 2020-05-22 11:23:23 · 433 阅读 · 2 评论 -
Android应用中预览pdf
前言我前面写过一篇文章:系统下载管理器下载pdf。下载完弹出选择打开方式弹框。但是我需要的是在应用内预览,所以这种方式pass。思考IOS的同事使用WebView直接加载PDF的Url就实现了这个功能。Android的WebView和IOS的实现不一样,不能直接通过远程文件Url实现预览。但是可以另辟蹊径:使用如谷歌文档服务或者mozilla的文档服务(操作Url,拼接字符串)直接使用一些第三方的自定义控件,实现方式基本是将pdf下载到本地,解析之后显示出来。这里列举几个:AndroidP原创 2020-05-21 14:48:38 · 4386 阅读 · 5 评论 -
Android使用系统自带下载器
前言工作中遇到一个功能,下载pdf到本地缓存。下载到的路径为缓存路径,随时可能被清。但是调系统管理器下载完后会弹出选择打开方式弹框,比如QQ pdf查看器,他里面就有另存为和分享的按钮,所以问题不大。在配置文件添加权限<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORA原创 2020-05-20 11:41:44 · 2059 阅读 · 0 评论 -
Android中字符串资源使用记录
使用占位符(Context类getString(@StringRes int resId, Object… formatArgs)的使用) %1$s表示替换的为String类型; %1$d表示替换的为int类型; 数字表示替换字符串中要替换的位置,若一个字符串要替换两个int类型,在替换位置分别写%1$d和%2$d; %s 、%d为缩写方式,只替换一个位置,可以这么写;例子//string.xml定义<string name="remove_family_sure">确定原创 2020-05-20 11:10:27 · 311 阅读 · 0 评论 -
Android图片选择器PhotoPicker
android图片选择器,适配Android11文件权限原创 2020-04-30 12:07:39 · 7450 阅读 · 4 评论 -
Android自定义View之年度账单曲线图
前言一说到折线图曲线图,我马上就想到了GitHub上的MPAndroidChart,扩展功能强大,本来想用,不过我转念一想,就一个年度账单,自己写不是几百行代码就搞定了?于是我开始了。先看一下设计图思考先考虑需要几种画笔Paint:曲线、字体、网格、背景色、详情背景色再考虑几个重要的变量:折线单位高度差、横向和纵向Item的高宽度、当年的最高用量、当年的最低用量需要确定的数据源:当前...原创 2020-03-31 10:07:06 · 590 阅读 · 0 评论 -
databinding实践
前言依稀还记得4年前刚入门的时候,每次写代码都是通过findViewById去拿到控件,然后使用控件。工作1年后,我发现了jakewharton大神的butterknife,然后开始使用资源绑定,那时候为了方便,我在Settings的Plugin里找到了Zelezny插件,控件的拿取都是一键生成的。美滋滋的使用了几年后,我发现了databinding这个东西。讲道理,我一直很反感各种命名各种找...原创 2020-03-04 11:15:49 · 279 阅读 · 0 评论 -
Android中so文件加载问题
前言-现在市面主流的手机架构x86/x86_64:这种架构手机包含由Intel提供的指令集转码工具,实现了对arm的兼容,使用这种架构的手机市场占有率很低。mips/mips64:极少手机使用这种架构,有兴趣可以自行百度。armeabi ARM v5:相当老旧的版本,缺少对浮点数计算的硬件支持,需要大量计算时有性能瓶颈。armeabi-v7a ARM v7:现在市面上主流版本,比如骁龙、...原创 2019-12-23 16:35:25 · 1199 阅读 · 0 评论 -
UncaughtExceptionHandler使用
使用场景同步数据库时,有些特定的情况导致线程停止,但数据库数据还没有同步完,可以再重新打开线程,再同步完剩下的数据。移动端安卓客户端,不想接入如Bugly或者啄木鸟这种功能完善的第三方SDK,而只是想普通记录应用奔溃时候的日志。其他种种情况测试人员告诉我,有一些难以复现的bug,可不可以加个日志记录,那好吧,反正也是小项目,不接第三方,自己写好了。思路我准备在工程类Applic...原创 2019-12-11 17:40:19 · 392 阅读 · 1 评论 -
一个最简单的屏幕触摸动作,理解事件分发中的3个方法
前言android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件。一次屏幕触摸会发生什么?触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE…->ACTION_MOVE->ACTION_UP。到底有多少个MOVE呢?我也不知道,我写demo测试的时...原创 2019-12-05 17:23:07 · 738 阅读 · 0 评论 -
okhttp报错:java.lang.IllegalStateException: closed
今天调用接口的时候报错了,java.lang.IllegalStateException: closed打断点调试发现运行都没什么问题,就是返回onError,后来发现是我callback里面response.body().string()调用了2次以上。分析OkHttp请求回调中response.body().string()只能有效调用一次在调用了response.body()....原创 2017-11-16 14:26:35 · 664 阅读 · 0 评论 -
project下build.gradle文件和module下buil.gradle
前言自己写了几个gradle文件模板,如果还在使用Support包开发的可以参考。定义一个全局统一配置文件config.gradleProject目录下的config.gradle/** * 全局统一配置文件 */ext { //true 每个业务Module可以单独开发 //false 每个业务Module以lib的方式运行 //修改之...原创 2017-10-27 14:09:04 · 3884 阅读 · 0 评论 -
某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作等。
转自:http://blog.youkuaiyun.com/u012416928/article/details/47356887 使用Android studio打包应用程序出现如下错误:注: 某些输入文件使用或覆盖了已过时的 API。 注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。 注: 某些输入文件使用了未经检查或不安全的操作。 注: 有关详细信息, 请使用 -Xl原创 2017-08-10 14:14:25 · 7240 阅读 · 0 评论 -
Gradle tasks Error:Error:java.lang.NullPointerException (no error message)
今天遇到一个问题,电脑突然关机了,然后重启电脑打开Android studio时,运行程序跑不起来,然后报Gradle tasks Error:Error:java.lang.NullPointerException (no error message)错误,clean,rebuild的都没有用。问题解决:删除工程目录下.gradle文件,重启Android Studio。思考...原创 2017-08-09 17:28:23 · 916 阅读 · 0 评论 -
java.lang.SecurityException: No permission to write APN settings问题的定位小结
今天遇到一个问题app发生错误:Writing exception to parceljava.lang.SecurityException: No permission to write APN settings: Neither user 10103 nor current process has android.permission.WRITE_APN_SETTINGS....原创 2017-07-12 15:44:57 · 4238 阅读 · 0 评论 -
2种自定义dialog实现自定义布局的思考
1.第一种,使用静态Builder,返回一个dialog,有一点不足我发现不能实现点击之后的dialog的dismiss,很神奇,先贴上我的代码 final TimesDialog.Builder builder = new TimesDialog.Builder(Fragment_MyHomeNew.this.getContext());原创 2018-01-22 15:48:49 · 379 阅读 · 0 评论 -
IWXAPI的使用,发布分享和支付
先贴微信文档的地址吧,一切照着文档来https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2再记录一下我是怎么做的首先是在application类里面定义,我继承Application的类叫ApplicationXpClientpublic static IWXAPI MSGA...原创 2017-12-04 15:55:42 · 5676 阅读 · 1 评论 -
使用手机本地sqlite数据库存一些类
前言最近工作需要,把用户检测的一些数据存到本地,将数据保存到历史记录里,用户可以选择自己满意的数据上传云端,话不多说直接贴代码。package cp.sample.com.fetalheartmonitor_demo.db;import android.content.ContentValues;import android.content.Context;import an...原创 2017-11-24 15:48:45 · 576 阅读 · 0 评论 -
一些过滤字符串的正则表达式
前言工作中常用的一些字符串过滤/** * 工具类,判断string是否合法 */public class StringUtil { /** * 手机号 * 有个简单的:^(1)\\d{10}$ */ private static Pattern PATTERN_ISMOBILE = Pattern.compile("^((13[0-...原创 2017-11-17 14:47:51 · 3386 阅读 · 0 评论 -
使用Espresso写测试案例
在Android开发中,测试是一个很少被提及的话题。在早期,Android并没有一个很好 的测试框架,你也很难找到一个测试全面的优秀开源项目。随着Android社区的成熟,出现了诸如Robotium,Robolectric等的 优秀测试框架。而Google也推出了自己的UI测试框架Espresso。 1.build.gradle中配置Espressoapply plugin: 'c...原创 2017-07-20 13:42:14 · 611 阅读 · 0 评论 -
SharedPreferences 存储实体类
首先SharedPreferences 存取的实体类不能太大,太大的还是建议存数据库。一般存取的实体类是用户喜好的封装类。实现代码 /** * 存放实体类以及任意类型 * @param context 上下文对象 * @param key * @param obj */ public static void putBean(Con...原创 2017-11-17 14:25:09 · 1246 阅读 · 0 评论 -
startActivityForResult理解笔记
今天进一步理解了startActivityForResult(Intentintent, int requestCode);onActivityResult(int requestCode, int resultCode,Intentdata);和setResult(int resultCode,Intentdata);主要2点,怎么用和调用谁的。1.一个activity调用star...原创 2017-10-25 16:54:30 · 268 阅读 · 0 评论