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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值