7/18至8/12安卓开发所用到的技术

本文记录了作者从使用Eclipse到Android Studio进行开发的过程,包括解决常见问题的方法,如配置Java版本、处理DeadObjectException异常等。此外,还介绍了与服务器交互的具体实现细节,包括图片上传、结果展示等功能。

我按日期来吧。

7/18

    尝试把eclipse上的项目在android studio上跑起来,有好几个要修改的文件,搞了半天也没调起来。

    最后还是重装了一个eclipse,坑爹。


7/19

    用eclipse跑项目的时候有几个注意点,

    第一个是jar包的添加,右键项目,build path->add Libraries,把项目中用到的jar包都放进一个用户库文件夹下。

    

   第二个问题:Dx unsupported class file vwesion 52.0

      在新的IDE开发的时候,我尝试创建一个新的项目,然后发现居然不能运行,出错消息如上。

      查阅了很多资料后也没解决问题。最后询问Bob,解决方式是:

      Build Path->Configure Build Path->Java Compiler->1.7

   第三个问题:android.os.DeadObjectException

      修改application中android:hardwareAccelerated:"failed"即可

7/20

   这天主要是修改了按钮样式和添加了一个下拉菜单。

   参见这个链接吧,我就不再写了。现在发现每天写日报其实可以写详细点的,把用到的技术点都写出来,方便以后参考。

    http://blog.youkuaiyun.com/lichkingyang/article/details/51985151

7/21,7/22

    研究了一下onAcivityResult,有个地方一直不调用onActivityResult函数,后来发现是resultCode的问题。

    对于每一个控件设置id,使用View.generateViewId()函数,比如imageTextButtonDiy.setId(View.generateViewId());

7/25

    在onActivityResult函数中添加了一个refresh()界面,将“开始拍摄”这一个按钮变为"使用"和"重拍"两个按钮,这个使用的技巧就是重新加载布局。

    还有一个按钮按下和抬起的动作设置:

btn_compare.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
img.setImageResource(originPicture.get(projectName));
} else if (event.getAction() == MotionEvent.ACTION_UP) {
img.setImageBitmap(bitmap);
}
return false;
}
});

7/26

    这天做了很多东西,把app的跟拍照相关的主要功能都基本实现了。难点在于tableRow的动态添加和删除,我写了一大段程序,就是根据删除的图框的位置重新布置tableRow。

7/27-7/29这三天都在研究图片清晰度检测功能的实现

    Bob这个傻逼让我用安卓调python,呵呵。安卓不能直接调python,他又让我用安卓调C++用C++调python。MDZZ。最后我还是直接用安卓调的C++。这有一个NDK的配置问题。这个我是直接百度的。

    注意一下JNI接口的命名规范是:Java_ + 调用该方法的包名(包名的点用_代替) + _ + 调用该接口的类名 + _ + 方法名。

8/2-8/4

    这几天是和服务器交互的车辆定损结果展示。这个过程有点复杂,我先把图片发给Bob,Bob把图片筛一下,发给天博,然后天博再用socket和我连接。服务端:就是用一个端口开启服务端,然后server.accept接受连接。

   try {
            server = new ServerSocket(PORT);
            mExecutorService = Executors.newCachedThreadPool();  //create a thread pool
            System.out.println("服务器已启动...");
            Socket client = null;
            while(true) {
                client = server.accept();
                //把客户端放入客户端集合中
                mList.add(client);
                mExecutorService.execute(new Service(client)); //start a new thread to handle the connection
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    还有一些字符串的处理方面的,我要在图片的结尾加上客户端的ip地址和端口,让天博的服务器作为socket客户端和我连接。 

    fileName = fileName.substring(0,fileName.lastIndexOf("."))+"_"+ip+":8888"+".jpg";

8/5 

    与服务器交互的非本车识别。通过线程发送图片,用handler接受返回信息,再显示出来。

    这个一次发送两张图片,注意两张图片直接有分界线。

    private void checkIsTheSameCar(final File firstFile, final File secondFile) {
new Thread(new Runnable() {
@Override
public void run() {
String result = null;
String BOUNDARY = UUID.randomUUID().toString();
String PREFIX = "--", LINE_END = "\r\n";
String CONTENT_TYPE = "multipart/form-data";
try {
URL url = new URL(requestURL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(TIME_OUT);
conn.setConnectTimeout(TIME_OUT);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Charset", CHARSET);
conn.setRequestProperty("connection", "keep-alive");
conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);
if (firstFile != null && secondFile != null) {
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
/*
* 第一张图片
*/
StringBuffer sb = new StringBuffer();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINE_END);
String fileName = firstFile.getName();
// fileName =
// fileName.substring(0,fileName.lastIndexOf("."))+"_"+ip+":8888"+".jpg";
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\""
+ LINE_END);
sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);
sb.append(LINE_END);
dos.write(sb.toString().getBytes());
InputStream is = new FileInputStream(firstFile);
byte[] bytes = new byte[1024];
int len = 0;
while ((len = is.read(bytes)) != -1) {
dos.write(bytes, 0, len);
}
is.close();
dos.write(LINE_END.getBytes());
dos.flush();
/**
* 第二张图片
*/
sb = new StringBuffer();
sb.append(PREFIX);
sb.append(BOUNDARY);
sb.append(LINE_END);
fileName = secondFile.getName();
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\""
+ LINE_END);
sb.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINE_END);
sb.append(LINE_END);
dos.write(sb.toString().getBytes());
is = new FileInputStream(secondFile);
bytes = new byte[1024];
len = 0;
while ((len = is.read(bytes)) != -1) {
dos.write(bytes, 0, len);
}
is.close();
dos.write(LINE_END.getBytes());
dos.flush();


byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();
dos.write(end_data);
dos.flush();
int res = conn.getResponseCode();
if (res == 200) {
// Log.e(TAG, "request success");
InputStream input = conn.getInputStream();
StringBuffer sb1 = new StringBuffer();
int ss;
while ((ss = input.read()) != -1) {
sb1.append((char) ss);
}
result = sb1.toString();
Message message = new Message();
Bundle bundle = new Bundle();
bundle.putString("message", result);
message.setData(bundle);
message.what = 1;
cMessageHandler.sendMessage(message);
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
}).start();
}

    

8/8

   本车识别由于一次要比较两张图片,所以被比对的图片还要进行设置。我用了一个列表保存已经被拍照的照片。

8/9

   车牌识别,和本车识别的交互流程基本一样,就是结果的显示位置不同。

8/10

   修复bug

8/11

   语音app

8/12

   焦距检测


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值