Android客户端之“微服私访”App的系统学习(八)调用系统摄像头拍照并管理照片并使用Okhttp上传文件至后台
2017-08-27 18:21
1061 查看
纤云弄巧,飞星传恨,银汉迢迢暗度。金风玉露一相逢,便胜却、人间无数。柔情似水,佳期如梦,忍顾鹊桥归路。两情若是久长时,又岂在、朝朝暮暮。明天就是七夕了,在此吟诗一首,然而和我并木有什么关系,所以还是静下心在家里撸代码,来更新一下项目用到的新姿势~
另外,该项目的介绍到这里就告一段落了,感兴趣的小伙伴可以根据我上传的资源,自己实现后续模块功能!项目UI资源
先来看一下今天的实现效果~
当点击图中的添加按钮时启动系统照相机拍照,在拍照之前要添加照相机权限和SD卡读写权限(android 6.0之前)。
最多拍摄四张,添加图片,并压缩展示:
这里采用的是一个github上的一个图片浏览库,支持缩放查看https://github.com/chrisbanes/PhotoView具体使用请参看文档介绍~
看一下模拟器运行的效果~
获取代码资源,请点击~
友情分享:
图片压缩:
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/
另外,该项目的介绍到这里就告一段落了,感兴趣的小伙伴可以根据我上传的资源,自己实现后续模块功能!项目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/
相关文章推荐
- Android客户端之“微服私访”App的系统学习(四)使用ViewPager+Fragment实现Tab
- Android客户端之“微服私访”App的系统学习(三)基于 OkHttp和Gson 快速获取解析服务数据
- Android客户端之“微服私访”App的系统学习(五)使用Picasso实现轮播图以及使用自定义View实现个人中心页面
- H5调用手机的摄像头拍照上传以及手机相册选取照片但不支持Android的分析
- Android客户端之“微服私访”App的系统学习(六)RecyclerView 展现复杂数据列表以及水波纹效果+CardView显示头像
- h5 app开发使用cordova调用相册、相机、文件系统或录音录视频,并上传到服务器
- Android拍照及图片裁剪、调用系统相册(兼容6.0以上权限处理及7.0以上文件管理)
- ios菜鸟之路:iphone使用照片管理器,从本地上传或摄像头拍照
- android中调用系统的相册或者相机拍照并上传照片
- Android客户端之“微服私访”App的系统学习(七)XRecyclerView快速实现列表界面+自定义Search输入框,软键盘搜索按钮监听+TextView部分样式改变
- 【Android】Android客户端使用okhttp上传文件php服务器
- android使用webview上传文件(支持相册和拍照),支持最高6.0安卓系统(改进版)
- Android学习之调用系统照相机拍照并保存(照片会被压缩)
- Android客户端之“微服私访”App的系统学习(一) 本地服务端环境的搭建和部署
- Android客户端之“微服私访”App的系统学习(二)TextInputLayout实现登录界面和LitePal初始化本地数据库
- ios 通过调用系统摄像头拍照,拍视频,然后写入文件
- 在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器
- Android上使用camera拍照,把获取的照片上传到远程服务器
- android 调用摄像头自动拍照 并上传到YEELINK
- android--调用系统相机拍照,显示并保存照片