0%

前言:在最近的工作中涉及到从u盘拷贝大量数据到车机,偶尔有失效的情况,后面发现是sdcard存储空间不足,因此想在代码中展示出当前系统分区.查看系统分区在adb中为adb shell df

我们用如下方法可执行任意的adb shell命令,在此仅用”df”举例
  • 代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
private String[] doRuntimeCmmd(String command) {
Log.d(TAG, "doRuntimeCmmd:" + command);
Process process = null;
BufferedReader mOutReader = null;
BufferedReader mErrorReader = null;
try {
process = Runtime.getRuntime().exec(command);
Log.d(TAG, "process exec: " + process);

mOutReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
int mOutread;
char[] outBuffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((mOutread = mOutReader.read(outBuffer)) > 0) {
output.append(outBuffer, 0, mOutread);
}
mErrorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
int mErrorread;
char[] errorBuffer = new char[4096];
StringBuffer error = new StringBuffer();
while ((mErrorread = mErrorReader.read(errorBuffer)) > 0) {
error.append(errorBuffer, 0, mErrorread);
}

process.waitFor();
String[] mResult = { output.toString(), error.toString() };
Log.d(TAG, command +" Result:" + mResult[0]);
Log.d(TAG, command+ " Error:" + mResult[1]);
return mResult;
} catch (Exception e) {
e.printStackTrace();
String[] mResult = { "error", "error" };
Log.d(TAG, command + " Result = " + mResult[0] + " Error = " + mResult[1]);
return mResult;
} finally {
try {
if (mOutReader != null) {
mOutReader.close();
}
if (mErrorReader != null) {
mErrorReader.close();
}
if (process != null) {
Log.d(TAG, "process destroy: " + process);
process.destroy();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

我们在代码中按如下使用

1
2
3
String[] runtimeCmmd = doRuntimeCmmd("df");
MySortViewOfCMD textView = new MySortViewOfCMD(getActivity());
textView.setCurrentString(runtimeCmmd[0]);

用此方法得到的文本结果,并不像adb命令行中格式化的,需要自定义控件

  • 自定义view实现排版仅供参考
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    	public class MySortViewOfCMD extends TextView {

    private String text;
    int lineCount = 0;
    private Paint paint = new Paint();
    private ArrayMap<Integer, String[]> charByMap;
    private int mWidth = 900;// px
    private int mHeight = 660;
    private Scroller mScroller;
    private int lastPointX;
    private int lastPointY;
    public MySortViewOfCMD(Context context) {
    super(context);
    initPaint(context);
    }
    public MySortViewOfCMD(Context context, AttributeSet attrs) {
    super(context, attrs);
    initPaint(context);
    }
    private void initPaint(Context context) {
    paint.setColor(context.getResources().getColor(R.color.white));
    paint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
    18, context.getResources().getDisplayMetrics()));
    mScroller = new Scroller(context);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int width = measureDimension(mWidth, widthMeasureSpec);
    int height = measureDimension(mHeight, heightMeasureSpec);
    setMeasuredDimension(width, height);
    }
    private int measureDimension(int defaultSize, int measureSpec) {

    int result = defaultSize;
    int specMode = MeasureSpec.getMode(measureSpec);
    int specSize = MeasureSpec.getSize(measureSpec);
    if (specMode == MeasureSpec.EXACTLY) {
    result = specSize;
    } else if (specMode == MeasureSpec.AT_MOST) {
    result = Math.min(defaultSize, specSize);
    } else {
    result = defaultSize;
    }
    return result;
    }
    @Override
    protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    for (int i = 0; i < charByMap.size(); i++) {//绘制行
    String[] strings = charByMap.get(i);
    for (int j = 0; j < strings.length; j++) {//绘制列
    if (j == 1) {//针对第二列做特殊处理,防止与第一列重影
    canvas.drawText(strings[j], j * (mWidth / 3) + 60,
    i * 30 + 25, paint);
    continue;
    }
    canvas.drawText(strings[j], j * (mWidth / 3), i * 30 + 25,
    paint);
    }
    }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:

    lastPointX = (int) event.getX();
    lastPointY = (int) event.getY();
    return true;
    case MotionEvent.ACTION_MOVE:

    int mXMove = (int) event.getX();
    int scrolledX = (int) (lastPointX - mXMove);
    if(getScrollX() + scrolledX < 0){//左边界
    scrollTo(0, 0);
    return true;
    }
    if (getScrollX() + getWidth() + scrolledX < (mWidth / 3) * 5)//小于右边界
    mScroller.startScroll(getScrollX(), 0,
    lastPointX - (int) event.getX(), 0, 200);
    invalidate();

    break;
    case MotionEvent.ACTION_UP:

    break;
    }
    return true;
    }
    /**
    * 平滑滚动
    */
    @Override
    public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
    scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
    invalidate();
    }
    }
    public void setCurrentString(String text) {
    this.text = text;
    charByMap = saveCharByMap(text);
    invalidate();
    }
    /**
    * 根据传进来的string保存每一行的字符
    *
    * @param string
    * -显示的字符串 eg: file size use \n filedddd size use \n
    */
    private ArrayMap<Integer, String[]> saveCharByMap(String string) {
    String[] lineString = string.split("\n");
    ArrayMap<Integer, String[]> charMap = new ArrayMap<Integer, String[]>();
    lineCount = lineString.length;
    for (int i = 0; i < lineCount; i++) {
    String[] charItem = lineString[i].split("\\s+");// 按空格切出字符

    charMap.put(i, charItem);
    }
    return charMap;
    }

    }

    感谢android,感谢开源

前言:产品爆出开机动画不流畅的bug,于是和美工切了108个罗汉来,接下来就要看一下如何制作开机动画了

1. 建立三个文件夹

temp_bootanimation.png
part1中放所有的图片,part2中放播放完成后定格的图片
打开desc.txt
480 800 24 —————–这里的480代表图片的像素(大小)宽度,800代表图片的像素(大小)高度,24代表帧数,part1里面有多少图片就填多少;
p 1 0 part1 —————–这里的p代表标志符,1代表循环次数为1次,0代表阶段间隔时间为0,part1代表对应的文件夹名;
p 0 0 part2 —————–这里的p代表标志符,0代表循环次数为0次,10代表阶段间隔时间为10,part2代表对应的文件名

2.三个都选中,右键压缩

temp_zip.png
压缩格式选zip,压缩方式:存储

3 .制作好XX.zip

push到system/media目录
执行adb shell XX 可进行预览动画

前言:目前在车机开发多媒体的U盘播放功能,每次插U盘就不能调试,调试就不能插U盘很不方便.有了远程调试程序,终于方便多了,唯一的缺点是wifi不稳定容易连接超时

步骤一

使用USB数据线成功连接(抱一下大腿先)程序.打开cmd,输入
adb tcpip 5555
看到tcp_success
即表示成功.

步骤二

打开手机wifi查看当前IP
adb connect IP:5555
此时就算拔掉USB,可以看到Eclipse还是连接着设备

后记

使用adb的时候容易遇到一个错误
ADB server didn't ACK
一般情况下是端口号被360手机助手等等软件占用了

  • 解决办法
    在cmd窗口中
    adb nodaemon server
    查看一下哪个端口被占用了(比如我的 5037)
    然后
    netstat -ano | findstr "5037"
    找到被占用的端口,在任务管理器中将其结束掉

源的理解

源的理解

源是什么

在车机开发中,最重要的一个方面就是源的处理。首先我们要知道源是什么。

学习一样新东西的时候,我喜欢类比已知的东西来“找你妹”

在应用开发中,我们播放声音使用的是请求音频焦点,一般是请求AudioManager.STREAM_MUSIC来播放音乐。然后注册一个回调来监听焦点的变化。

在车机中,因为有收音机,倒车等等独立于手机的模块。为了方便控制,定义了每一种声音播放的一种类型。相当于内部定义了一系列的焦点。一样有源改变的回调接口。在需要哪种类型的声音播放的时候,就请求对应的源,其他应用收到源改变的回调后在做相应的处理。

另外在车机开发中,常用的版本是android4.4,cpu计算能力比手机反应慢点,所以我们在开发中,因时刻注意性能的问题。

车机(序)

车机(序)

今年刚进入一家车机行业开发android,发现和互联网有很多不一样的地方。

首先第一点车机有点像平板,相对于手机来说很笨重

第二点来说,之前设计应用比较单一,不必考虑复杂的系统逻辑。对车机来说,考虑到音源切换的处理(处理不好容易混音),蓝牙连接问题,系统的返回键处理逻辑,倒车图像等等。

总体来说,车机开发也是安卓,只是涉及到android的framework层较多一点。开发应用的转车机开发入门也相对容易。

后面将再此记录在车机开发中遇到的问题。希望能见证自己的成长

100个基本

100个基本

1.不再有依赖心理

不知什么时候起,自己的人生总想高人指点迷津。因为做选择好难啊,我怎么知道哪个才是正确的选择呢?以后会不会后悔?但是自己真正喜欢什么都不知道,别人又如何知道呢?

2.面对需求时,不要有匮乏心态,照顾好同伴

之前下了个小蓝单车,所以心里想的只能用小蓝,上次和同事一起出门,都看中了同一辆,我说你找辆小黄吧,我只下了小蓝。后面想起来做的太幼稚了,没考虑他人的感受。这种情况还有很多,一定要反省。

3.别让爱的人,因你肆无忌惮的嘴受伤

4.说话注意语气

5.每天清晨给当日设定计划

6.别进入别人给你设的怪圈

有时候想想当时气的不行的事,其实都是芝麻小事,为啥当时就会很愤怒甚至做出过激行为呢。原来是人与人之间互动之中,会自然而然的进入彼此营造的氛围中,此时若是开心的事还好,愤怒就是一触即发。

所以我的观念是在此时,把对方想成萝卜头,同意他所说的。后面再回想就不这么后悔当初做的事情了,反而崇拜起自己来~

7.相信世间的不完美

不完美的才是人生

加油的人

加油的人

孤独,体无完肤。

热闹,不如孤独。

每个人相处下来都有或多或少的小脾气

与人相处就是不断忍耐的过程。

一个加油的人,看得淡别人的自私。

一个加油的人,放得下自己的杂念.

我希望我是一个加油的人。

加油

如何鉴别女友:~::是不是处女

如何鉴别女友:~::是不是处女

很多朋友都有处女情结,尤其是中国的传统文化。以前我专门研究过女生走路来判断是0不是处女的,如果走路跨步八字,合不拢腿就可能被雨露均沾了。后来大点了发现并不是这样,走路姿势是不能判断出一个女生是不是处女的。有些女生天生走路外八字,好多女优自然走“路优雅。

重点来了…

前提在你了解你女友套路不深的时候

判断标准一:

不知洞在何处

是不是这啊…怎么进

我不自导啊。。

判断标准二:

如意金箍棒

哎呀,别弄了,一会又来了

嘻嘻,挺好玩的,可大可小也 我在拨拨

判断标准三:

你别啥也不做啊    

你说我该怎么做

判断……

我眼中的刘备不是正人君子

我眼中的刘备不是正人君子

人们常说,时势造英雄。而我看三国演义以来,明白古代老百姓有一种病根,目光短浅,容易忘记伤痛,明白是不是英雄已经从娘胎儿就定下来的了。

刘备要是师出无名,他一生下来不是刘皇叔,关羽张飞会和素未谋面的白面书生桃园三结义吗?

都说物以类聚,人以群分。关羽张飞倒是有点性格上的相似,可谓之急性子,而刘备应该是所谓的慢性子。明明性格不合却要与之结义,可见刘备知人识人确实是个能手。

在某一回中,刘备被曹操追杀,被迫与队伍失散躲进村中。村中居民识得是刘皇叔想好好款待他。无奈战乱祸害,居民尚不能饱食。于是一村民杀死妻子来喂主,谎称为狼肉。第二天刘备启程与张飞会合,无意中看到倒在血泊中的一具尸体,遂明白昨日吃的是人肉。待自己安全抵达军营后,行赏一百金与其村。

可见君子迫于形势,也有无奈之举。我们也当更全面的了解一个人,不要他顶着光环,就认为他不能有一点点的人性,多多谅解,毕竟人在江湖飘,如果他不小心没顺你的意,也要知道,他也是人,不是神