纤云弄巧,飞星传恨,银汉迢迢暗度。金风玉露一相逢,便胜却、人间无数。柔情似水,佳期如梦,忍顾鹊桥归路。两情若是久长时,又岂在、朝朝暮暮。明天就是七夕了,在此吟诗一首,然而和我并木有什么关系,所以还是静下心在家里撸代码,来更新一下项目用到的新姿势~
另外,该项目的介绍到这里就告一段落了,感兴趣的小伙伴可以根据我上传的资源,自己实现后续模块功能!项目UI资源
先来看一下今天的实现效果~
一、调用系统相机拍照
在新增巡店模块,我们需要调用摄像头去拍照,并进行图片的管理(添加、删除、压缩展示)。
当点击图中的添加按钮时启动系统照相机拍照,在拍照之前要添加照相机权限和SD卡读写权限(android 6.0之前)。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CAMERA"/>最多拍摄四张,添加图片,并压缩展示:
//点击最后一张图片的时候处理拍照
if (position == filePaths.size()) {
if (filePaths.size() < 4) {
goTakePhoto();
} else {
Toast.makeText(mContext, "最多拍摄4张照片", Toast.LENGTH_SHORT).show();
}
} else {
//点击其他图片跳转到查看
Intent intent = new Intent(mContext, ImageViewActivity.class);
intent.putExtra("type", Constant.ShopImgUp);
intent.putExtra("position", position);
startActivity(intent);
}
/**
* 调用手机拍照功能
*/
protected void goTakePhoto() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
filePath = CacheFileUtils.getUpLoadPhotosPath();
Uri uri = Uri.fromFile(new File(filePath));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra(MediaStore.Images.ImageColumns.ORIENTATION, 0);
startActivityForResult(intent, 1001);
}
/**
*拍照后回调事件
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK) {//检验接收数据
return;
}
switch (requestCode) {
case 1001://接收拍照返回数据
if (!TextUtils.isEmpty(filePath)) {
Bitmap bitmap = ImageTools.convertToBitmap(filePath, 640, 640);
Bitmap bitmapComp = ImageTools.comp(bitmap);//图片压缩
ImageTools.saveBitmap(bitmapComp, filePath);
if (bitmap != null) {
filePaths.add(filePath);
}
}
break;
}
}
二、图片管理
设置最多添加四张照片,点击照片,可以对照片进行管理操作(查看、删除、伸缩)
这里采用的是一个github上的一个图片浏览库,支持缩放查看https://github.com/chrisbanes/PhotoView具体使用请参看文档介绍~
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/image_view_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/image_view_right"
android:layout_toRightOf="@+id/image_view_left"/>
//可以通过按钮查看上一张、下一张图片以及删除图片
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.image_view_left://浏览上一张图片
if (mposition > 0) {
mposition--;
ShowImage(mposition, type);
}
break;
case R.id.image_view_right://浏览下一张图片
if (list == null) {
list = new ArrayList<String>();
}
if (mposition < list.size() - 1 && mposition > -1) {
mposition++;
ShowImage(mposition, type);
}
break;
case R.id.image_view_detele://删除图片
if (list != null) {
if (list.size() > 0) {
File file = new File(list.get(mposition));
switch (type) {
case Constant.PhotoUp:
//培训图片处理
break;
case Constant.ShopImgUp:
CreateVisitShopActivity.filePaths.remove(mposition);
break;
}
if (file.exists()) {
file.delete();
}
if (list.size() == 0) {
finish();
}
if (mposition == list.size()) {
mposition--;
ShowImage(mposition, type);
} else {
ShowImage(mposition, type);
}
}
}
break;
}
}
public void ShowImage(int positon, int type) {
if (type > 0 && positon >= 0) {
switch (type) {
case Constant.ShopImgLook:
//巡店完成查看详情图片
break;
case Constant.PhotoLook:
//培训图片查看
break;
case Constant.PhotoUp:
//培训拍照上传查看图片
break;
case Constant.ShopImgUp://巡店图片上传查看
list = CreateVisitShopActivity.filePaths;
if (list == null) {
list = new ArrayList<String>();
}
//如果是最后一张图,设置右侧图标不可用
if (positon == list.size() - 1) {
right.setSelected(true);
} else {
right.setSelected(false);
}
//如果是第一张图,设置左侧图标不可用
if (positon == 0) {
left.setSelected(true);
} else {
left.setSelected(false);
}
String shopImg = list.get(positon);
File shopFile = new File(shopImg);
if (shopFile.exists()) {
Bitmap bitmap = BitmapFactory.decodeFile(shopImg);
img.setImageBitmap(bitmap);
} else {
list.re![mov](http://img.blog.csdn.net/20170827183619809?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVjaGFvMTIyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)e(positon);
Toast.makeText(mContext, R.string.image_no_exist, Toast.LENGTH_SHORT).show();
}
break;
}
} else {
img.setImageResource(R.drawable.default_img);
}
}
看一下模拟器运行的效果~
三、Okhttp上传图片
这里依旧采用Okhttp 来实现网络请求操作,上传巡店数据至后台
//店面数据提交请求封装
OkHttpManager.Param[] params = new OkHttpManager.Param[]{
new OkHttpManager.Param("userid", userid),
new OkHttpManager.Param("shopid", shop_id),
new OkHttpManager.Param("shopname", shop_name),
new OkHttpManager.Param("feedback", str_suggest),
new OkHttpManager.Param("shoplevel", (int) shop_number + ";" + (int) person_number + ";" + (int) product_number),
new OkHttpManager.Param("shopaddress", shop_where)};
File[] files = new File[filePaths.size()];
for (int i = 0; i < filePaths.size(); i++) {
String sName = filePaths.get(i);
File imgFile = new File(sName);
files[i] = imgFile;
}
OkHttpManager.getInstance().upFileNet(Constant.VisitShopSubmit, new OkHttpManager.ResultCallback() {
@Override
public void onFailed(Request request, IOException e) {
SaveDataInDb();
tv_submit.setClickable(true);
et_shopName.setFocusableInTouchMode(true);
tv_save.setClickable(true);
progress.setVisibility(View.GONE);
Toast.makeText(mContext, R.string.http_failed, Toast.LENGTH_SHORT).show();
}
@Override
public void onSuccess(String response) {
tv_submit.setClickable(true);
et_shopName.setFocusableInTouchMode(true);
tv_save.setClickable(true);
progress.setVisibility(View.GONE);
Gson gsr = new Gson();
SubmitResult sr = gsr.fromJson(response, SubmitResult.class);
if (sr.getCode() == 0) {
if (sl != null) {
DataSupport.delete(ShopList.class, sl.getId());
}
ShopFragment.isFirst = true;
mActivity.setResult(RESULT_OK);
finish();
} else {
SaveDataInDb();
Toast.makeText(mContext, R.string.please_resubmit, Toast.LENGTH_SHORT).show();
}
}
}, files, "file", params);
} else {
Toast.makeText(mContext, "请对店面进行搜索并添加", Toast.LENGTH_SHORT).show();
}
友情分享:
图片压缩:
https://github.com/zetbaitsu/Compressor
https://github.com/Curzibn/LubanBUG管理:
蒲公英Bug管理云:https://bug.pgyer.com/
BugDone: https://www.bugdone.cn/home/
delbug: http://www.delbug.cn/
鱼骨: http://www.yugusoft.com/
腾讯优测: http://remote.utest.qq.com/deviceSearch?type=remote
上线测试: https://fir.im/apps
天眼查: https://www.tianyancha.com/
国家企业信用信息网 http://www.gsxt.gov.cn/index.html
查看企业评价: 职友圈/看准网标注、测量
AdobeAIRInstaller(像素厨房)
PxCook 像素大厨 http://www.fancynode.com.cn/pxcook
马克鳗 http://www.getmarkman.com/