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

另外,该项目的介绍到这里就告一段落了,感兴趣的小伙伴可以根据我上传的资源,自己实现后续模块功能!项目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);}/***拍照后回调事件*/@Overrideprotected 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.PhotoViewandroid: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"/>//可以通过按钮查看上一张、下一张图片以及删除图片@Overridepublic 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() {@Overridepublic 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();}@Overridepublic 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/

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

  1. Android开发文件上传格式,(android开发)使用okhttp上传文件

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  2. android项目中使用的服务器上,android 开发中使用okhttp上传文件到服务器

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  3. Android Studio App开发之下载管理器DownloadManager中显示、轮询下载进度、利用POST上传文件讲解及实战(附源码)

    运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一.在通知栏显示下载进度 利用GET方式读取数据有很多缺点比如1:无法端点续传 一旦中途失败只能重新获取 2:不是真正意义上的下载操作 无法设置参 ...

  4. Android客户端之“微服私访”App的系统学习(一) 本地服务端环境的搭建和部署

    前言: 每晚睡觉前都会去看看微信公众号中来自各位大神的干货分享,偶然看到鸿洋大神推荐的一篇有关课工厂的一个公开课 高效Android工程师6周培养计划,根据学习内容,整理成笔记.本系列文章意在详细介绍 ...

  5. Linux系统学习 八、SSH服务—SSH远程管理服务

    1.SSH简介 ssh(安全外壳协议)是Secure Shell的缩写,是建立在应用层和传输层基础上的安全协议.传输的时候是经过加密的,防止信息泄露,比telnet(明文传递)要安全很多. ftp安装 ...

  6. python上传文件到onedrive_基于Python的onedrive文件本地化浏览系统–PyOne

    基于Python的onedrive文件本地化浏览系统–PyOne PyOne是一款基于Python-Flask的onedrive文件本地化浏览系统,使用MongoDB储存文件列表,使用redis缓存数 ...

  7. android外接键盘打汉字,Android在外接物理键盘时,如何强制调用系统软键盘

    Android在外接物理键盘时,如何强制调用系统软键盘? 第一次写,写的不好请见谅 参考: 物理键盘映射过程: 手机/system/usr/keylayout/*.kl :内核将keyCode映射成有 ...

  8. Android在外接物理键盘时,如何强制调用系统软键盘

    Android在外接物理键盘时,如何强制调用系统软键盘? 可以加群:466059178,可以共同讨论,大神指导 第一次写,写的不好请见谅 参考: http://blog.csdn.net/DrakeB ...

  9. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...

    使用var task = plus.uploader.createUpload上传文件时,添加上传状态监听事件 task.addEventListener("statechanged&quo ...

最新文章

  1. linux服务器secureCRT RSA登录配置
  2. 数据库笔记——数据模型
  3. 用SqlBulkCopy批量安插数据时提示来自数据源的 String 类型的给定值不能转换为指定目标列的类型 int...
  4. 剑指Offer_35_数组中的逆序对
  5. pprof 的原理与实现
  6. 使用 .NET Core模板引擎创建自定义的模板和项目
  7. 浅谈城市规划在移动GIS方面的应用发展
  8. 判断是否是质数 c++java
  9. AI+教育落地,百度大脑如何让校园更智能?
  10. 32位java8,jdk8下载,解压版
  11. PDF文件去除页边距空白
  12. 从1到100怎么做?小红书KOL五大阶段运营增长策略
  13. 贾扬清、李沐、陈天奇:如何看待国内开源现状?
  14. YOYO 软件下载及8个使用技巧
  15. cmd输入cl提示不是内部命令
  16. Javascript 实现gb2312和utf8编码的互换
  17. Python学习——分支结构
  18. 竟然有人用python做这种事 ۦُ۟۟ۖۖۖٛۥۗۙۙۗۡۥٌۚۚۗۛۥۛۚۛۡۥۖۛۛۦُُ۟۟ۖۖۖٛ۟ۗۖۚۥٌُٞۖۛۚ۟ۥٌٌۖۖ۟ۖۦٌ (Python 实现挂机自动锁屏)
  19. 自适应控制课程心得体会
  20. java 下载加速_一种基于Java的大文件下载加速方法与流程

热门文章

  1. JSBridge 原理
  2. 什么是 jsbridge
  3. 什么样的程序才算是好的程序?
  4. 2021年高压电工考试资料及高压电工复审考试
  5. 是不是签了合同,我就卖给了他们了?!这家公司拿合同来要挟我:就是累死,也不准离职,否则交2万元的“违约金”。
  6. 程序员,你喜欢抽哪种香烟?基于Python的数据分析哦~
  7. nginx安装的详细教程(包括命令行安装和编译安装)
  8. Centos 7桌面版取消自动休眠
  9. unity3d人脸识别(二),实现摄像头画面实时检测对比,实现刷脸功能
  10. 漂亮的大屏主视觉ui设计