Activity调用外部为WebView设值不成功问题解决

简单的Android保存恢复数据,有很多app没有做到。如之前提到的知名APP掘金v3.1.1,以及朋友公司的书香云集v5.40.1,基本每去一家公司都会要为公司产品检查修改此类问题。本以为自己是这方面的老司机,没想到最近同事反馈上来又有此类问题发生,而这次的问题却是与我有关。
16年9月开始负责重构马上金融2.0,其中一项重要功能是hybrid资料表单以适应风控频繁变化的需求。采用jsbridge动态写入js解决js与native相互调用的安全性,此次按下不表。问题发生在表单中js调用android访问联系人,获取联系人数据调用js设置时不成功

原因

还原代码
MainActivity implements RestoreActivityResultCallback

Read More

如何主动PUSH SDK更新给开发者

之前苹果禁用jspatch时,涉及到的SDK全部需要更新。此时开发者得全面排查所使用SDK是否需要更新。怎么查?一个一个去SDK官网查看是否有更新解决方案。啰嗦,实现上就是想维护Github上面可怜的Star,所以想利用Github的开放api更新了SDK给他们发个邮件

1、查询Star的api
文档:https://developer.github.com/v3/activity/starring/
调用:https://api.github.com/repos/2tu/fit/stargazers
发现只有user,没有其邮箱

2、查询用户信息
文档:https://developer.github.com/v3/users/
调用:https://api.github.com/users/2tu
发现并没有想要的email,提示如下:
Note: The returned email is the user’s publicly visible email address (or null if the user has not specified a public email address in their profile). The publicly visible email address only displays for authenticated API users.
只能显示用户自己的email,虽然可以通过爬虫直接爬取,但是不正当,该想法搁置

一个万能算法压缩所有图片?

图片越来越多,相素越来越高,导致越来越大的图片必然绕不开压缩。
作为基础功能的图片压缩,本身问题却很多。如:

  • android压缩下来比iOS大,质量却低
  • h5压缩图片导致崩溃
  • 微信号每天上传图片限制10w张
  • 压缩后图片变形、不清晰
    各路大神提供了诸多解决方案,
    解决质量速度问题的libjpeg-turbo,android7.0之后也采用该库;
    解决裁剪问题的uCrop
    压缩策略Luban
    压缩质量、裁剪技术方案都是无需质疑选型使用就好。那么压缩策略呢?
    Luban(鲁班) —— Android图片压缩工具,仿微信朋友圈压缩策略。Luban可能是最接近微信朋友圈的图片压缩算法,有微信强大的用户量背书,我们是否可以在项目中直接使用该策略呢?
    答案是NO
    压缩策略其实与业务需求关系非常紧密。比如聊天时、展示文章等这个算法都特别合适,一般情况下该算法压缩出来的图片不大且可以被用户清晰辨识,如果看不清楚,可以点击下载查看原图。但是如果是拍证件,如身份证、银行卡这种就不需要。
    废话太多,写不下去了。总之,没有万能算法,要做的是分析自己的业务应用场景。

Android正确获取IP及MAC

每个产品都会统计用户终端信息。稍不注意就会经我们的手造成公司得到的数据错误,造成分析甚至战略错误。(假装是程序猿缔造了世界)

设备:Oppo R9s、vivo X9
系统:Android 6.0.2
网络:4G
错误IP和MAC分别为


fe80::188c:24ff:fe49:8e54%dummy0
02:00:00:00:00:00

错误代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String getLocalIpAddress() {
try {
for (
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
networkInterfaces.hasMoreElements(); ) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
for (Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
inetAddresses.hasMoreElements(); ) {
InetAddress inetAddress = inetAddresses.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ipAddress = inetAddress.getHostAddress().toUpperCase();
return ipAddress;
}
}
}
} catch (SocketException e) {
}
return null;
}

然后根据搜索结果认为,直接将“%dummy0%2”去掉结果即为ipv6地址。不管你信不信反正当时我是信了,后来脑海里有一个声音时不时告诉我这不对,世界不是这样的。(程序猿后遗症)

Read More

use RestTemplate in Spring

Spring中提供RestTemplate方便访问Web服务,不再需要使用HttpClient、HttpComponents等

差异

使用方式详细见api,唯一注意区别参数uriVariables,遵循RESTful风格为uri变量,如:https://api.github.com/users/2tu
可以写成

restTemplate.getForObject("https://api.github.com/users/{userName}", String.class, "2tu");  
Map<String, String> uriVariables = Collections.singletonMap("userName", "2tu"); 
restTemplate.getForObject("https://api.github.com/users/{userName}", String.class, uriVariables);
注:SpringBoot默认采用jackson

参考:
Consuming a RESTful Web Service
RestTemplate API

android数据共享,Application\Singleton存储数据出错的问题

两天终于完成了某模块的数据共享问题的改造。此次问题就是传说中万恶的Application及Sigleton存数据的问题。
曾经有大拿老张疑惑说Android怎么可能没有一个安全的临时存储数据的地方。接下来我们看一下在本次应用中实际发生的问题。并查看解决知名app掘金v3.1.1出现的这个问题
采用官方提供api机制来解决问题。

一、问题

应用切换到后台返回程序Crash或数据丢失。甚至在小内存手机中调用系统相机再回来应用就已经重启了

二、解决办法

采用Intent及setArgments的方式来传值,采用onSaveInstanceState保存数据以供恢复。

Activity中Fragment恢复

Read More

使用AndroidStudio开发JNI并开启Native Debugger

不使用eclipse开发JNI,使用谷歌亲儿子AndroidStudio,并开启Native Debugger

一、创建JNI工程

1、android.useDeprecatedNdk=true

在gradle.properties中添加“android.useDeprecatedNdk=true”,否则会报
”Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.“

2、创建CLog类

添加native方法
public static native void i();

3、采用javah使用生成头文件

创建JNI目录

Read More

TV Apps Checklist

最近开发一款定制运行于Letv的 TV应用(流云TV),主要用于数据报表展示及小部份交互。本文主要参考于电视猫、VST两款应用,适配小米电视及乐视。

SDK版本及分辨率

国内目前的电视都是从4.x的Phone SDK修改,所以我们的适配如下表

应用 minSdkVersion targetVersion 分辨率
电视猫 8 16 1280*720
VST 15 19 1920*1080
流云TV 14 19 1920*1080(xxhdpi)

Read More