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

O2O收货地址管理——做一个有节操的码畜

前言

O2O的收货地址与传统电商不同,前者自动带入地区属性,所以不需要传统B2C一样选择省市区、填写详细地址及邮编。应显示标志性位置如“新干线大厦”,不是“重庆市渝中区村55号”,也不是“重庆市渝中区两路口新干线大厦“。

做产品时,通常会饱受各方质疑。这个功能不应该这样,那个功能应该那样,客户说、用户说、老板说、测试说、程序说。每个人说的都不一样,每个人都有道理。产品说好,那我改,我兼容,这样的产品永远不可能获得认可。每个人的出发点,使用场景不同,当然所要的就不同。我们所需要找的是产品的使用场景、切入点,找准这两个问题其它的一切问题自然不复存在。

用户端中两个地方显示地址

Read More

Jenkins构建Android、IOS并上传到蒲公英

前言

作为产品级的外包,常常会出现fix一个bug要更新十几甚至几十个产品(打包上传)。作为程序猿看到这种需求时,第一想法就是“是时候找办法偷懒了”。
虽然Android以前采用Ant打包构建,现在与时俱进采用Gradle打包所有产品,然后再上传。
IOS也可以采用命令行的方式做到。
但是为了实现傻瓜式,可视化,同时兼容Android、IOS的方式,采用Jenkins实现很有必要。

实现步骤

1、下载安装Jenkins
2、配置Jenkins安装插件
3、创建Job实现构建
4、上传至蒲公英

Read More

Gradle 2.4之后使用JitPack发布Github开源库

之前采用过jcenter发布,各种步骤非常麻烦。在“掘金”上看到一篇文章可采用JitPack一键发布,照着抄遇到了一点坑。待此记录。
原作者的文章地址“http://www.dss886.com/android/2015/10/17/16-23/”

一、配置并提交到Github

Gradle
To enable installing into local maven repository and JitPack you need to add the android-maven plugin.

If using Gradle 2.4 or later:
Gradle 2.4之后要添加如下配置

1) In your root build.gradle:

root/build.gradle添加

1
2
3
buildscript {   
dependencies {
classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0' // Add this line

Read More