Pārlūkot izejas kodu

增加工单功能

guilin 1 gadu atpakaļ
vecāks
revīzija
807043ccfd
24 mainītis faili ar 2211 papildinājumiem un 47 dzēšanām
  1. 13 0
      app/src/main/AndroidManifest.xml
  2. 148 8
      app/src/main/java/com/fxy/adapter/GridImageAdapter.java
  3. 205 0
      app/src/main/java/com/fxy/base/BasePopupWindow.java
  4. 61 0
      app/src/main/java/com/fxy/common/AudioRecoderDialog.java
  5. 63 4
      app/src/main/java/com/fxy/common/PictureSelectorUpload.java
  6. 34 30
      app/src/main/java/com/fxy/main/MainActivity.java
  7. 11 1
      app/src/main/java/com/fxy/main/fragment/HomePagerFragment.java
  8. 7 2
      app/src/main/java/com/fxy/net/Urls.java
  9. 157 0
      app/src/main/java/com/fxy/utils/AudioRecoderUtils.java
  10. 22 0
      app/src/main/java/com/fxy/utils/ProgressTextUtils.java
  11. 578 0
      app/src/main/java/com/fxy/workOrder/StartWorkOrderMainActivity.java
  12. 538 0
      app/src/main/java/com/fxy/workOrder/WorkOrderOptMainActivity.java
  13. BIN
      app/src/main/res/drawable-xhdpi/recod_start_f01.png
  14. 7 0
      app/src/main/res/drawable/layer_recording_animation.xml
  15. 5 0
      app/src/main/res/drawable/shape_window_background.xml
  16. 167 0
      app/src/main/res/layout/activity_fxy_work_order_opt.xml
  17. 70 0
      app/src/main/res/layout/activity_fxy_work_order_start.xml
  18. 32 0
      app/src/main/res/layout/audio_recoder_dialog.xml
  19. 33 0
      app/src/main/res/layout/dialog_audio_recoder.xml
  20. 23 0
      app/src/main/res/layout/fragment_homepager.xml
  21. 35 0
      app/src/main/res/layout/fragment_show_audio.xml
  22. BIN
      app/src/main/res/mipmap-xhdpi/icon_microphone_normal.png
  23. BIN
      app/src/main/res/mipmap-xhdpi/icon_microphone_recoding.png
  24. 2 2
      config.gradle

+ 13 - 0
app/src/main/AndroidManifest.xml

@@ -10,6 +10,7 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
 
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     <uses-permission android:name="android.permission.CAMERA" />
@@ -301,6 +302,18 @@
             android:windowSoftInputMode="stateHidden|adjustPan"
             android:screenOrientation="portrait"
             tools:ignore="LockedOrientationActivity"/>
+
+        <activity
+            android:name=".workOrder.WorkOrderOptMainActivity"
+            android:windowSoftInputMode="stateHidden|adjustPan"
+            android:screenOrientation="portrait"
+            tools:ignore="LockedOrientationActivity"/>
+
+        <activity
+            android:name=".workOrder.StartWorkOrderMainActivity"
+            android:windowSoftInputMode="stateHidden|adjustPan"
+            android:screenOrientation="portrait"
+            tools:ignore="LockedOrientationActivity"/>
     </application>
 
 

+ 148 - 8
app/src/main/java/com/fxy/adapter/GridImageAdapter.java

@@ -1,19 +1,32 @@
 package com.fxy.adapter;
+import android.annotation.SuppressLint;
+import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
+import android.os.Environment;
+import android.support.v4.app.ActivityCompat;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.widget.RecyclerView;
 import android.util.Log;
+import android.view.Gravity;
 import android.view.LayoutInflater;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.bumptech.glide.request.RequestOptions;
+import com.elvishew.xlog.XLog;
+import com.fxy.common.AudioRecoderDialog;
+import com.fxy.utils.AudioRecoderUtils;
+import com.fxy.workOrder.WorkOrderOptMainActivity;
 import com.luck.picture.lib.config.PictureConfig;
 import com.luck.picture.lib.config.PictureMimeType;
 import com.luck.picture.lib.entity.LocalMedia;
@@ -22,8 +35,12 @@ import com.luck.picture.lib.tools.StringUtils;
 import com.fxy.R;
 
 import java.io.File;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.UUID;
+
+import es.dmoral.toasty.Toasty;
 
 /**
  * author:luck
@@ -41,6 +58,17 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
     private ArrayList<String> ossPhotoList =new ArrayList<>();
     private int selectMax = 9;
     private Context context;
+    private Activity mActivity;
+    private int pictureType;
+
+    //录音参数 start
+    public static final int RECORD_AUDIO = 1024;
+    private long downT;
+    private AudioRecoderDialog recoderDialog;
+    private AudioRecoderUtils recoderUtils;
+    private List<LocalMedia> medias = new ArrayList<>();
+    //录音参数 end
+
     /**
      * 点击添加图片跳转
      */
@@ -50,10 +78,13 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
         void onAddPicClick();
     }
 
-    public GridImageAdapter(Context context, onAddPicClickListener mOnAddPicClickListener) {
+
+    public GridImageAdapter(Context context,Activity activity, onAddPicClickListener mOnAddPicClickListener,int pictureType) {
         this.context = context;
+        this.mActivity = activity;
         mInflater = LayoutInflater.from(context);
         this.mOnAddPicClickListener = mOnAddPicClickListener;
+        this.pictureType = pictureType;
     }
 
     public void setSelectMax(int selectMax) {
@@ -117,14 +148,20 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
     public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
         //少于8张,显示继续添加的图标
         if (getItemViewType(position) == TYPE_CAMERA) {
-            viewHolder.mImg.setImageResource(R.drawable.ic_add_img);
-            viewHolder.mImg.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    mOnAddPicClickListener.onAddPicClick();
-                }
-            });
             viewHolder.ll_del.setVisibility(View.INVISIBLE);
+            if (pictureType==PictureConfig.TYPE_AUDIO){
+                viewHolder.mImg.setImageResource(R.drawable.recod_start_f01);
+                intAudioView(viewHolder);//
+
+            }else{
+                viewHolder.mImg.setImageResource(R.drawable.ic_add_img);
+                viewHolder.mImg.setOnClickListener(new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        mOnAddPicClickListener.onAddPicClick();
+                    }
+                });
+            }
         } else {
             viewHolder.ll_del.setVisibility(View.VISIBLE);
             viewHolder.ll_del.setOnClickListener(new View.OnClickListener() {
@@ -219,4 +256,107 @@ public class GridImageAdapter extends RecyclerView.Adapter<GridImageAdapter.View
     public ArrayList getPhotoList(){
         return ossPhotoList;
     }
+
+
+    @SuppressLint("ClickableViewAccessibility")
+    //初始化录音按钮
+    private void intAudioView(ViewHolder viewHolder){
+        recoderDialog = new AudioRecoderDialog(context);
+        recoderDialog.setOnCallbackListener(new AudioRecoderDialog.CallbackListener() {
+            @Override
+            public void closeResult() {
+                stopRecord();
+            }
+        });
+        viewHolder.mImg.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View view, MotionEvent event) {
+                switch(event.getAction()) {
+                    case MotionEvent.ACTION_DOWN:
+                        //⑧申请录制音频的动态权限
+                        if(ContextCompat.checkSelfPermission(context, android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED){
+                            ActivityCompat.requestPermissions(mActivity,new String[]{android.Manifest.permission.RECORD_AUDIO},RECORD_AUDIO);
+                        }else {
+                            startRecord(view);
+                        }
+                        return true;
+                    case MotionEvent.ACTION_UP:
+                        stopRecord();
+                        return true;
+                }
+                return false;
+            }
+        });
+
+
+
+
+
+
+    }
+
+    private void startRecord(View view){
+        recoderDialog.showAtLocation(view, Gravity.CENTER, 0, 0);
+        recoderDialog.setShowAlpha(0.58f);
+        String fileName = UUID.randomUUID().toString() + ".amr";
+        String pathName = Environment.getExternalStorageDirectory() + "/"+fileName;
+        recoderUtils = new AudioRecoderUtils(new File(pathName));
+        recoderUtils.setOnAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() {
+            @Override
+            public void onUpdate(double db) {
+                if(null != recoderDialog) {
+                    int level = (int) db;
+                    recoderDialog.setLevel((int)db);
+                    recoderDialog.setTime(System.currentTimeMillis() - downT);
+                }
+            }
+        });
+
+
+        recoderUtils.startRecord();
+        downT = System.currentTimeMillis();
+
+    }
+
+    private void stopRecord(){
+
+
+        long diff = recoderUtils.stopRecord();
+        recoderDialog.close();
+
+        XLog.e( "录音存储到了"+recoderUtils.getFilePath());
+        XLog.e( "说话时间:"+diff);
+        if (diff>1000L){
+            medias.clear();
+            String mediaPath = recoderUtils.getFilePath();
+            String pictureType = "audio/mpeg";
+            int duration = PictureMimeType.getLocalVideoDuration(mediaPath);
+            LocalMedia media = new LocalMedia();
+            media.setPath(mediaPath);
+            media.setPictureType(pictureType);
+            media.setDuration(duration);
+            media.setMimeType(PictureMimeType.ofAudio());
+            medias.add(media);
+            Intent intent = new Intent().putExtra(PictureConfig.EXTRA_RESULT_SELECTION, (Serializable) medias);
+
+            if (audioListener!=null){
+                audioListener.onSaveResult(intent);
+            }
+        }else{
+            Toasty.error(context, "说话时间太短" , Toast.LENGTH_SHORT).show();
+            recoderDialog.setShowAlpha(1.0f);
+        }
+
+
+    }
+
+    //回调到
+    private OnAudioListener audioListener;
+    public interface OnAudioListener {
+        void onSaveResult(Intent data);
+    }
+    public void setOnAudioListener(OnAudioListener listener) {
+        this.audioListener = listener;
+    }
+
 }

+ 205 - 0
app/src/main/java/com/fxy/base/BasePopupWindow.java

@@ -0,0 +1,205 @@
+package com.fxy.base;
+
+import android.animation.ValueAnimator;
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.PopupWindow;
+
+import com.fxy.common.PictureSelectorUpload;
+
+/**
+ * Created by MarioStudio on 2016/5/7.
+ */
+
+public class BasePopupWindow extends PopupWindow {
+
+    private Context mContext;
+    private float mShowAlpha = 0.88f;
+    private Drawable mBackgroundDrawable;
+
+    @Override
+    public int getAnimationStyle() {
+        return super.getAnimationStyle();
+    }
+
+    public BasePopupWindow(Context context) {
+        this.mContext = context;
+        initBasePopupWindow();
+    }
+
+    @Override
+    public void setOutsideTouchable(boolean touchable) {
+        super.setOutsideTouchable(touchable);
+        if(touchable) {
+            if(mBackgroundDrawable == null) {
+                mBackgroundDrawable = new ColorDrawable(0x00000000);
+            }
+            super.setBackgroundDrawable(mBackgroundDrawable);
+        } else {
+            super.setBackgroundDrawable(null);
+        }
+    }
+
+    @Override
+    public void setBackgroundDrawable(Drawable background) {
+        mBackgroundDrawable = background;
+        setOutsideTouchable(isOutsideTouchable());
+    }
+
+    /**
+     * 初始化BasePopupWindow的一些信息
+     * */
+    private void initBasePopupWindow() {
+        setAnimationStyle(android.R.style.Animation_Dialog);
+        setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
+        setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
+        setOutsideTouchable(false);  //默认设置outside点击无响应
+        setFocusable(true);
+    }
+
+    @Override
+    public void setContentView(View contentView) {
+        if(contentView != null) {
+            contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
+            super.setContentView(contentView);
+            addKeyListener(contentView);
+        }
+    }
+
+    public Context getContext() {
+        return mContext;
+    }
+
+    @Override
+    public void showAtLocation(View parent, int gravity, int x, int y) {
+        super.showAtLocation(parent, gravity, x, y);
+        ValueAnimator animator = showAnimator();
+        if(animator != null) {
+            animator.start();
+        }
+    }
+
+    @Override
+    public void showAsDropDown(View anchor) {
+        super.showAsDropDown(anchor);
+        ValueAnimator animator = showAnimator();
+        if(animator != null) {
+            animator.start();
+        }
+    }
+
+    @Override
+    public void showAsDropDown(View anchor, int xoff, int yoff) {
+        super.showAsDropDown(anchor, xoff, yoff);
+        ValueAnimator animator = showAnimator();
+        if(animator != null) {
+            animator.start();
+        }
+    }
+
+    @Override
+    public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) {
+        super.showAsDropDown(anchor, xoff, yoff, gravity);
+        ValueAnimator animator = showAnimator();
+        if(animator != null) {
+            animator.start();
+        }
+    }
+
+    //
+    public void close() {
+        //自动关闭
+        super.dismiss();
+        dismissAnimator();
+    }
+
+
+    public void setShowAlpha(float alpha) {
+        this.mShowAlpha = alpha;
+    }
+
+    /**
+     * 窗口显示,窗口背景透明度渐变动画
+     * */
+    private ValueAnimator showAnimator() {
+        if(mShowAlpha != 1.0f) {
+            ValueAnimator animator = ValueAnimator.ofFloat(1.0f, mShowAlpha);
+            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    float alpha = (float) animation.getAnimatedValue();
+                    setWindowBackgroundAlpha(alpha);
+                }
+            });
+            animator.setDuration(360);
+            return animator;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 窗口隐藏,窗口背景透明度渐变动画
+     * */
+    private ValueAnimator dismissAnimator() {
+        if(mShowAlpha != 1.0f) {
+            ValueAnimator animator = ValueAnimator.ofFloat(mShowAlpha, 1.0f);
+            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+
+                @Override
+                public void onAnimationUpdate(ValueAnimator animation) {
+                    float alpha = (float) animation.getAnimatedValue();
+                    setWindowBackgroundAlpha(alpha);
+                }
+            });
+            animator.setDuration(320);
+            return animator;
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 为窗体添加outside点击事件
+     * */
+    private void addKeyListener(View contentView) {
+        if(contentView != null) {
+            contentView.setFocusable(true);
+            contentView.setFocusableInTouchMode(true);
+            contentView.setOnKeyListener(new View.OnKeyListener() {
+
+                @Override
+                public boolean onKey(View view, int keyCode, KeyEvent event) {
+                    switch (keyCode) {
+                        case KeyEvent.KEYCODE_BACK:
+                            close();
+                            return true;
+                        default:
+                            break;
+                    }
+                    return false;
+                }
+            });
+        }
+    }
+
+    /**
+     * 控制窗口背景的不透明度
+     * */
+    private void setWindowBackgroundAlpha(float alpha) {
+        Window window = ((Activity)getContext()).getWindow();
+        WindowManager.LayoutParams layoutParams = window.getAttributes();
+        layoutParams.alpha = alpha;
+        window.setAttributes(layoutParams);
+    }
+
+}

+ 61 - 0
app/src/main/java/com/fxy/common/AudioRecoderDialog.java

@@ -0,0 +1,61 @@
+package com.fxy.common;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+import com.fxy.R;
+import com.fxy.base.BasePopupWindow;
+import com.fxy.utils.ProgressTextUtils;
+
+/**
+ * Created by MarioStudio on 2016/5/12.
+ */
+
+public class AudioRecoderDialog extends BasePopupWindow {
+
+    private ImageView imageView;
+    private TextView textView;
+
+    public AudioRecoderDialog(Context context) {
+        super(context);
+        View contentView = LayoutInflater.from(context).inflate(R.layout.audio_recoder_dialog, null);
+        imageView = (ImageView) contentView.findViewById(android.R.id.progress);
+        textView = (TextView) contentView.findViewById(android.R.id.text1);
+        setContentView(contentView);
+    }
+
+    public void setLevel(int level) {
+        Drawable drawable = imageView.getDrawable();
+        drawable.setLevel(3000 + 6000 * level / 100);
+    }
+
+    public void setTime(long time) {
+        textView.setText(ProgressTextUtils.getProgressText(time));
+    }
+
+
+    @Override
+    public void dismiss() {
+
+        // 通过接口对象传上传状态
+        if (callbackListener!=null){
+            callbackListener.closeResult();
+        }
+
+    }
+    // 持有一个接口对象
+    AudioRecoderDialog.CallbackListener callbackListener;
+
+    // 状态变化监听
+    public interface CallbackListener {
+        // 回调方法 可以多个
+        void closeResult();
+    }
+    // 提供注册事件监听的方法
+    public void setOnCallbackListener(AudioRecoderDialog.CallbackListener callbackListener) {
+        this.callbackListener = callbackListener;
+    }
+}

+ 63 - 4
app/src/main/java/com/fxy/common/PictureSelectorUpload.java

@@ -56,7 +56,11 @@ public class PictureSelectorUpload {
     private int minimumCompressSize = 100;//最小压缩
     private OSSAsyncTask task;
     private ProgressDialog progressDialog;
-    List<String> errorList =  new ArrayList<String> ();;
+    List<String> errorList =  new ArrayList<String> ();
+
+    //资源类型
+    private int pictureType=1;
+
 
     //操作上传
     protected String actionType = "";
@@ -103,6 +107,18 @@ public class PictureSelectorUpload {
         initData();
     }
 
+    public PictureSelectorUpload(Activity activity, RecyclerView rvShowImg, String prefix,int maxNum,int type){
+        pictureType = type;
+        maxSelectNum = maxNum;
+        mActivity = activity;
+        mContext  = activity.getBaseContext();
+        mRecyclerView = rvShowImg;
+        mPrefix = prefix;
+        initAdapter();
+        initData();
+
+    }
+
     private void initData() {
         SPCache spCache = SPCache.getInstance(mContext);
         resourceUrl    = spCache.getResourceHost()+"/";
@@ -127,6 +143,10 @@ public class PictureSelectorUpload {
         this.actionType = actionType;
     }
 
+    public void setPictureType(int pictureType){
+        this.pictureType = pictureType;
+    }
+
     /**
      * 设置操作类型
      * @return
@@ -379,7 +399,7 @@ public class PictureSelectorUpload {
 
         LocalMedia localMedia = awaitUploadList.get(num);
         String urlPath =localMedia.getPath();
-        if (isCompress){
+        if (isCompress && localMedia.getCompressPath()!=null){
             urlPath = localMedia.getCompressPath();
         }
 
@@ -422,7 +442,7 @@ public class PictureSelectorUpload {
     private void initAdapter() {
         FullyGridLayoutManager manager = new FullyGridLayoutManager(mActivity, 3, GridLayoutManager.VERTICAL, false);
         mRecyclerView.setLayoutManager(manager);
-        adapter = new GridImageAdapter(mActivity, onAddPicClickListener);
+        adapter = new GridImageAdapter(mActivity,mActivity, onAddPicClickListener,pictureType);
         adapter.setList(selectList);
         adapter.setSelectMax(maxSelectNum);
         mRecyclerView.setAdapter(adapter);
@@ -451,6 +471,14 @@ public class PictureSelectorUpload {
                 }
             }
         });
+
+        //回调语音
+        adapter.setOnAudioListener(new GridImageAdapter.OnAudioListener() {
+            @Override
+            public void onSaveResult(Intent data) {
+                getSelectImg(data);
+            }
+        });
     }
 
 
@@ -468,7 +496,13 @@ public class PictureSelectorUpload {
                         public void accept(Permission permission) {
                             if (permission.granted) {// 用户已经同意该权限
                                 //第一种方式,弹出选择和拍照的dialog
-                                showPop();
+
+                                if (pictureType==PictureConfig.TYPE_AUDIO){
+                                    authAudio();
+                                }else {
+                                    showPop();
+                                }
+
 
                                 //第二种方式,直接进入相册,但是 是有拍照得按钮的
 //                                showAlbum();
@@ -572,6 +606,7 @@ public class PictureSelectorUpload {
                     case R.id.tv_cancel:
                         //取消
                         //closePopupWindow();
+
                         break;
                 }
                 closePopupWindow();
@@ -607,6 +642,30 @@ public class PictureSelectorUpload {
         }
     }
 
+    /**
+     * 自动打开录音
+     */
+    public void authAudio(){
+        // 自带音频
+        com.luck.picture.lib.PictureSelector.create(mActivity)
+                .openCamera(PictureMimeType.ofAudio())
+                //只需要音频
+                .selectionMode(PictureConfig.TYPE_AUDIO)
+                .compress(isCompress) // 压缩
+                .forResult(PictureConfig.CHOOSE_REQUEST);
+
+
+
+        //监听返回当前某个上传类型
+        if (uploadChangeListener!=null){
+            uploadChangeListener.uploadActionType(actionType);
+        }
+    }
+
+
+    /**
+     * 关闭弹窗
+     */
     public void closePopupWindow() {
         if (pop != null && pop.isShowing()) {
             pop.dismiss();

+ 34 - 30
app/src/main/java/com/fxy/main/MainActivity.java

@@ -1,5 +1,6 @@
 package com.fxy.main;
 
+import android.Manifest;
 import android.os.Bundle;
 import android.support.v4.content.ContextCompat;
 import android.support.v4.view.ViewPager;
@@ -31,6 +32,9 @@ import java.util.List;
 
 import butterknife.BindView;
 import butterknife.ButterKnife;
+import me.weyye.hipermission.HiPermission;
+import me.weyye.hipermission.PermissionCallback;
+import me.weyye.hipermission.PermissionItem;
 
 
 /**
@@ -169,37 +173,37 @@ public class MainActivity extends BaseActivity implements BadgeDismissListener,
                         Permission.Group.LOCATION,
                         Permission.Group.MICROPHONE
                 );
-//        List<PermissionItem> permissionItems = new ArrayList<PermissionItem>();
-//        permissionItems.add(new PermissionItem(Manifest.permission.READ_PHONE_STATE, "读写", R.drawable.permission_ic_storage));
-//        permissionItems.add(new PermissionItem(Manifest.permission.RECORD_AUDIO, "录音", R.drawable.permission_ic_storage));
-//        permissionItems.add(new PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, "读写", R.drawable.permission_ic_micro_phone));
-//        permissionItems.add(new PermissionItem(Manifest.permission.CAMERA, "相机", R.drawable.permission_ic_camera));
-//        HiPermission.create(MainActivity.this)
-//                .title("温馨提示")
-//                .permissions(permissionItems)
-//                .msg("请务必授予该权限!")
-//                .checkMutiPermission(new PermissionCallback() {
-//                    @Override
-//                    public void onClose() {
-////						showToast("用户关闭权限申请");
+        List<PermissionItem> permissionItems = new ArrayList<PermissionItem>();
+        permissionItems.add(new PermissionItem(Manifest.permission.READ_PHONE_STATE, "读写", R.drawable.permission_ic_storage));
+        permissionItems.add(new PermissionItem(Manifest.permission.RECORD_AUDIO, "录音", R.drawable.permission_ic_storage));
+        permissionItems.add(new PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, "读写", R.drawable.permission_ic_micro_phone));
+        permissionItems.add(new PermissionItem(Manifest.permission.CAMERA, "相机", R.drawable.permission_ic_camera));
+        HiPermission.create(MainActivity.this)
+                .title("温馨提示")
+                .permissions(permissionItems)
+                .msg("请务必授予该权限!")
+                .checkMutiPermission(new PermissionCallback() {
+                    @Override
+                    public void onClose() {
+						showToast("用户关闭权限申请,部分功能会影响");
 //                        showWarningToast(getString(com.sto.fingerstorage.R.string.warning_permission));
-//                    }
-//
-//                    @Override
-//                    public void onFinish() {
-////						showToast("所有权限申请完成");
-//                    }
-//
-//                    @Override
-//                    public void onDeny(String permission, int position) {
-////						Log.i(TAG, "onDeny");
-//                    }
-//
-//                    @Override
-//                    public void onGuarantee(String permission, int position) {
-////						Log.i(TAG, "onGuarantee");
-//                    }
-//                });
+                    }
+
+                    @Override
+                    public void onFinish() {
+//						showToast("所有权限申请完成");
+                    }
+
+                    @Override
+                    public void onDeny(String permission, int position) {
+//						Log.i(TAG, "onDeny");
+                    }
+
+                    @Override
+                    public void onGuarantee(String permission, int position) {
+//						Log.i(TAG, "onGuarantee");
+                    }
+                });
     }
 
 }

+ 11 - 1
app/src/main/java/com/fxy/main/fragment/HomePagerFragment.java

@@ -23,6 +23,8 @@ import com.fxy.putIn.TrayMainActivity;
 import com.fxy.putOut.DeliveryGoodsMainActivity;
 import com.fxy.putOut.QualityInspectionMainActivity;
 import com.fxy.tool.OrderToolMainActivity;
+import com.fxy.workOrder.StartWorkOrderMainActivity;
+import com.fxy.workOrder.WorkOrderOptMainActivity;
 import com.google.zxing.Result;
 import com.fxy.baselibrary.base.BaseFragment;
 import com.fxy.baselibrary.interfaces.OnRxScanerListener;
@@ -130,7 +132,8 @@ public class HomePagerFragment extends BaseFragment implements View.OnClickListe
      * @param v
      */
     @OnClick({R.id.search_view, R.id.ima_or_code,R.id.ivt_tally,R.id.ivt_cargo_storage,R.id.ivt_tray,
-            R.id.ivt_quality,R.id.ivt_order_tool,R.id.ivt_sortation,R.id.ivt_check})
+            R.id.ivt_quality,R.id.ivt_order_tool,R.id.ivt_sortation,R.id.ivt_check,
+            R.id.ivt_handle_work_order,R.id.ivt_add_work_order})
     public void onClick(View v) {
         Bundle bundle = new Bundle();
         switch (v.getId()) {
@@ -159,6 +162,13 @@ public class HomePagerFragment extends BaseFragment implements View.OnClickListe
             case R.id.ivt_check:
                 intent2Page(getActivity(), CheckGoodsMainActivity.class, false,bundle);;
                 break;
+            case R.id.ivt_handle_work_order:
+                intent2Page(getActivity(), StartWorkOrderMainActivity.class, false,bundle);
+                break;
+            case R.id.ivt_add_work_order:
+                bundle.putString("action","add");
+                intent2Page(getActivity(), WorkOrderOptMainActivity.class, false,bundle);
+                break;
             default:
                 showToast("还没有配置点击事件");
                 break;

+ 7 - 2
app/src/main/java/com/fxy/net/Urls.java

@@ -112,17 +112,22 @@ public class Urls {
     //扫描跟踪单号
     public static final String FXY_SCAN_PALLET_TRACKING = "/pda/inbound/scanPalletTracking";
 
-
     //获取查验入库信息
     public static final String  FXY_OPEN_TRACKING_NUMBER = "/pda/inbound/openTrackingNumber";
 
     //获取查验入库信息
     public static final String  FXY_INBOUND_PACKAGE_GOODS = "/pda/inbound/getPackageGoods";
 
-
     //完成查验
     public static final String  FXY_FINISH_CHECK = "/pda/inbound/finishCheck";
 
+    //扫描跟踪号
+    public static final String  FXY_WORK_TRACKING_NUMBER = "/pda/inbound/workTrackingNumber";
+    //添加工单
+    public static final String  FXY_ADD_WORK = "/pda/inbound/addWork";
+    //处理完成
+    public static final String  FXY_WORK_FINISH = "/pda/inbound/workFinish";
+
 
 
     //获取批次列表

+ 157 - 0
app/src/main/java/com/fxy/utils/AudioRecoderUtils.java

@@ -0,0 +1,157 @@
+package com.fxy.utils;
+
+import java.io.File;
+import java.io.IOException;
+
+import android.media.MediaRecorder;
+import android.os.Handler;
+import android.util.Log;
+
+import com.elvishew.xlog.XLog;
+
+/**
+ * Created by MarioStudio on 2016/5/12.
+ */
+
+public class AudioRecoderUtils {
+
+    private String filePath;
+    private MediaRecorder mMediaRecorder;
+    private final String TAG = "MediaRecord";
+    public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;
+
+    private OnAudioStatusUpdateListener audioStatusUpdateListener;
+
+    public AudioRecoderUtils(){
+        this.filePath = "/dev/null";
+    }
+
+    public AudioRecoderUtils(File file) {
+        this.filePath = file.getAbsolutePath();
+    }
+
+
+
+    private long startTime;
+    private long endTime;
+
+    /**
+     * 获取文件路径
+     * @return
+     */
+    public String getFilePath(){
+        return this.filePath;
+    }
+
+
+
+    /**
+     * 开始录音 使用amr格式
+     *      录音文件
+     * @return
+     */
+    public void startRecord() {
+        // 开始录音
+        /* ①Initial:实例化MediaRecorder对象 */
+
+        if (mMediaRecorder == null)
+            mMediaRecorder = new MediaRecorder();
+        try {
+            /* ②setAudioSource/setVedioSource */
+            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
+            /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
+            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
+            /*
+             * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
+             * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
+             */
+            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
+            /* ③准备 */
+            mMediaRecorder.setOutputFile(filePath);
+            mMediaRecorder.setMaxDuration(MAX_LENGTH);
+            mMediaRecorder.prepare();
+            /* ④开始 */
+            mMediaRecorder.start();
+            // AudioRecord audioRecord.
+            /* 获取开始时间* */
+            startTime = System.currentTimeMillis();
+            updateMicStatus();
+
+            Log.i("ACTION_START", "startTime" + startTime);
+        } catch (IllegalStateException e) {
+            Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
+        } catch (IOException e) {
+            Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
+        } catch (Exception e) {
+
+            e.printStackTrace();
+            XLog.e("错误图片错误,错误原因:"+e.getMessage());
+        }
+    }
+
+    /**
+     * 停止录音
+     */
+    public long stopRecord() {
+        if (mMediaRecorder == null)
+            return 0L;
+
+        endTime = System.currentTimeMillis();
+        Log.i("ACTION_END", "endTime" + endTime);
+
+        mMediaRecorder.setOnErrorListener(null);
+        mMediaRecorder.setOnInfoListener(null);
+        mMediaRecorder.setPreviewDisplay(null);
+        try {
+            mMediaRecorder.stop();
+            mMediaRecorder.reset();
+            mMediaRecorder.release();
+            mMediaRecorder = null;
+        } catch (IllegalStateException e) {
+            e.printStackTrace();
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));
+
+        return endTime - startTime;
+    }
+
+    private final Handler mHandler = new Handler();
+
+    private Runnable mUpdateMicStatusTimer = new Runnable() {
+        public void run() {
+            updateMicStatus();
+        }
+    };
+
+    /**
+     * 更新话筒状态
+     */
+    private int BASE = 1;
+    private int SPACE = 100;// 间隔取样时间
+
+    public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) {
+        this.audioStatusUpdateListener = audioStatusUpdateListener;
+    }
+
+    private void updateMicStatus() {
+        if (mMediaRecorder != null) {
+            double ratio = (double)mMediaRecorder.getMaxAmplitude() / BASE;
+            double db = 0;// 分贝
+            if (ratio > 1) {
+                db = 20 * Math.log10(ratio);
+                if(null != audioStatusUpdateListener) {
+                    audioStatusUpdateListener.onUpdate(db);
+                }
+            }
+            mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);
+        }
+    }
+
+    public interface OnAudioStatusUpdateListener {
+        public void onUpdate(double db);
+    }
+}

+ 22 - 0
app/src/main/java/com/fxy/utils/ProgressTextUtils.java

@@ -0,0 +1,22 @@
+package com.fxy.utils;
+
+import java.text.DecimalFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Created by MarioStudio on 2016/3/13.
+ */
+
+public class ProgressTextUtils {
+
+    public static String getProgressText(long time) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(new Date(time));
+        double minute = calendar.get(Calendar.MINUTE);
+        double second = calendar.get(Calendar.SECOND);
+
+        DecimalFormat format = new DecimalFormat("00");
+        return format.format(minute) + ":" + format.format(second);
+    }
+}

+ 578 - 0
app/src/main/java/com/fxy/workOrder/StartWorkOrderMainActivity.java

@@ -0,0 +1,578 @@
+package com.fxy.workOrder;
+
+import android.annotation.SuppressLint;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.elvishew.xlog.XLog;
+import com.fxy.R;
+import com.fxy.adapter.GoodsAdapter;
+import com.fxy.baselibrary.base.BaseActivity;
+import com.fxy.baselibrary.bean.BaseEventBusBean;
+import com.fxy.baselibrary.interfaces.OnRxScanerListener;
+import com.fxy.baselibrary.qrcode.ActivityScanerCode;
+import com.fxy.baselibrary.util.JsonUtil;
+import com.fxy.baselibrary.util.StringUtils;
+import com.fxy.bean.ActionBean;
+import com.fxy.bean.ScanBean;
+import com.fxy.constant.BaseConfig;
+import com.fxy.constant.EventCode;
+import com.fxy.net.MyDialogCallback;
+import com.fxy.net.Urls;
+import com.fxy.putIn.CheckGoodsDetailsMainActivity;
+import com.fxy.putOut.QualityInspectionMainActivity;
+import com.fxy.view.FloatingImageView;
+import com.google.zxing.Result;
+import com.lzy.okgo.OkGo;
+import com.lzy.okgo.model.Response;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.Unbinder;
+import sto.android.app.StoJNI;
+import sto.android.app.StoPdaKeyEvent;
+import sto.android.app.StoTongJNI;
+
+public class StartWorkOrderMainActivity extends  BaseActivity implements StoJNI.ScanCallBack {
+    /**
+     * 列表适配器
+     */
+    Context mContext = this;
+
+    //单号清除
+    @BindView(R.id.ib_order_no_clear)
+    ImageButton ibOrderNoClear;
+
+    //单号
+    @BindView(R.id.et_order_no)
+    EditText etOrderNo;
+
+
+    @BindView(R.id.tv_hint)
+    TextView tvCommandPrompt;
+
+    @BindView(R.id.ll_next_action)
+    LinearLayout llNextAction;
+
+    @BindView(R.id.btn_confirm)
+    TextView btnConfirm;
+
+    //扫码扫码动作
+    private ScanBean scanBean;
+
+    private String trackingNumber = "";
+
+    private int is_finish = 0;
+
+    //订单信息对象
+    private JSONObject workOrderObject = new JSONObject();
+
+    protected String action;
+    private Unbinder unbinder;
+
+    //浮动按钮
+    @BindView(R.id.iv_drag)
+    FloatingImageView iv_drag;
+
+
+    @Override
+    public int getContentViewResId() {
+        return R.layout.activity_fxy_work_order_start;
+    }
+
+    @Override
+    public boolean showToolBar() {
+        return true;
+    }
+
+    @Override
+    public boolean openEventBus() {
+        return true;
+    }
+
+    @Override
+    protected void getBundleExtras(Bundle bundle) {
+
+    }
+    //finish的返回监听
+    //这里的requestCode参数,就是上面设置的 1 ,当跳转的页面返回的时候,通过这个加以判断
+    //resultCode ,这个参数是在跳转的页面里面规定的,它也是一个int类型的标志
+    //第三个参数包含了返回的值
+    //如果不需要所跳转的页面返回值,也就不需要这个方法了
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (requestCode == 200 && resultCode == 200)//之前提到的两个标志,在这里显示出了作用
+        {
+            String  opt_status = data.getStringExtra("opt_status").toString();
+            if (opt_status.equals("success")){
+               clearData();
+            }
+        }
+    }
+
+
+    /**
+     * EventBus接收信息的方法,开启后才会调用(非粘性事件)
+     *
+     * @param event
+     */
+    @Override
+    protected void EventBean(BaseEventBusBean event) {
+//        XLog.e("----------接收返回--------------");
+//        XLog.e("接收返回:"+event.getEventCode());
+        if (event != null && event.getEventCode() == EventCode.displacement_refresh){
+
+        }
+    }
+
+    @Override
+    public boolean isPlayMusic() {
+        return true;
+    }
+
+    @Override
+    protected void initView() {
+        unbinder = ButterKnife.bind(this);
+        setTitleName("处理工单");
+
+        initEdit();
+        initAdapter();
+        iniData();
+
+        //监听浮动按钮
+        iv_drag.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if(!iv_drag.isDrag()){
+                    ActivityScanerCode.setScanerListener(mScanerListener);
+                    ActivityScanerCode.intent2Activity(mContext, BaseConfig.COMMON_SCANNER_ONLY);
+                }
+            }
+        });
+    }
+
+
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        //XLog.e("event:"+event.getKeyCode());
+        if ((event.getKeyCode()==KeyEvent.KEYCODE_DPAD_CENTER || event.getKeyCode()==KeyEvent.KEYCODE_ENTER )  && event.getAction() == KeyEvent.ACTION_DOWN){
+            //按确定键
+            if(this.validate()){
+                //getInboundInfo();
+            }
+        }
+        return super.dispatchKeyEvent(event);
+    }
+
+    //监听按键
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        XLog.e("监听按键:"+keyCode);XLog.e(event);
+        if (scanBean.getIsBroadcast()==0 && StoTongJNI.getIns(mContext).getEventFuction(keyCode)  == StoPdaKeyEvent.KEYCODE_SCAN
+                && event.getRepeatCount() == 0) {
+
+            if (StoTongJNI.getIns(mContext).GetScannerIsScanning()) {
+//
+            } else {
+                StoTongJNI.getIns(mContext).SetScannerStart();
+            }
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    @SuppressLint("HandlerLeak")
+    Handler scanHandler = new Handler() {
+
+        @Override
+        public void handleMessage(Message msg) {
+            // TODO Auto-generated method stub
+            if (msg.obj != null) {
+
+                String scanResult = msg.obj.toString().trim();
+                if (!scanResult.isEmpty()){
+                    setScanResult(scanResult);
+                }
+            }
+
+        }
+
+    };
+    @Override
+    public void onScanResults(String str) {
+        Message msg = new Message();
+        msg.obj = str;
+        scanHandler.sendMessage(msg);
+
+
+    }
+
+
+    @Override
+    public void onScanResults(String str, int type) {
+
+    }
+    /**
+     * 定义广播接受
+     */
+    BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String scanResult = intent.getStringExtra(scanBean.getDataName());
+            if (scanResult==null){return; }
+            String scanStatus = "";
+            if (!scanBean.getStatusName().isEmpty()){
+                scanStatus = intent.getStringExtra(scanBean.getStatusName());
+            }else{
+                scanStatus = scanResult.isEmpty()? "" : "ok"; //有值 默认是扫码成功;
+            }
+
+            //新大陆(MT65,MT90) 需要手动关闭
+            if (!scanBean.getActionStop().isEmpty()){
+                Intent stopIntent = new Intent(scanBean.getActionStop());
+                mContext.sendBroadcast(stopIntent);
+            }
+
+            if ("ok".equals(scanStatus)){
+                setScanResult(scanResult);
+            }else{
+                showErrorToast(getString(R.string.scan_failed));
+            }
+        }
+    };
+
+    /**
+     * 注册广播
+     */
+    private void initReceiver(){
+
+        try {
+
+            String scanStr = getScanSetting();
+            scanBean = JsonUtil.getObject(scanStr, ScanBean.class);
+            Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
+
+            if (is_broadcast ==1){
+                IntentFilter mFilter = new IntentFilter(scanBean.getAction());
+                this.registerReceiver(mReceiver, mFilter);
+            }else{
+                //不广播进行处理 jni模式
+                String pdaBrand = StoTongJNI.getmPdaBrand();
+                if (!pdaBrand.isEmpty()){
+                    StoTongJNI.getIns(this).setmScanCB(this);
+                    StoTongJNI.getIns(this).SetScannerOn();
+                }
+            }
+
+
+        }catch (Exception e) {
+            showErrorToast("获取扫码配置失败"+e.getMessage());
+            XLog.e("获取扫码配置失败:" + e.getMessage());
+        }
+    }
+
+    private void initEdit() {
+
+
+        //
+        etOrderNo.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+                if (actionId == EditorInfo.IME_ACTION_DONE) {
+                    String orderNo = etOrderNo.getText().toString().trim();
+                    if (StringUtils.isEmpty(orderNo)) {
+                        setEditTextFocused(v,true);
+                        showWarningToast(v.getHint().toString());
+                        return false;
+                    }
+                    getInboundInfo();//获取订单信息
+                    return false;
+                }
+                return false;
+            }
+        });
+        etOrderNo.addTextChangedListener(new TextWatcher() {
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+                if (s.length() > 0 ) {
+                    if (etOrderNo.isEnabled()){
+                        ibOrderNoClear.setVisibility(View.VISIBLE);
+                    }
+                    setEditTextNormal(etOrderNo,true);
+                } else {
+                    ibOrderNoClear.setVisibility(View.INVISIBLE);
+                    setEditTextFocused(etOrderNo,true);
+                }
+            }
+
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+            }
+
+            public void afterTextChanged(Editable s) {
+
+            }
+        });
+        ibOrderNoClear.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                etOrderNo.requestFocus();
+                etOrderNo.getText().clear();
+            }
+        });
+    }
+
+    private void iniData(){
+
+
+    }
+
+    private void initAdapter() {
+
+    }
+
+
+
+    private OnRxScanerListener mScanerListener = new OnRxScanerListener() {
+        @Override
+        public void onSuccess(String type, Result result) {
+            String scanResult = result.getText();
+            switch (type){
+                case BaseConfig.COMMON_SCANNER_ONLY:
+                    setScanResult(scanResult);
+
+                    break;
+            }
+        }
+        @Override
+        public void onFail(String type, String message) {
+
+        }
+    };
+
+    //把扫描结果赋值
+    private void setScanResult(String scanResult){
+        //获取焦点的view对象
+        View view=getWindow().getDecorView().findFocus();
+        //如果是EditText
+        if(view instanceof EditText)
+        {
+            ((EditText) view).setText(scanResult);
+
+            switch (view.getId()) {
+                case R.id.et_order_no:
+                    getInboundInfo();
+                    break;
+                default:
+            }
+
+
+        }
+    }
+
+    private void   getInboundInfo(){
+        String orderNo = etOrderNo.getText().toString().trim();
+        if (orderNo.isEmpty()){
+            return;
+        }
+
+        try {
+
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("tracking_number",orderNo);
+            if (!checkRepeat(Urls.FXY_WORK_TRACKING_NUMBER+(jsonObject.toString()))){
+                Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
+                return;
+            }
+            trackingNumber = "";
+            llNextAction.setVisibility(View.GONE);
+            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_WORK_TRACKING_NUMBER).upJson(jsonObject)
+                    .execute(new MyDialogCallback(this, true, true) {
+                        @Override
+                        public void onSuccess(Response<String> response) {
+                            super.onSuccess(response);
+                            try {
+                                ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
+
+                                if(bean.code == 1){
+
+                                    if (!bean.data.isEmpty() && !bean.data.equals("[]")){
+                                        JSONObject data = new JSONObject(bean.data);
+
+                                        if (data.has("command_action")){
+                                            tvCommandPrompt.setText(data.getString("command_action").replace("\\n", "\n"));
+                                        }
+
+                                        trackingNumber = etOrderNo.getText().toString().trim();
+                                        if (data.has("deal_tracking_number")){
+                                            trackingNumber = data.getString("deal_tracking_number");
+                                            etOrderNo.setText(trackingNumber);
+                                        }
+
+
+                                        if (data.has("is_finish")){
+                                            is_finish = data.getInt("is_finish");
+                                        }
+
+                                        btnConfirm.setText( is_finish==1 ? "下一个" : "下一步");
+                                        llNextAction.setVisibility(View.VISIBLE);
+                                    }
+
+
+
+                                }else{
+                                    trackingNumber = "";
+                                    showWarningToast(bean.msg);
+                                }
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                showEmptyView("扫跟踪号解析错误:"+e.getMessage());
+                                //XLog.e("获取包裹商品信息解析错误",e.getMessage());
+                            }
+                        }
+                    });
+        }catch (Exception e){
+            XLog.e("请求扫跟踪号信息错误:",e);
+        }
+
+    }
+
+
+    /*
+     * 校验必录
+     */
+    private boolean validate(){
+
+        return true;
+    }
+
+
+    //清除订单信息
+    private void clearData() {
+        etOrderNo.setText("");
+        tvCommandPrompt.setText("");
+        llNextAction.setVisibility(View.GONE);
+    }
+
+    @OnClick({R.id.ima_or_code,R.id.btn_confirm})
+    public void onViewClicked(View view) {
+        Bundle bundle = new Bundle();
+        switch (view.getId()) {
+            case R.id.ima_or_code:
+                if(etOrderNo.isEnabled()){
+                    etOrderNo.requestFocus();
+                    ActivityScanerCode.setScanerListener(mScanerListener);
+                    ActivityScanerCode.intent2Activity(mContext, BaseConfig.COMMON_SCANNER_ONLY);
+                }
+                break;
+            case R.id.btn_confirm:
+
+                if (is_finish==1){
+                    workFinish();
+                }else{
+                    bundle.putString("action","handle");
+                    bundle.putString("tracking_number",trackingNumber);
+                    intentPageResult(StartWorkOrderMainActivity.this, WorkOrderOptMainActivity.class, bundle,200);
+                }
+
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    private void   workFinish(){
+
+        try {
+            String orderNo = etOrderNo.getText().toString().trim();
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("tracking_number",orderNo);
+            if (!checkRepeat(Urls.FXY_WORK_FINISH+(jsonObject.toString()))){
+                Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
+                return;
+            }
+
+            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_WORK_FINISH).upJson(jsonObject)
+                    .execute(new MyDialogCallback(this, true, true) {
+                        @Override
+                        public void onSuccess(Response<String> response) {
+                            super.onSuccess(response);
+                            try {
+                                ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
+
+                                if(bean.code == 1){
+                                    clearData();
+                                }else{
+                                    showWarningToast(bean.msg);
+                                }
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                showEmptyView("处理完成解析错误:"+e.getMessage());
+                                //XLog.e("获取包裹商品信息解析错误",e.getMessage());
+                            }
+                        }
+                    });
+        }catch (Exception e){
+            XLog.e("请求扫跟踪号信息错误:",e);
+        }
+
+    }
+
+
+    @Override
+    protected void onDestroy() {
+        unbinder.unbind();
+
+
+        super.onDestroy();
+    }
+    @Override
+    protected void onResume() {
+        super.onResume();
+        initReceiver();
+    }
+    @Override
+    protected void onPause() {
+        super.onPause();
+        //销毁在onResume()方法中的广播
+        try {
+            //停止扫描
+            Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
+            if (is_broadcast==0){
+                StoTongJNI.getIns(mContext).SetScannerStop();
+                StoTongJNI.getIns(mContext).SetScannerOff();
+            }else{
+                unregisterReceiver(mReceiver);
+            }
+        }catch (Exception e){
+            XLog.e("销毁广播失败:",e.getMessage());
+        }
+    }
+
+
+}

+ 538 - 0
app/src/main/java/com/fxy/workOrder/WorkOrderOptMainActivity.java

@@ -0,0 +1,538 @@
+package com.fxy.workOrder;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.content.FileProvider;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.RecyclerView;
+import android.view.Gravity;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.elvishew.xlog.XLog;
+import com.fxy.R;
+import com.fxy.adapter.GoodsAdapter;
+import com.fxy.baselibrary.base.BaseActivity;
+import com.fxy.baselibrary.bean.BaseEventBusBean;
+import com.fxy.baselibrary.interfaces.OnRxScanerListener;
+import com.fxy.baselibrary.util.JsonUtil;
+import com.fxy.baselibrary.views.MarqueeTextView;
+import com.fxy.baselibrary.views.dialog.RxDialogZoomImageView;
+import com.fxy.bean.ActionBean;
+import com.fxy.bean.ScanBean;
+import com.fxy.common.AudioRecoderDialog;
+import com.fxy.common.PictureSelectorUpload;
+import com.fxy.constant.BaseConfig;
+import com.fxy.constant.EventCode;
+import com.fxy.fms.logic.ViewLogic;
+import com.fxy.net.MyDialogCallback;
+import com.fxy.net.Urls;
+import com.fxy.putOut.QualityInspectionMainActivity;
+import com.fxy.utils.AudioRecoderUtils;
+import com.google.gson.Gson;
+import com.google.zxing.Result;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.lzy.okgo.OkGo;
+import com.lzy.okgo.model.Response;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.File;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import butterknife.Unbinder;
+import sto.android.app.StoJNI;
+import sto.android.app.StoPdaKeyEvent;
+import sto.android.app.StoTongJNI;
+
+public class WorkOrderOptMainActivity extends  BaseActivity implements StoJNI.ScanCallBack{
+
+    /**
+     * 列表适配器
+     */
+    Context mContext = this;
+
+    @BindView(R.id.ll_take_picture)
+    LinearLayout llTakePicture;
+
+    @BindView(R.id.ll_audio_area)
+    LinearLayout llAudioArea;
+
+    @BindView(R.id.ll_remark_info)
+    LinearLayout llRemarkInfo;
+
+    @BindView(R.id.btn_confirm)
+    TextView btnConfirm;
+
+
+
+    @BindView(R.id.et_remark)
+    EditText etRemark;
+
+
+
+    private ArrayList photoList =new ArrayList<>();
+    private ArrayList speakList =new ArrayList<>();
+
+    private PictureSelectorUpload currentUpload;
+    private PictureSelectorUpload pictureSelectorUpload;
+    private PictureSelectorUpload audioSelectorUpload;
+    //
+    //扫码扫码动作
+    private ScanBean scanBean;
+
+
+
+    protected String action;
+
+    private boolean isOk = true;
+
+    private Unbinder unbinder;
+
+    private JSONObject postParam = new JSONObject();
+
+    private String actionUrl = "";
+    private String trackingNumber = "";
+
+    @Override
+    public int getContentViewResId() {
+        return R.layout.activity_fxy_work_order_opt;
+    }
+
+    @Override
+    public boolean showToolBar() {
+        return true;
+    }
+
+    @Override
+    public boolean openEventBus() {
+        return true;
+    }
+
+    @Override
+    protected void getBundleExtras(Bundle bundle) {
+        XLog.e("接收数据解析:",bundle);
+        action = bundle.getString("action","add");
+        trackingNumber = bundle.getString("tracking_number","");
+        actionUrl = action.equals("handle") ? Urls.FXY_WORK_FINISH : Urls.FXY_ADD_WORK;
+    }
+
+
+
+    //finish的返回监听
+    //这里的requestCode参数,就是上面设置的 1 ,当跳转的页面返回的时候,通过这个加以判断
+    //resultCode ,这个参数是在跳转的页面里面规定的,它也是一个int类型的标志
+    //第三个参数包含了返回的值
+    //如果不需要所跳转的页面返回值,也就不需要这个方法了
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        if (resultCode == RESULT_OK) {
+            if (requestCode == PictureConfig.CHOOSE_REQUEST) {// 图片选择结果回调
+                currentUpload.getSelectImg(data);
+            }
+        }
+    }
+
+    /**
+     * EventBus接收信息的方法,开启后才会调用(非粘性事件)
+     *
+     * @param event
+     */
+    @Override
+    protected void EventBean(BaseEventBusBean event) {
+//        XLog.e("----------接收返回--------------");
+//        XLog.e("接收返回:"+event.getEventCode());
+        if (event != null && event.getEventCode() == EventCode.displacement_refresh){
+
+        }
+    }
+
+    @Override
+    public boolean isPlayMusic() {
+        return true;
+    }
+
+
+    @Override
+    protected void initView() {
+        unbinder = ButterKnife.bind(this);
+        setTitleName(action.equals("handle") ? "处理工单":"添加工单");
+
+        initEdit();
+        iniData();
+
+
+        RecyclerView rvShowImg = (RecyclerView)llTakePicture.findViewById(R.id.rv_show_img);
+        RecyclerView rvShowAudio = (RecyclerView)llAudioArea.findViewById(R.id.rv_show_img);
+        pictureSelectorUpload  = setItemPicture("photo",rvShowImg,9,PictureConfig.TYPE_IMAGE);
+        audioSelectorUpload  = setItemPicture("audio",rvShowAudio,1,PictureConfig.TYPE_AUDIO);
+
+
+
+        audioSelectorUpload.setPictureType(PictureConfig.TYPE_AUDIO);
+
+
+        if(ContextCompat.checkSelfPermission(mContext, android.Manifest.permission.RECORD_AUDIO)
+                != PackageManager.PERMISSION_GRANTED){
+            ActivityCompat.requestPermissions(WorkOrderOptMainActivity.this,new String[]{
+                    android.Manifest.permission.RECORD_AUDIO},1254);
+        }
+
+
+    }
+
+
+
+    /**
+     * 设置多个上传文件
+     * @param actionType String
+     * @param showImg RecyclerView
+     */
+    private PictureSelectorUpload setItemPicture(String actionType,RecyclerView showImg,int maxNum,int pictureType){
+        PictureSelectorUpload pictureUpload = new PictureSelectorUpload(WorkOrderOptMainActivity.this,showImg,"work",maxNum,pictureType);
+        pictureUpload.setActionType(actionType);
+        pictureUpload.setCompress(true,100,500);
+
+        pictureUpload.setOnChangeListener(new PictureSelectorUpload.UploadChangeListener() {
+            @Override
+            public void uploadResult(boolean State,String actionType) {
+                if (State) {
+                    System.out.println("文件上传回调成功");
+                } else {
+                    System.out.println("文件上传失败");
+                }
+            }
+
+            @Override
+            public void uploadActionType(String actionType) {
+
+                System.out.println("actionType:"+actionType);
+                switch (actionType){
+                    case "photo":
+                        currentUpload = pictureSelectorUpload;
+                        break;
+                    case "audio":
+                        currentUpload = audioSelectorUpload;
+                        break;
+                }
+
+            }
+        });
+
+        //showImg.onTouchEvent()
+        return  pictureUpload;
+    }
+
+
+    @Override
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        //XLog.e("event:"+event.getKeyCode());
+        if ((event.getKeyCode()==KeyEvent.KEYCODE_DPAD_CENTER || event.getKeyCode()==KeyEvent.KEYCODE_ENTER )  && event.getAction() == KeyEvent.ACTION_DOWN){
+            //按确定键
+            if(this.validate()){
+                workFinish();
+            }
+        }
+        return super.dispatchKeyEvent(event);
+    }
+
+    //监听按键
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        XLog.e("监听按键:"+keyCode);XLog.e(event);
+        if (scanBean.getIsBroadcast()==0 && StoTongJNI.getIns(mContext).getEventFuction(keyCode)  == StoPdaKeyEvent.KEYCODE_SCAN
+                && event.getRepeatCount() == 0) {
+
+            if (StoTongJNI.getIns(mContext).GetScannerIsScanning()) {
+//
+            } else {
+                StoTongJNI.getIns(mContext).SetScannerStart();
+            }
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+    @SuppressLint("HandlerLeak")
+    Handler scanHandler = new Handler() {
+
+        @Override
+        public void handleMessage(Message msg) {
+            // TODO Auto-generated method stub
+            if (msg.obj != null) {
+
+                String scanResult = msg.obj.toString().trim();
+                if (!scanResult.isEmpty()){
+                    setScanResult(scanResult);
+                }
+            }
+
+        }
+
+    };
+    @Override
+    public void onScanResults(String str) {
+        Message msg = new Message();
+        msg.obj = str;
+        scanHandler.sendMessage(msg);
+
+
+    }
+
+
+    @Override
+    public void onScanResults(String str, int type) {
+
+    }
+    /**
+     * 定义广播接受
+     */
+    BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String scanResult = intent.getStringExtra(scanBean.getDataName());
+            if (scanResult==null){return; }
+            String scanStatus = "";
+            if (!scanBean.getStatusName().isEmpty()){
+                scanStatus = intent.getStringExtra(scanBean.getStatusName());
+            }else{
+                scanStatus = scanResult.isEmpty()? "" : "ok"; //有值 默认是扫码成功;
+            }
+
+            //新大陆(MT65,MT90) 需要手动关闭
+            if (!scanBean.getActionStop().isEmpty()){
+                Intent stopIntent = new Intent(scanBean.getActionStop());
+                mContext.sendBroadcast(stopIntent);
+            }
+
+            if ("ok".equals(scanStatus)){
+                setScanResult(scanResult);
+            }else{
+                showErrorToast(getString(R.string.scan_failed));
+            }
+        }
+    };
+
+    /**
+     * 注册广播
+     */
+    private void initReceiver(){
+
+        try {
+
+            String scanStr = getScanSetting();
+            scanBean = JsonUtil.getObject(scanStr, ScanBean.class);
+            Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
+
+            if (is_broadcast ==1){
+                IntentFilter mFilter = new IntentFilter(scanBean.getAction());
+                this.registerReceiver(mReceiver, mFilter);
+            }else{
+                //不广播进行处理 jni模式
+                String pdaBrand = StoTongJNI.getmPdaBrand();
+                if (!pdaBrand.isEmpty()){
+                    StoTongJNI.getIns(this).setmScanCB(this);
+                    StoTongJNI.getIns(this).SetScannerOn();
+                }
+            }
+
+
+        }catch (Exception e) {
+            showErrorToast("获取扫码配置失败"+e.getMessage());
+            XLog.e("获取扫码配置失败:" + e.getMessage());
+        }
+    }
+
+    private void initEdit() {
+
+    }
+
+
+    private void iniData(){
+
+    }
+
+
+
+    private OnRxScanerListener mScanerListener = new OnRxScanerListener() {
+        @Override
+        public void onSuccess(String type, Result result) {
+            String scanResult = result.getText();
+            switch (type){
+                case BaseConfig.COMMON_SCANNER_ONLY:
+                    setScanResult(scanResult);
+
+                    break;
+            }
+        }
+        @Override
+        public void onFail(String type, String message) {
+
+        }
+    };
+
+    //把扫描结果赋值
+    private void setScanResult(String scanResult){
+        //获取焦点的view对象
+        View view=getWindow().getDecorView().findFocus();
+        //如果是EditText
+        if(view instanceof EditText)
+        {
+            ((EditText) view).setText(scanResult);
+
+            switch (view.getId()) {
+
+                default:
+            }
+
+
+        }
+    }
+
+
+    private void workFinish(){
+        if (!validate()){
+            return;
+        }
+        //数据检查不通过
+
+        if (!checkRepeat(actionUrl+(postParam.toString()))){
+            Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
+            return;
+        }
+
+
+        if (!isOk){  Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show(); return;}
+        isOk = false;
+        OkGo.<String>post(Urls.getServiceAddress(this) + actionUrl).upJson(postParam)
+                .execute(new MyDialogCallback(this, true, true) {
+                    @Override
+                    public void onSuccess(Response<String> response) {
+                        isOk = true;
+                        super.onSuccess(response);
+                        try {
+                            ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
+                            if(bean.code == 1){
+                                showSuccessToast(bean.msg);
+                                Intent intent = new Intent();
+                                intent.putExtra("opt_status", "success");
+                                setResult(200, intent);//返回值,200 是改返回的标志,也会返回
+                                finish();
+
+                            }else{
+                                showWarningToast(bean.msg);
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                            XLog.e("添加理货数据结果返回错误",e.getMessage());
+                        }
+                    }
+                });
+    }
+
+
+    /*
+     * 校验必录
+     */
+    private boolean validate(){
+        photoList = pictureSelectorUpload.getPhotoList();
+        speakList = audioSelectorUpload.getPhotoList();
+        try {
+            postParam = new JSONObject();
+            if (action.equals("handle")){
+                postParam.put("tracking_number",trackingNumber);
+            }
+
+            //检查是否拍照  工单处理时拍照拍照非必传
+            if (!action.equals("handle") && photoList.size()==0){
+                showWarningToast("请拍照上传");
+                return false;
+            }
+            Gson gson = new Gson();
+            postParam.put("photo",gson.toJson(photoList));
+            postParam.put("speak_file",gson.toJson(speakList));
+
+        } catch (JSONException e) {
+            showWarningToast("系统异常"+e.getMessage());
+            e.printStackTrace();
+            return false;
+        }
+
+
+
+        return true;
+    }
+
+    //sIsGoodinfoMatch,sIsBattery,sIsMagnetic,sIsWood,sIsExtra,sIsOther
+    @OnClick({R.id.btn_confirm})
+    public void onViewClicked(View view) {
+        Bundle bundle = new Bundle();
+        switch (view.getId()) {
+            case R.id.btn_confirm:
+                workFinish();
+            default:
+                break;
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        unbinder.unbind();
+        pictureSelectorUpload.removeHandler();
+        super.onDestroy();
+    }
+    @Override
+    protected void onResume() {
+        super.onResume();
+        initReceiver();
+    }
+    @Override
+    protected void onPause() {
+        super.onPause();
+        //销毁在onResume()方法中的广播
+        try {
+            //停止扫描
+            Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
+            if (is_broadcast==0){
+                StoTongJNI.getIns(mContext).SetScannerStop();
+                StoTongJNI.getIns(mContext).SetScannerOff();
+            }else{
+                unregisterReceiver(mReceiver);
+            }
+        }catch (Exception e){
+            XLog.e("销毁广播失败:",e.getMessage());
+        }
+    }
+
+}

BIN
app/src/main/res/drawable-xhdpi/recod_start_f01.png


+ 7 - 0
app/src/main/res/drawable/layer_recording_animation.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item android:id="@android:id/background" android:drawable="@mipmap/icon_microphone_normal" />
+    <item android:id="@android:id/progress" >
+        <clip android:drawable="@mipmap/icon_microphone_recoding" android:gravity="bottom" android:clipOrientation="vertical" />
+    </item>
+</layer-list>

+ 5 - 0
app/src/main/res/drawable/shape_window_background.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#f5f5f5" />
+    <corners android:radius="6dp" />
+</shape>

+ 167 - 0
app/src/main/res/layout/activity_fxy_work_order_opt.xml

@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@color/md_grey_100"
+    android:orientation="vertical">
+    <ScrollView
+        android:id="@+id/ll_scroll_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:scrollbars="none">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+
+
+            <LinearLayout
+                android:id="@+id/ll_take_picture"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:visibility="visible"
+                android:orientation="vertical">
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/dp_10"
+                    android:layout_marginRight="@dimen/dp_10"
+                    android:background="@null"
+                    android:padding="@dimen/dp_10"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
+                    <TextView
+                        style="@style/fontSize"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:textStyle="bold"
+                        android:text="拍照">
+                    </TextView>
+                </LinearLayout>
+                <include layout="@layout/fragment_show_img"/>
+            </LinearLayout>
+
+
+
+            <LinearLayout
+                android:id="@+id/ll_audio_area"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:visibility="visible"
+                android:orientation="vertical">
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/dp_10"
+                    android:layout_marginRight="@dimen/dp_10"
+                    android:background="@null"
+                    android:padding="@dimen/dp_10"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
+                    <TextView
+                        style="@style/fontSize"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:textStyle="bold"
+                        android:text="语音">
+                    </TextView>
+                </LinearLayout>
+                <include layout="@layout/fragment_show_img"/>
+            </LinearLayout>
+
+
+
+
+            <LinearLayout
+                android:id="@+id/ll_remark_info"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:visibility="gone"
+                android:orientation="vertical">
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="4dp"
+                    android:background="@color/md_grey_100" />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/dp_10"
+                    android:layout_marginRight="@dimen/dp_10"
+                    android:background="@null"
+                    android:padding="@dimen/dp_10"
+                    android:gravity="center_vertical"
+                    android:orientation="vertical">
+                    <TextView
+                        style="@style/fontSize"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:textStyle="bold"
+                        android:text="备注">
+                    </TextView>
+                </LinearLayout>
+
+
+                <View
+                    android:layout_width="match_parent"
+                    android:layout_height="4dp"
+                    android:background="@color/md_grey_100" />
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/dp_10"
+                    android:layout_marginRight="@dimen/dp_10"
+                    android:layout_marginTop="@dimen/dp_4"
+                    android:layout_marginBottom="@dimen/dp_4"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal"
+                    >
+                    <EditText
+                        style="@style/fontSize"
+                        android:id="@+id/et_remark"
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:background="@color/white"
+                        android:gravity="left|top"
+                        android:hint="请输入备注信息"
+                        android:minHeight="150dp"
+                        android:padding="10dp"
+                        android:textColor="@color/font_color_6"
+                         />
+                </LinearLayout>
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/dp_10"
+                android:layout_marginTop="@dimen/dp_10"
+                android:layout_marginRight="@dimen/dp_10"
+                android:layout_marginBottom="@dimen/dp_4"
+                android:background="@drawable/bg_white_et"
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:padding="10dp">
+                <TextView
+                    style="@style/fontSize"
+                    android:id="@+id/btn_confirm"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginLeft="@dimen/dp_10"
+                    android:layout_marginRight="@dimen/dp_10"
+                    android:background="@drawable/bg_orange_item"
+                    android:gravity="center"
+                    android:text="提交"
+                    android:padding="10dp"
+                    android:textColor="@color/white"
+                    android:visibility="visible" />
+            </LinearLayout>
+
+
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>

+ 70 - 0
app/src/main/res/layout/activity_fxy_work_order_start.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:background="@color/md_grey_100"
+    android:orientation="vertical">
+    <LinearLayout
+        style="@style/FromLinearLayoutItem"
+        android:orientation="horizontal">
+        <EditText
+            style="@style/EditTextStyle"
+            android:id="@+id/et_order_no"
+            android:hint="@string/hint_please_scan_no"
+            android:text=""/>
+        <ImageButton
+            style="@style/ClearImg"
+            android:id="@+id/ib_order_no_clear"/>
+        <include layout="@layout/item_image_code" />
+    </LinearLayout>
+
+
+    <LinearLayout
+        style="@style/FromLinearLayoutItem"
+        android:background="@null"
+        android:orientation="horizontal">
+        <TextView
+            android:id="@+id/tv_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text=""
+            android:hint="显示操作指令"
+            android:gravity="center_vertical"
+            android:textColor="@color/md_red_500"
+            android:textSize="@dimen/t14" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/ll_next_action"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/dp_10"
+        android:layout_marginTop="@dimen/dp_10"
+        android:layout_marginRight="@dimen/dp_10"
+        android:layout_marginBottom="@dimen/dp_4"
+        android:background="@drawable/bg_white_et"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:visibility="gone"
+        android:padding="10dp">
+        <TextView
+            style="@style/fontSize"
+            android:id="@+id/btn_confirm"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/dp_10"
+            android:layout_marginRight="@dimen/dp_10"
+            android:background="@drawable/bg_orange_item"
+            android:gravity="center"
+            android:text="下一步"
+            android:padding="10dp"
+            android:textColor="@color/white"
+            android:visibility="visible" />
+    </LinearLayout>
+
+    <include layout="@layout/item_float_image" />
+
+</LinearLayout>

+ 32 - 0
app/src/main/res/layout/audio_recoder_dialog.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <LinearLayout
+        android:background="@drawable/shape_window_background"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:orientation="vertical"
+        android:gravity="center"
+        android:padding="16dp" >
+
+        <ImageView
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:id="@android:id/progress"
+            android:src="@drawable/layer_recording_animation" />
+
+        <TextView
+            android:layout_height="wrap_content"
+            android:layout_marginTop="6dp"
+            android:id="@android:id/text1"
+            android:layout_width="114dp"
+            android:gravity="center"
+            android:textSize="16sp"
+            android:text="00:00" />
+    </LinearLayout>
+</LinearLayout>

+ 33 - 0
app/src/main/res/layout/dialog_audio_recoder.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:gravity="center"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" >
+
+    <LinearLayout
+        android:background="@drawable/shape_window_background"
+        android:layout_height="wrap_content"
+        android:layout_width="wrap_content"
+        android:orientation="vertical"
+        android:gravity="center"
+        android:padding="16dp" >
+
+        <ImageView
+            android:layout_width="48dp"
+            android:layout_height="48dp"
+            android:id="@android:id/progress"
+            android:src="@drawable/layer_recording_animation" />
+
+        <TextView
+            android:layout_height="wrap_content"
+            android:layout_marginTop="6dp"
+            android:id="@android:id/text1"
+            android:layout_width="114dp"
+            android:textColor="#FFFFFF"
+            android:gravity="center"
+            android:textSize="16sp"
+            android:text="00:00" />
+    </LinearLayout>
+</LinearLayout>

+ 23 - 0
app/src/main/res/layout/fragment_homepager.xml

@@ -251,6 +251,27 @@
                     android:visibility="gone"
                     android:textStyle="bold" />
 
+                <TableRow
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="@dimen/t12"
+                    android:weightSum="2">
+
+                    <TextView
+                        style="@style/ImageViewWithTextStyle.FontSize"
+                        android:id="@+id/ivt_add_work_order"
+                        android:drawableTop="@drawable/ic_mapan"
+                        android:drawablePadding="5dp"
+                        android:text="添加工单" />
+                    <TextView
+                        style="@style/ImageViewWithTextStyle.FontSize"
+                        android:id="@+id/ivt_handle_work_order"
+                        android:drawableTop="@drawable/ic_mapan"
+                        android:drawablePadding="5dp"
+                        android:text="处理工单" />
+
+                </TableRow>
+
                 <TableRow
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
@@ -266,6 +287,8 @@
 
 
                 </TableRow>
+
+
             </LinearLayout>
         </LinearLayout>
     </ScrollView>

+ 35 - 0
app/src/main/res/layout/fragment_show_audio.xml

@@ -0,0 +1,35 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/rl_show_img"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingLeft="10dp"
+    android:paddingRight="10dp"
+    android:orientation="vertical">
+    <LinearLayout
+        android:id="@+id/ll_add_img"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="5dp"
+        android:background="@color/white"
+        android:orientation="vertical"
+        android:padding="@dimen/dp_10"
+        >
+
+
+        <TextView
+            android:visibility="gone"
+            style="@style/TextFront"
+            android:layout_width="wrap_content"
+            android:text="查看音频"
+            />
+
+        <android.support.v7.widget.RecyclerView
+            android:id="@+id/rv_show_audio"
+            android:layout_below="@+id/title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+        </android.support.v7.widget.RecyclerView>
+
+    </LinearLayout>
+</RelativeLayout>

BIN
app/src/main/res/mipmap-xhdpi/icon_microphone_normal.png


BIN
app/src/main/res/mipmap-xhdpi/icon_microphone_recoding.png


+ 2 - 2
config.gradle

@@ -8,8 +8,8 @@ ext {
             minSdkVersion    : 17,
             targetSdkVersion : 23,
             versionCode      : 1,
-            versionName      : "2.4.1",
-            versionApi       : "2.4",
+            versionName      : "2.5.0",
+            versionApi       : "2.5",
     ]
 
     dependencies = [