标签归档:Google

Android 8更新了

获取Android O推送:

Android 8正式版已经于8月21日推出,为其新系统命名为Android Oreo(奥利奥)。但是作为Pixel 美版用户一直没有收到系统更新推送。思来想去肯定是姿势不对,什么地方有问题,果不其然,要想成为首批使用用户需要我们将设备注册加入测试版计划(开启以后接收到的是正式版推送)。如果你有google账号,想必大家都有。直接进入下面的地址进行账号登录。

登录以后在你符合的条件的设备下选择注册设备。做完这个操作我没过一分钟就收到了更细提示,而且是正式版。

不过我要说明:目前很多应用还不支持Android O,各种不舒服,黑域本想不用,但是还是用上舒服些,骚扰比较少。

Pixel黑域免ROOT安装使用说明

上周刚入手Pixel,如上个帖子所属安装应用之后首先机器开始各种不顺畅(内存基本上被占用到80%),然后电池损耗严重,6个小时没电头天晚上充满电,第二天一早闹钟都不响早没电了。其中还又一个比较严重的问题,整个手机就是个暖手宝,温度太高受不了,特别越卡的时候越崩溃。基于这些原因开始用上了黑域,整体用下来很不错,现在依旧流畅,温度也和iPhone6差不多了,一般情况下基本上没有什么发热感受。

[黑域说明]
有很多程序声称能有效阻断程序运行。但是,绝大部分要求 ROOT,或者通过 xposed / 补丁/ 解锁等方式改变系统。在厌烦不断 ROOT / 解锁之后,开发了黑域,使用一些黑科技待机(App Standby, Android 6.0引入)或者强行停止应用,防止程序持续运行。黑域不需要ROOT,也不需要改变系统。当前也有一个 ROOT 模式,但非常试验性,只能解决开机自启问题。
当前来说,通过事件智能判断您是否在使用应用,当您打开某个应用,使用完退出以后,黑域会休眠它;如果您从最近列表划掉它,黑域会强行停止它。对于任何恶意唤醒,只要您没有打开过,都将强行停止它。黑域支持 Android 5.1 到 7.1,不需要 ROOT,但是依赖“开发者选项”中的“USB调试”。本人主要在 Google Pixel 上使用。

[使用方法]
1. (手机) 打开黑域,按屏幕提示,进入“开发者选项”,开启“USB调试”
2. (电脑) 下载 ADB: https://developer.android.google.cn/studio/releases/platform-tools.html
3. (电脑) 解压,以命令行方式进入 platform-tools 目录
4. (电脑和手机) 使用 USB 连接手机与电脑,电脑命令行中输入 adb devices,手机屏幕可能会出现连接了一台新机,确认授权
5. (电脑) 电脑命令行中执行黑域提示中的那串,不出意外,到此就成功了
须知:1、未ROOT的系统搭建好电脑系统的ADB环境变量参数。2、手机驱动装好,手机连接电脑时弹出授权窗口(未弹出授权窗口,装上豌豆荚后能解决),才能成功启动黑域。3、ROOT的设备在黑域界面上连续点击返回6次可触发ROOT模式选项(无需连接电脑进行操作)。

最后也希望未来的App能够遵循Android 绿色应用公约,虽然你这只是一个开发者个人发起的项目。

Pixel上手体验

经手的android手机从小米的青春版,而后小米1代,之后涉足Google亲儿子系列Nexus 3,从此最后Android的机器我就认为要玩就玩亲儿子,当然我不是土豪也没法一出新款就剁手,所以都是借助淘宝买来体验。之后一段时间都用的挺爽,但是nexus5 出来之后,我又入手了。nexus5本来用的挺好的可是后面甩了一把之后电池就出问题了,而后经过中关村一修,就各种问题不断,最后为了拯救同事的另外一部Nexus5我依然捐献了躯体。之后买了Lumia 920,不追求拍照质量的手机不是好的体验者。后面的事情我之前写过,在一个累得半死出差归来的夜晚砸了个粉碎。在之后不知道哪根神经有问题,在买了Iphone6之后又买了Lumia 640xl。然后这个机器,一直感觉就是个Nokia E72的功能(完全当做板砖备用机),本周顺利350出掉了,作为入手了Pixel的部分资金来源。以上基本就是我的一路过手的机器了。下面言归正传说说入手pixel的感受。

刚到货用起来感觉很流畅,很舒服,毕竟断片了一段时间了(中间用着iPhone,同事挂着WP当备用),完全可以说是耳目一新,爽歪歪。接下来为了验证下性能深入体验,搭上梯子把之前Google play的所用应用装了一边,顺带几个游戏,王者毒药、乐高任务与收集、地牢猎手。等我装完这些(包括i全家桶98个应用)我想说,感觉要爆炸了,也开始卡了,拿在手上跟个暖手宝一样,电池4个小时都扛不住。然而A屏的视觉效果和拍照的性能、色彩上觉得杠杠滴,我感觉比手里的iPhone6要强很多,后面面上几张图片大家感受一下。

发热、电池损耗快,这也只能说是因为Google对于应用生态的控制上比较松,导致各个应用各种后台运行,相互唤起,节操不一。无奈只能找找看了,然后就装上了黒域,由于我买的的是美版暂时没有root,操作跟随app上面的引导就可以了,后面附上安装说明。装上之后把各应用设置起来以后,顿时感觉世界翻天覆地的变化,发热问题完美解决,电池损耗也可以一天一冲了,总体来说还是相当不错的,符合预期。

在上几张Pixel 2的图片,看起来屏幕占比要比Pixel要大很多,看起来颜值更高。

解决日文中文导出CSV文件乱码问题

乱码问题很头疼,日文的乱码问题更是头疼。按照常理来讲日本人较真工匠精神那么按理来说搜索工具类对应的日文应用问题应该能很好的搜索出来问题的解决方案。但是结果让人惊讶,日文应用乱码的问题搜索结果出来最多的是英文和中文,最后才是日文。打开日文的文章一看,大跌眼镜,简简单单的把最基础的测试用例一COPY算是完事了,完全对不起他们的民族精神。再回过头来说问题,日文导出CSV有两个问题需要解决:

对于上述两个问题都归咎于字符集的问题。解决好了字符集的问题,以上的问题迎刃而解。另外一个问题则是引入UTF-8时候BOM的问题。好在这里顺带补一下BOM的知识。
BOM(英语:byte-order mark)字节顺序标记:是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。BOM也是Unicode标准的一部分,有它特定的适用范围。通常BOM是用来标示Unicode纯文本字节流的,用来提供一种方便的方法让文本处理程序识别读入的.txt文件是哪个Unicode编码(UTF-8,UTF-16BE,UTF-16LE)。Windows相对对BOM处理比较好,是因为Windows把Unicode识别代码集成进了API里,主要是CreateFile()。打开文本文件时它会自动识别并剔除BOM。Windows用这个有历史原因,因为它最初脱胎于多代码页的环境。而引入Unicode时Windows的设计者又希望能在用户不注意的情况下同时兼容Unicode和非Unicode(Multiple byte)文本文件,就只能借助这种小trick了。相比之下,Linux这样的系统在多locale的环境中浸染的时间比较短,再加上社区本身也有足够的动力轻装前进(吐槽:微软对兼容性的要求确实是到了非常偏执的地步,任何一点破坏兼容性的做法都不允许,以至于很多时候是自己绑住自己的双手),所以干脆一步到位进入UTF-8。


了解完了BOM,咱们回归正题,看看日文、中文乱码怎么解决:
在这里,由于考虑到可能是jar的支持问题,我尝试了两个开源的组件:分别是opencsvsupercsv

[xml]
<dependency>
<groupId>au.com.bytecode</groupId>
<artifactId>opencsv</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>net.sf.supercsv</groupId>
<artifactId>super-csv</artifactId>
<version>2.4.0</version>
</dependency>
[/xml]

具体的实现咱们看下代码:

[java]
package com.yneit.test;

import au.com.bytecode.opencsv.CSVWriter;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.supercsv.cellprocessor.FmtBool;
import org.supercsv.cellprocessor.FmtDate;
import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.constraint.LMinMax;
import org.supercsv.cellprocessor.constraint.NotNull;
import org.supercsv.cellprocessor.constraint.UniqueHashCode;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvListWriter;
import org.supercsv.io.ICsvListWriter;
import org.supercsv.prefs.CsvPreference;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

/**
* CSV 日文乱码解决
* Created by 还在路上 on 2016/12/6.
*/
public class Test {

//日文字使用符集
public static String UTF_16LE = "UTF-16LE";
public static String UTF_8 = "UTF-8";

public static void main(String[] args) throws IOException {
String path = "G:\\Project_Java\\MyProject\\src\\com\\yneit\\work\\test.csv";
String encoder = UTF_8;

OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path), encoder);
out.write(0xFEFF);
CSVWriter writer = new CSVWriter(out, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);

String[] entries = {"1", "fir", "リージョン", "6", "人民", "ond,政府\"ird"};
String[] datas = new String[entries.length];
for (int i = 0; i < entries.length; i++) {
String item = verityCell(entries[i]);
datas[i] = item;
}

writer.writeNext(datas);
writer.close();

System.out.println("over");

try {
writeWithCsvListWriter();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Sets up the processors used for the examples. There are 10 CSV columns, so 10 processors are defined. All values
* are converted to Strings before writing (there’s no need to convert them), and null values will be written as
* empty columns (no need to convert them to "").
*
* @return the cell processors
*/
private static CellProcessor[] getProcessors() {

final CellProcessor[] processors = new CellProcessor[]{
new UniqueHashCode(), // customerNo (must be unique)
new NotNull(), // firstName
new NotNull(), // lastName
new FmtDate("dd/MM/yyyy"), // birthDate
new NotNull(), // mailingAddress
new Optional(new FmtBool("Y", "N")), // married
new Optional(), // numberOfKids
new NotNull(), // favouriteQuote
new NotNull(), // email
new LMinMax(0L, LMinMax.MAX_LONG) // loyaltyPoints
};

return processors;
}

/**
* An example of reading using CsvListWriter.
*/
private static void writeWithCsvListWriter() throws Exception {

// create the customer Lists (CsvListWriter also accepts arrays!)
final List<Object> john = Arrays.asList(new Object[]{"1", "リージョン", "リー",
new GregorianCalendar(1945, Calendar.JUNE, 13).getTime(),
"1600 リー Parkway\nz中国现实 View, CA 94043\nUnited States", null, null,
"\"May the Force リー with you.\" – Star Wars", "jdunbar@gmail.com", 0L});

final List<Object> bob = Arrays.asList(new Object[]{"2", "Bob", "Down",
new GregorianCalendar(1919, Calendar.FEBRUARY, 25).getTime(),
"1601 Willow Rd.\nリー Park, CA 94025\nUnited States", true, 0,
"\"Frankly, my dear, I don’t give a damn.\" – Gone With The Wind", "天朝@hotmail.com", 123456L});

ICsvListWriter listWriter = null;
try {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("G:\\Project_Java\\MyProject\\src\\com\\yneit\\work\\writeWithCsvListWriter.csv"), Charset.forName(UTF_8));
out.write(‘\uFEFF’);
listWriter = new CsvListWriter(out, CsvPreference.STANDARD_PREFERENCE);

final CellProcessor[] processors = getProcessors();
final String[] header = new String[]{"customerNo", "firstName", "lastName", "birthDate",
"mailingAddress", "married", "numberOfKids", "favouriteQuote", "email", "loyaltyPoints"};

// write the header
listWriter.writeHeader(header);

// write the customer lists
listWriter.write(john, processors);
listWriter.write(bob, processors);

} finally {
if (listWriter != null) {
listWriter.close();
}
}
}

public static String verityCell(String content) {
if (content == null) {
return "";
}

if (NumberUtils.isNumber(content) && content.length() > 0) {
content = "\t" + content;
}

if (content.indexOf(CSVWriter.DEFAULT_QUOTE_CHARACTER) > -1 || content.indexOf(CSVWriter.DEFAULT_SEPARATOR) > -1) {
content = StringUtils.replace(content, String.valueOf(CSVWriter.DEFAULT_QUOTE_CHARACTER), "" + CSVWriter.DEFAULT_QUOTE_CHARACTER + CSVWriter.DEFAULT_QUOTE_CHARACTER);
content = CSVWriter.DEFAULT_QUOTE_CHARACTER + content + CSVWriter.DEFAULT_QUOTE_CHARACTER;
} else {
content = CSVWriter.DEFAULT_QUOTE_CHARACTER + content + CSVWriter.DEFAULT_QUOTE_CHARACTER;
}
return content;
}
}

[/java]

参考链接:
CSV 乱码 处理
http://super-csv.github.io/super-csv/index.html
http://stackoverflow.com/questions/32072017/write-utf-8-bom-with-supercsv
https://www.zhihu.com/question/20167122/answer/14199022