您的位置:首页 > 理论基础 > 计算机网络

Android客户端之“微服私访”App的系统学习(八)调用系统摄像头拍照并管理照片并使用Okhttp上传文件至后台

2017-08-27 18:21 1061 查看
纤云弄巧,飞星传恨,银汉迢迢暗度。金风玉露一相逢,便胜却、人间无数。柔情似水,佳期如梦,忍顾鹊桥归路。两情若是久长时,又岂在、朝朝暮暮。明天就是七夕了,在此吟诗一首,然而和我并木有什么关系,所以还是静下心在家里撸代码,来更新一下项目用到的新姿势~

另外,该项目的介绍到这里就告一段落了,感兴趣的小伙伴可以根据我上传的资源,自己实现后续模块功能!项目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/Luban

BUG管理:

蒲公英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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐