在线上APK项目中,出现手机端图片清晰正常,图片上传之后大小为0异常无法查看,问题出现概率很低。偶现在金立的某个型号的手机出现。
针对这个异常问题进行分析处理,使用问题机型进行测试与异常验证
1.问题出现途径:图库选择 or 拍照图片上传出现的问题?
实际操作验证我们先从图库选择开始图片上传之后,图片显示正常排除图库问题,所有出现第二个疑虑。
2.为什么手机拍照之后查看图片却正常显示?
针对这样疑虑进行拍照断点跟踪,上传时图片的大小并不为0,上传正常后台显示也正常。但是当我们把断点去除之后运行,问题又出现了。惊到我了^_^。加log日志,再次拍照上传日志记录显示文件存在但文件大小为0。
分析处理:查看拍照代码,先创建一个空文件,调用系统拍照功能,让拍照数据输出到指定文件中。
/**
* Open camera
*/
private void showCameraAction() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
try {
mTmpFile = FileUtils.createTmpFile(getActivity());
} catch (IOException e) {
e.printStackTrace();
}
if (mTmpFile != null && mTmpFile.exists()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
startActivityForResult(intent, REQUEST_CAMERA);
} else {
Toast.makeText(getActivity(), R.string.mis_error_image_not_exist, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), R.string.mis_msg_no_camera, Toast.LENGTH_SHORT).show();
}
}
问题就出现在“系统把拍照之后数据输出到指定文件中”,因为国产手机多android原生系统定制修改原因。出现某些机型拍照之后把没有及时把数据写入文件中,导致本机查看图片正常,上传图片大小为0问题。那我们是否可等待数据写完之后再上传呢,答案是可以的。
解决方案是在图片上传的线程中让当前上传线程等待一会,等待次数加文件大小作为判断条件, 条件满足再上传图片文件。等待代码如下
private File call() throws IOException {
// 压缩文件
if (this.oldFile == null || !this.oldFile.exists()) {
return this.oldFile;
}
while (this.oldFile.length() <= 0 && waitSize < 15) {
try {
waitSize++;
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
测试验证之后,问题解决。上线更新之后类似问题也没在出现过。