暂时未有相关云产品技术能力~
Android方面10年以上经验,掘金平台优质作者
getExternalFilesDir对应的目录是/sdcard/Android/data/包名/files/... 可以看到它主要是用来存放应用私有的一些文件。这个目录有几个特性:
今天读代码发现一个try-catch与我们平时写的方式不太一样,如下: try (ZipFile apkFile = new ZipFile(apk)) { ... } catch (Exception e) { e.printStackTrace(); }
代码如下: return Stack( children: [ videoWidget, GestureDetector( child: Container( width: double.infinity, height: double.infinity, ), onTap: () { setState(() { showProgress = !showProgress; }); },
今天开发AIDL,新建一个接口,写了一个函数,结果build的时候报错了 Process 'command 'xxx/aidl'' finished with non-zero exit value 1 经过长时间的尝试终于搞定,期间也回顾了不少知识,一起总结一下。
在android我们可以调用系统的相机来进行照相,当然也可以设计自己的照相页面,通过surface进行预览,通过camera api来进行拍照即可。 在Android 5.0之后google推荐使用的Camera2 Api,但是由于兼容问题我们大部分还在使用Camera Api。这里我们一起简单介绍一下,仅仅是预览拍照,至于细节的设置,比如图像大小比例、对焦、图像旋转等就不一一细说了。 首先我们需要在布局中加入一个SurfaceView
大部分开发者对apk签名还停留在APK v2,对APK v3和APK v4了解很少,而且网上大部分文章讲解的含糊不清,所以根据官网文档重新整理一份。 apk签名从APK v1到APK v2改动很大,是颠覆性的,而APK v3只是对APK v2的一次升级,APK v4则是一个补充。 本篇文章主要参考Android各版本改动: developer.android.google.cn/about/versi…
大家应该发现,当使用Button相关组件的时候,如果内容是英文,无论大写还是小写字母,在显示的时候会全部自动显示为大写,这时候我们需要为Button设置一下
之前遇到一个问题,与Fragment的Pause生命周期有关,所以就研究了一下Fragment的Pause生命周期特点。就有关这篇笔记。 我们知道Fragment的生命周期是依赖Activity的,所以想探究Fragment的Pause过程需要从Activity的Pause下手。
我们为了在不同的环境使用不同的配置,所以会在gradle中添加buildtypes来区分环境,并且在下面进行不同的配置
从 Android 10 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。 而这个权限是系统权限,也就是说一般应用将无法再获取IMEI 和序列号
flutter有两种方法Offstage和Visibility可以控制widget的隐藏
在Android开发中,有时候我们需要一个动画一直循环执行下去,常见的如laoding菊花一直旋转,这时候就需要使用Animation的repeat功能
我们用android studio直接运行flutter web项目,会启动chrome来执行,这时候如果我打开开发者工具(右键-》检查),就会发现非常卡 (前提是用Html Render来渲染,用CanvasKit好像就没问题) 在console上边的操作栏上可以看到一个数字在不停的增长,这是因为console默认不显示debug日志,所以这些日志回以计数的形式显示。我们在操作栏的level中将debug选中,就会看到debug日志了。
我们在利用Flutter Web开发pc端可以访问的网站,所以会有一些关于鼠标的处理。
引入字体 首先在项目中创建fonts目录,然后将将ttf文件放到该目录下,然后在pubspec文件中添加该字体文件
动画 在flutter中,如果想让某个widget执行动画,需要用一个动画类的widget封装一下,比如一个图片
我们为了在不同的环境使用不同的配置,所以会在gradle中添加buildtypes来区分环境,并且在下面进行不同的配置
FutureBuilder 在实际开发中,进入一个页面后执行网络请求加载数据并显示是非常普遍的,这时候我们一般会显示loading直到加载完成显示正常页面。在flutter中我们可以在initState中发起异步请求,然后将请求结果赋值给data,并setState刷新页面,在build中可以这样实现
在Android中我们知道是可以设置共享元素的,这样在两个页面中相同的元素在转场时就会以一个过渡动画的形式展示,效果炫酷,用户体验上也更好。 那么在Flutter中有同样的功能么? 答案是一定的,在Flutter中它就是Hero,也是一个widget(flutter中万物皆是widget)。Hero指的是可以在路由(页面)之间“飞行”的widget。所以它实现了共享元素转换或共享元素动画的动画风格。
因为shape如果形状设为line,则是居中的,可以做分割线,但是无法做下划线。 比如我们想为TextView设置一个背景,实现下划线。 需要用layer-list,因为shape的stroke是四周描边的,这里android:left="-4dp"就是指item的drawable(就是shape)从整个画布的-4dp开始绘制, 这样其实显示在画布中的shape就没有左边了,同理,上左右都这么处理就只剩下底边,就实现了下划线效果
实现聊天列表主要依赖ListView的2个属性android:stackFromBottom和android:transcriptMode
今天运行一个项目发现运行不起来了,报错 错误: 无法访问XXX 错误的类文件: C:\Users\xxx\.gradle\caches\transforms-2\files-2.1\xxx\xxx(xxx/xxx/xxx.class) 错误的 RuntimeInvisibleParameterAnnotations 属性: xxxx 请删除该文件或确保该文件位于正确的类路径子目录中。
在代码里简单设置里一下emptyView后发现根本不显示
解决方法: 在项目的build.gradle中配置一下即可
目前各个市场都要求targetsdkversion要不低于26,也就是android 8.0。 相应的影响很多功能,比如通知。 当targetsdkversion >= 26,需要为通知添加channel
INSTALL_FAILED_DUPLICATE_PERMISSION 根据网上的结论,在android L即android 5.0之后添加一种机制,主要是针对自定义权限的: 不同签名的app种如果有同样的自定义权限,那么只能安装一个,安装第二个时就会报上面的错误。 经过测试,即使签名相同也不行,不知道是我操作的问题,还是android更高版本有了更严的机制。 总之,使用不同的自定义权限就没问题,一般自定义权限我们都会加入applicationid,即包名,这样就不会冲突
PCM是android系统中的原生音频数据,那么我们如何录制和播放这个格式的byte[]数据呢?
自定义dialog
在上一篇文章Android 12 新功能:SplashScreen优化启动体验中我们介绍了Android 12上的一个新功能SplashScreen,同时提到了Google为了兼容低版本也提供了Androidx SplashScreen compat库,但是我们在使用的过程中发现这个库在Android 12和12以下版本表现并不一致,
在Row中使用TextField出错 当我们在一个Row组件中添加一个TextField
Card Card对应Material Design中的CardView,使用很简单 Card的两个特点就是阴影和圆角。
IconButton 如果即是一个图标又想点击,那么就用这个 IconButton( icon: Icon(Icons.close), onPressed: (){ // } )
加载Theme出错 这是一篇补充文章,在做动态替换resId的过程中,我发现bag类型的ResTable_entry在使用过程中存在问题。比如style,其parent解析一直有问题
引入源码 首先,如何查看gradle源码,我们在项目里依赖com.android.tools.build:gradle即可
ThreadPoolExecutor重要参数
有时会看到别人使用bitmap是用到ARGB_8888/RGB_565这类参数,那么这些参数是什么?对bitmap有什么影响?
在flutter中显示图片的就是Image,相当于android中的ImageView,但是要比ImageView功能强大很多。 比如支持gif动图,可以加载网络图片,缓存机制,图片处理等。实际上Image基本上实现了平时我们用到的图片加载框架(如glide)的大部分功能。
我们用AS创建flutter项目时,会看到几个选项:application、module、package、plugin。
第一个区别是在对系统资源的占用上。 wait是Object类的一个函数(也就意味着所有对象都有这个函数),指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(当然这两个同时也是Object的函数)。 而sleep则是Thread类的一个函数,指线程被调用时,占着CPU不工作。此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
在dart中构造函数的名字可以是 ClassName 或者 ClassName.identifier
api关键字与旧的compile关键字完全相同。因此,如果用api替换了所有的compile,是完全ok的
查看.a文件都包含了那些文件
一直以为keep就是不要混淆,近期发现还有另外一个作用
最后一定要加上setDataPosition(0),将偏移指回最开始,这样才能正确读取数据,否则会从当前偏移读取,因为已经是最后了,所以读取的都是null
很久之前研究微信的分享sdk的时候,在缩略图这遇到了一点问题,就做了个笔记,最近才翻出来。 微信分享的缩略图要求是不大于32k,这就需要对图片进行压缩。试了几种方法,一一道来。
Xcode12界面有所改变,导致一些按钮位置变动。比如为storyboard添加组件的按钮移至如下位置:
由于很多应用在启动时需要进行一些初始化事务,导致在启动应用时有一定的空白延迟,在之前我们一般的做法是通过替换 android:windowBackground 的自定义主题,使应用启动时及时显示一张默认图片来改善启动体验。 在Android 12中,官方添加了SplashScreen API,它可为所有应用启用新的应用启动界面。新的启动界面是瞬时显示的,所以就不必再自定义android:windowBackground 了。新启动页面的样式默认是正中显示应用图标,但是允许我们自定义,以便应用能够保持其独特的品牌。下面我们来看看如何使用它。
1、创建项目 在Xocde12上我们创建swift项目的时候Interface有两种选择:SwiftUI 和 Storyboard。其中SwiftUI只支持iOS13以上的系统,所以如果需要面向iOS13以下系统则无法使用。那么只能使用Storyboard,LifeCycle使用UIKit App Delegate。但是Xocde12默认为我们创建的项目
创建一个single view app后,项目中有main.storyboard,里面是一个viewcontroller。 那么我们如何实现页面跳转 首先添加一个导航控制器Navigation Controller。点击右上的➕,然后选择控件拖到面板上即可
在xcode菜单中选择 new -> project -> single view app 点击next在弹出窗中填写项目名称 这里languge有可以选择object-c或swift作为项目语言。这里我们学习swift,所以选择swift。 如果language选择swift,下面的user interface可以选择swiftUI和storyboard。 SwiftUI是2019 年 WWDC 大会上,苹果在压轴环节向大众宣布了基于 Swift 语言构建的全新 UI 框架,与flutter类似,是用代码编写页面,支持快速预览。