学习,默认

获取状态栏高度

其实这个方法我是今天才知道的…

之前的应用场景也不多,也没有专门的需求。用法大概就是在fitwindows的时候,拿到状态栏高度,把布局往下推这个高度就可以了。

/**
 * 获取状态栏的高度
 *
 * @param context 上下文
 * @return 状态栏高度
 */
public static int getStatusBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources()
            .getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

另外获取系统toolbar的高度

    /**
     * 获取ToolBar的高度
     *
     * @param context
     * @return
     */
    public static int getToolbarHeight(Context context) {
        final TypedArray styledAttributes = context.getTheme()
                .obtainStyledAttributes(new int[]{R.attr.actionBarSize});
        int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
        styledAttributes.recycle();
        return toolbarHeight;
    }

垃圾佬的自我救赎——闻上刷U-NAS系统

这个东西怎么说呢,如果你之前有的话说明你可能是个爱好者。如果你最近淘到了,说明你还是有这方面兴趣或者你纯粹喜欢捡垃圾。我是后者,150块捡了个垃圾。京东上600大洋卖了个6T的硬盘,这个定制的cpu加上这个现在看也不算太丑的机箱,对于我这种垃圾佬来说简直不要太完美。

教程:

  1. 下载镜像 ,下载之后解压
  2. 下载win32diskimager,将1中下载的镜像写入空U盘
  3. 关掉闻上云管家,插入U盘,开机。
  4. 等待,LED灯为(长亮3秒左右 - 快速闪烁 - 长亮),等到LED等再次长亮时,直接断电,拔出U盘,重新开机,等待2-5分钟

教程中用到的下载链接:

win32diskmager:https://share.weiyun.com/5fW8Ab0

U-NAS镜像: https://share.weiyun.com/53FJPwx

回复官方镜像地址(密码全为pypy):

无成本搭建谷歌镜像

  1. 注册登录https://runkit.com/home
  2. 任意新建项目
  3. 输入以下命令

var express = require('express');
var proxy = require('http-proxy-middleware');
var app = express();
app.use('/', proxy({target: 'https://www.google.com/', changeOrigin: true}));
app.listen(3000);

最后,点击endpoint即可

初始OpenCV

之前看了一下OpenCV的书,但是一直没有笔记。这次来简单写一下自己学到的东西。看书的时候面向对象有“想自我提升的中高级程序员”,好吧,那我就暂时把自己定位高级程序员吧。

认识OpenCV

简单来说,OpenCV就是个库。

OpenCV的意思是计算机开源视觉库(Open Source Computer Library),我们常说的OpenCV分为正式发布版本和扩展模块,现在发布的OpenCV正式版本中核心模块大概有:

二维与三维特征工具箱、运动估算、人脸识别、姿势识别、人机交互、运动理解、对象检测 、移动机器人 、分割与识别、视频分析、运动跟踪、图像处理、深度神经网络

注意:在核心模块中的持久性(在XML,YAML或JSON中存储和加载结构化数据)已在C ++中完全重新实现,并且也丢失了C API。

到这里就应该知道,OpenCV是一个通过JNI调用的有C/C++写的代码库,并不是由JAVA代码完成的。我们可以通过下面的链接进行下载OpenCV4Android:

https://opencv.org/releases.html

下载完成之后解压文件,解压所得文件夹中有SDK文件夹,SDK文件夹结构大概为下图:

其中,etc文件夹下为训练好的LBP和HAAR数据;java下是android sdk相关文件;native里面则是基于C/C++编译好的OpenCV Android平台支持的本地库文件,JNI层开发所需要的头文件及cmake文件,其中库文件大多数是以.a和.so后缀的文件。

在和SDK统同级的文件中有一个samples文件夹,这个文件为OpenCV的一些使用提供了Android的例子,可以参考一下。注意:需要安装NDK,如果没有安装系统会提示你安装,在安装NDK时会有链接reset或者链接不到的问题,请自行百度解决,不再赘述。

最后需要知道的是,OpenCV4Android(OpenCV Android)版本和OpenCV对应发布的版本是完全一样的,只是调用需要切换成Java语言。

开始使用OpenCV

使用方法和我们平常使用其他SDK是一样的:

  • 选择File - New - Import Module ,然后选择之前解压出来的SDK/JAVA文件夹,系统会自动显示OpenCV版本信息
  • 打开Project Structure添加依赖
  • 复制native/libs下的所有文件到app/libs下,如果找不到app/libs文件夹,请将Android视图切换为Project视图。然后删除所有.a后缀的文件。
  • minSDKVersion改为14
  • 在module:app对应的build.gradle脚本中添加以下内容

task nativeLibsToJar(type: Jar, description:'create a jar archive of the native libs') {
 destinationDir file("$buildDir/native­libs")
 baseName 'native­libs'
 from fileTree(dir: 'libs', include: '**/*.so')
 into 'lib/'
}
tasks.withType(JavaCompile) {
 compileTask ­> compileTask.dependsOn(nativeLibsToJar)
}

  • 然后在编译片段添加:

implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')

至此导入结束,下篇文章为测试是否导入成功和其简单的应用。

有条件的可以系统地学习一下这一块,或者你可以点击这个链接在线学习:https://www.w3cschool.cn/opencv/opencv-5tpl28xc.html

Android储存优化

一.储存方式

首先我们来说一下Android的储存方式

  1. SharedPreference
    一个轻量级的储存类,使用xml将信息存在/data/data/package name/shared_prefs/ 目录下。

  2. SQLite
    一个轻量级数据库。

  3. File
    通用的IO储存,用于较大体积的数据的储存,缺点很多。增删改都比较麻烦。

  4. ContentProvider
    应用间通信。Android中为了数据安全,APP之间不能直接相互访问,这时就可以通过Content Provider对外公开一个URI来进行数据提供。其他应用可以通过Content Provider传入这个URI来对数据进行操作。

储存方式分析

关于Android的网络

我貌似很少遇到过网络访问的问题。大概原因我觉得无非两点:1.我只是混在Android网络访问的表层,并没有想法去深入研究其深层的东西。2.Android的网络这一块内容根本就不多,没有深层的东西。

显然我是第一种。

偶尔遇到些小问题全都是通过静态流和谷歌搜索解决的。我能感觉这一块自己完全就是个渣渣…所以我不断用“每个人都有垃圾的地方”来安慰自己,但是不得不说AndroidNet这一块是一大块,也是值得单独学习的一块。所以接下来的时间我可能要专心看一下这一块的东西了。

Android 内存空间优化

在解决OOM之前,先学习一下避免OOM吧。

在解决这些问题的时候经常会有一个现实的问题,就是无论什么方法,都需要找到一个平衡点。这是这些绝对存在的编程方法的乐趣所在。说明白一点就是小的时候班里学习好的同学(我)能用五种方法解出一道数学题,我们需要在这五种方法中间做比较。不同的是编程这道题的数据是可变的,所以最优解可能也是可变的。

编程的乐趣就在这里

阅读全文»

apk大小优化

我们的安装包只有4m,经过张哥一个月的优化,体积成功到达了6m…

一.Android安装包的构成

  • assets:资源文件,配置文件等不需要编译的文件
  • ib:native库文件
  • res:res就是resource的缩写,主要存放需要生成对应ID来使用的资源文件
  • META-INF文件:用来校验APK的完整性
  • AndroidManidesr.xml:理解为android程序的自我介绍文件
  • classes.dex文件:被java编译之后的类(class)文件
  • 混淆文件
  • rsources.aesc文件,记录资源文件和ID的映射关系文件

二.常用方案

1.代码混淆

2.资源优化

  • 代码混淆(ProGuard)只能对代码进行分析和优化,AndroidLint用来对资源文件进行优化,没有使用到的资源文件也可以扫描得到。
  • 单机Analyze-Run Inspection By Name-输入us或者Unused resources,点击第一个,在弹出框中选择整个项目,确认即可扫描。之后会在下方的Lint窗口中显示未应用文件和资源列表。

    AndroidLint不会分析assets文件下的资源。
    
  • 资源文件最少化:一套布局,一套图,多套dimens.xml,以及轻量级第三方库
  • 图片优化:降低图片色彩位数,使用PNG图片压缩工具

3.其他优化

避免功能重复的库

使用WebP图片格式

可以考虑插件化

我的Android刘海屏适配方法

小张感觉这个东西也没有太多可说的,毕竟按照现在的发展趋势,Android刘海屏马上要被消灭了…

1.获取状态栏高度手动往下挤布局

获取高度状态栏/工具栏高度代码:

Rect rectgle= new Rect();
Window window= getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight= rectgle.top;
int contentViewTop= 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight= contentViewTop - StatusBarHeight;

   Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); 

在Activity的onCreat中获取状态栏的高度:

public int getStatusBarHeight() {
  int result = 0;
  int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
  if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
  }
  return result;
}

google 官方提供的方法是:

DisplayCutout cutout = mContext.getDisplayCutout();

可以根据DisplayCutout来判断刘海的位置和大小,但是很不幸,Android≠安卓。在水深火热的中国安卓环境下,各家制定了自己的规则,甚至有的厂商改掉了getDisplayCutout的返回值…所以个人感觉上面的方法是目前最合适最简单的…

有个东西要说一下,如果你不按照各家的规则去说明自己适配了刘海屏,那么那家的ui会默认不把你归类到‘已适配’的分类中,需要手动在设置中开启。

2.直接用fitinwindows固定布局,这样对于首页是多tab的app很不友好,特别是在父窗口的布局设置了这个属性,会把自窗口的东西全部挤下去…还有分段式背景也会存在问题。

你可能会觉得上面的方法很垃圾…但是小张真的觉得很实用…流下了没有技术的泪水…