package com.jqyd.son; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; import com.jqyd.app.BitmapUtils; import com.jqyd.app.GetDistance; import com.jqyd.app.LocationUtils; import com.jqyd.app.MyApp; import com.jqyd.app.PublicDeal; import com.jqyd.app.ShareMethod; import com.jqyd.camera.PhotoUtil; import com.jqyd.camera.UIUtil; import com.jqyd.manager.R; import com.jqyd.manager.Xxfk; import com.jqyd.model.LocationModule; import com.jqyd.model.RecordModel; import com.jqyd.shareInterface.Baidu_location; import com.jqyd.shareInterface.CheckState_interface; import com.jqyd.shareInterface.GpsService; import com.jqyd.shareInterface.Optdb_interfce; import com.jqyd.shareInterface.Optsharepre_interface; import com.jqyd.shareInterface.SystemInfo; import com.jqyd.shareInterface.UpdataToServer; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.location.LocationManager; import android.media.MediaScannerConnection; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.provider.MediaStore; import android.provider.Settings; import android.provider.MediaStore.Audio.Media; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class VisCust extends Activity implements OnClickListener { private TextView khmc; private TextView lxr; private TextView lxdh; private TextView lxdz; private EditText bfnr; private Button ksbf; private Button jsbf; private Button pz; private String bfnrStr;//拜访内容 private String custId = ""; private double cuLon = 0.0;// 客户真实经度 private double cuLat = 0.0;// 客户真实纬度 private double cuClon = 0.0;// 客户粗经度 private double cuClat = 0.0;// 客户粗纬度 private int dislimit = 0; private MyApp myApp; private Optdb_interfce db = null; private Optsharepre_interface share_obj = null; private int bf_point = 1;// 1、开始拜访2、结束拜访 private int type = 1;// 1、客户走访2、二次回访 private static String imagePath; private static String imagePath_new; private Bundle bundle = null; private String jhid = "-1"; int param = 2; private KhbfThread khbfThread = null; private String log = "";//记录日志 private ShareMethod shareMethod = null; private final String TAG = "KHBF"; private Baidu_location baidu=null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.viscust); shareMethod = new ShareMethod(VisCust.this); share_obj = new Optsharepre_interface(VisCust.this); shareMethod.recordLog("istakephoto::___"+share_obj.getDataFromPres("istakephoto")); if(share_obj.getDataFromPres("istakephoto").equals("1")){ share_obj.editPres("istakephoto", "0"); shareMethod.recordLog("提示手机内存不足istakephoto::___"+share_obj.getDataFromPres("istakephoto")); UIUtil.showMsg(VisCust.this, "手机内存不足,拍照失败"); finish(); } khmc = (TextView) this.findViewById(R.id.khmc); lxr = (TextView) this.findViewById(R.id.lxr); lxdh = (TextView) this.findViewById(R.id.lxdh); lxdz = (TextView) this.findViewById(R.id.lxdz); bfnr = (EditText) this.findViewById(R.id.bfnr); ksbf = (Button) this.findViewById(R.id.ksbf); jsbf = (Button) this.findViewById(R.id.jsbf); pz = (Button) this.findViewById(R.id.pz); ksbf.setOnClickListener(this); jsbf.setOnClickListener(this); pz.setOnClickListener(this); myApp = (MyApp) this.getApplication(); if (myApp.getModuleName().equals("sczf")) { type = 1; } else if (myApp.getModuleName().equals("echf")) { type = 2; } Intent intent = this.getIntent(); jhid = intent.getStringExtra("jhid"); Bundle bundle = intent.getExtras(); khmc.setText(bundle.getString("cname")); lxr.setText(bundle.getString("linkman")); lxdh.setText(bundle.getString("link_sim")); lxdz.setText(bundle.getString("address")); custId = bundle.getString("cid"); dislimit = Integer.parseInt(share_obj .getDataFromPres("DISLIMIT")); // 暂时性的容错处理 String lonStr = bundle.getString("lon"); String latStr = bundle.getString("lat"); String clonStr = bundle.getString("clon"); String clatStr = bundle.getString("clat"); System.out.println("ceshi------------------------" + lonStr + "," + latStr); if (lonStr == null || lonStr.equals("")) { lonStr = "0.0"; } if (latStr == null || latStr.equals("")) { latStr = "0.0"; } if (clonStr == null || clonStr.equals("")) { clonStr = "0.0"; } if (clatStr == null || clatStr.equals("")) { clatStr = "0.0"; } cuLon = Double.parseDouble(lonStr); cuLat = Double.parseDouble(latStr); cuClon = Double.parseDouble(clonStr); cuClat = Double.parseDouble(clatStr); // 判断是否已经开始拜访 db = new Optdb_interfce(VisCust.this); String content = db.selectBfRecord(custId); db.close_SqlDb(); //如果没有内容的话,就不显示 if(content!=null&&!content.equals("无")){ bfnr.setText(content); } if (content!=null&&!"".equals(content)) { jsbf.setVisibility(Button.VISIBLE); } else { jsbf.setVisibility(Button.GONE); } //注册百度 baidu = new Baidu_location(VisCust.this); } @Override public void onClick(View v) { //先获取拜访内容 if(bfnr.getText().toString().trim().equals("")){ bfnrStr="无"; }else{ bfnrStr=bfnr.getText().toString(); } if (v == ksbf) { bf_point = 1; khbfThread = new KhbfThread(); khbfThread.start(); } else if (v == jsbf) { bf_point = 2; new KhbfThread().start(); } else if (v == pz) { takePhotos(); } } class KhbfThread extends Thread { @Override public void run() { // TODO Auto-generated method stub super.run(); Looper.prepare(); String upResult = ""; Message message = new Message(); message.what = 1; myHander.sendMessage(message); Message message2 = new Message(); param = 2; Bundle bundle = new Bundle(); // 获取基站相关信息 LocationModule loc = new LocationUtils(VisCust.this).takeCellInfos(); LocationUtils locationUtils=new LocationUtils(VisCust.this); boolean b=locationUtils.getLocation(loc, "All",custId,baidu); if(b){ //位置获取成功 int state=loc.getState(); shareMethod.recordLog("状态::"+state); boolean up=true;//默认上传 if(state==2){ // 百度获取位置成功 if (!flagDistance(loc.getLon(), loc.getLat(), 3)) {// 百度获得的位置超出误差范围,获取卫星位置 System.out .println("******************百度获取到位置超出距离,请求卫星******************"); boolean b2=locationUtils.getLocation(loc, "onlyGps","",baidu); if(b2){ if (!flagDistance(loc.getLon(), loc.getLat(), 1)) {// 卫星位置判断误差 System.out .println("******************卫星获取到位置超出距离******************"); upResult = "-888"; up=false; } }else{ int s=loc.getState(); if(s==-1){ upResult = "-888"; //记录日志 log = "GPS模块未打开,获取位置失败!"; shareMethod.recordLog(log); up=false; }else if(s==0){ System.out .println("******************通过卫星获取位置信息失败******************"); upResult = "-888"; //记录日志 log = "通过卫星获取位置信息失败!"; shareMethod.recordLog(log); up=false; } } } }else if(state==1){ //卫星获取位置成功 if (!flagDistance(loc.getLon(), loc.getLat(), 1)) {// 卫星位置判断误差 System.out .println("******************卫星获取到位置超出距离******************"); upResult = "-888"; up=false; } } shareMethod.recordLog("是否上报::"+up); // 上报位置 if(up){ upResult = upVisInfo(loc); } shareMethod.recordLog("上报结果::"+upResult); }else{ //位置获取失败 upResult = "-999"; shareMethod.recordLog("获取位置失败::"+upResult); } shareMethod.recordLog("upresult————————::"+upResult); if (upResult.equals("-999")) { upResult= "位置获取失败,请稍后重新操作!"; } else if (upResult.equals("-888")) { upResult= "超出管理员设置的误差范围" + dislimit + "米,请走近客户进行操作!"; } bundle.putString("msg", upResult); message2.setData(bundle); message2.what = param; myHander.sendMessage(message2); Looper.loop(); } } /** * 上传拜访信息 * * @param loc * @param dw_type * @return */ public String upVisInfo(LocationModule loc) { String result = "-1"; db = new Optdb_interfce(VisCust.this); // 获得登录者姓名 String userName = db.searchEmpName(share_obj.getDataFromPres("GUID")); db.close_SqlDb(); JSONObject object = new JSONObject(); try { object.put("cosim", share_obj.getDataFromPres("COSIM")); object.put("regsim", share_obj.getDataFromPres("REGSIM")); object.put("cid", custId); object.put("time", loc.getTime()); object.put("lon", loc.getLon()); object.put("lat", loc.getLat()); object.put("cell_id", loc.getCell_id()); object.put("lac_code", loc.getLac()); object.put("country_code", loc.getCcode()); object.put("ncode", loc.getNcode()); object.put("signal_strength", loc.getXhqd()); object.put("loc_method", loc.getDw_type()); object.put("radius", loc.getRadius()); object.put("yys", loc.getYys()); object.put("isfirst", bf_point + ""); object.put("type", type + ""); object.put("content", bfnrStr); object.put("gguid", share_obj.getDataFromPres("GGUID")); object.put("guid", share_obj.getDataFromPres("GUID")); object.put("cname", khmc.getText().toString()); object.put("zdmc", userName); object.put("jhid", jhid); } catch (JSONException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } UpdataToServer server = new UpdataToServer(VisCust.this); // 请求服务器 result = server.dataToServer("KHZF", object); //记录日志 log = "《客户走访/二次回访》-----"+"定位方式:"+loc.getDw_type()+",经度:"+loc.getLon()+",纬度:"+loc.getLat()+",上传结果:"+result; Log.i(TAG, log); shareMethod.recordLog(log); if (result != null && !result.equals("-1") && !result.equals("500")) { try { JSONObject obj = new JSONObject(result); String res = obj.getString("result"); String retMsg = obj.getString("detail"); if (res.equals("0")) { db = new Optdb_interfce(VisCust.this); // 判断是初次拜访还是结束拜访 if (bf_point == 1) {// 开始拜访 db.updateBfRecord("add", custId,bfnrStr); } else if (bf_point == 2) {// 结束拜访 db.updateBfRecord("delete", custId,""); } db.close_SqlDb(); } result = retMsg; } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { param = 3; failToSave(object); } return result; } /** * 误差距离判断 * * @param lon * @param lat */ public boolean flagDistance(double lon, double lat, int dwType) { log = "《客户走访/二次回访》-----"+"定位方式:"+dwType+",经度:"+lon+",纬度:"+lat; boolean b=true;//默认在误差范围内 double distance = 0.0; switch (dwType) { case 1:// 卫星位置判断 // 如果客户的真实经纬度为空,则需要加对客户加密过后的经纬度加密比较 if (cuLon == 0.0 || cuLat == 0.0) { PublicDeal pd = new PublicDeal(); Map map = pd.jp(lon, lat); double clon = Double.parseDouble((String) map.get("x")); double clat = Double.parseDouble((String) map.get("y")); distance = GetDistance.getDistance(clon, clat, cuClon, cuClat); log+=",客户端对客户加过密后的经度:"+clon+",纬度:"+clat+",误差结果:"+distance; } else { distance = GetDistance.getDistance(lon, lat, cuLon, cuLat); log+=",客户真实经度:"+cuLon+",真实纬度:"+cuLat+",误差结果:"+distance; } break; case 3:// 百度位置判断 distance = GetDistance.getDistance(lon, lat, cuClon, cuClat); log+=",客户加过密后的经度:"+cuClon+",纬度:"+cuClat+",误差结果:"+distance; break; } //记录日志 Log.i(TAG, log); shareMethod.recordLog(log); if (distance > dislimit){ b=false; } shareMethod.recordLog("误差距离::"+distance+"__设定的距离为:___"+dislimit+"__结果为::____"+b); return b; } /** * 上传失败后保存 */ public void failToSave(final JSONObject object) { new AlertDialog.Builder(VisCust.this).setTitle("提示") .setMessage("上传失败,是否保存?") .setPositiveButton("保存", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { ArrayList<Object> list = new ArrayList<Object>(); RecordModel record = new RecordModel(); try { String time = ""; if (object.getLong("time") != 0) { time = object.getLong("time") + ""; } else { time = new Date().getTime() + ""; } record.setAdd_time(time); record.setCcode(object.getString("country_code")); record.setCid(object.getString("cell_id")); record.setContent(object.getString("content")); record.setCustid(object.getString("cid")); record.setJclb(object.getString("yys"));// 保存运营商字段值 record.setLac(object.getString("lac_code")); record.setLat(object.getDouble("lat") + ""); record.setLon(object.getDouble("lon") + ""); record.setNcode(object.getString("ncode")); record.setRaduis(object.getString("radius")); record.setWzbs(object.getString("loc_method"));// 保存位置获取方式 record.setXhqd(object.getString("signal_strength")); record.setXxcjlb(object.getString("jhid"));// 保存计划id record.setResult(object.getString("isfirst"));// 1、开始拜访2、结束拜访 record.setRemark2(object.getString("cname"));// 保存客户名称 if (type == 1) {// 1、客户走访2、二次回访 record.setGid("4"); } else { record.setGid("6"); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } list.add(record); db = new Optdb_interfce(VisCust.this); db.updateToDb("T_RECORDS", list); db.close_SqlDb(); Toast.makeText(VisCust.this, "保存成功", Toast.LENGTH_SHORT) .show(); } }).setNegativeButton("取消", null).show(); } Handler myHander = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); try { switch (msg.what) { case 1: showDialog(1); break; case 2: removeDialog(1); Bundle bundle = msg.getData(); showToast(bundle.getString("msg")); break; case 3: removeDialog(1); break; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("显示或取消运行框时出现异常"); } } }; /** * 拍照按钮 */ public void takePhotos() { shareMethod.recordLog("客户拜访开始拍照"); if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Toast.makeText(this, "SD卡不可用", Toast.LENGTH_SHORT).show(); return; } share_obj.editPres("istakephoto", "1"); SimpleDateFormat timeStampFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String filename = timeStampFormat.format(new Date()); try{ ContentValues values = new ContentValues(); values.put(Media.TITLE, filename); Uri photoUri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if(photoUri!=null){ imagePath = getRealPathFromURI(photoUri, getContentResolver()); }else{ imagePath=""; } }catch(Exception e){ e.printStackTrace(); imagePath=""; } shareMethod.recordLog("图片地址+"+imagePath); if(!new File(imagePath).exists()){ File dir = new File(PhotoUtil.SDCARD_ROOT_PATH+ PhotoUtil.SAVE_PATH_IN_SDCARD); if(!dir.exists()){ dir.mkdirs(); } imagePath=PhotoUtil.SDCARD_ROOT_PATH+ PhotoUtil.SAVE_PATH_IN_SDCARD+PhotoUtil.createPhotoName(); } shareMethod.recordLog("生成后的图片地址+"+imagePath); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imagePath))); intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0); startActivityForResult(intent, 0); } @SuppressLint("NewApi") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); shareMethod.recordLog("客户拜访-------onactivityresult"); if (requestCode != 0) { return; } else if(resultCode == Activity.RESULT_OK){ BitmapUtils bitmapUtils=new BitmapUtils(VisCust.this); //压缩图片之后保存起来 shareMethod.recordLog("客户拜访-------图片地址::"+imagePath); Bitmap bitmap = bitmapUtils.decodeBitmap(imagePath); shareMethod.recordLog("客户拜访-------生成的图片::"+bitmap); Bitmap bitmap_new = bitmapUtils.zoomBitmap(bitmap); shareMethod.recordLog("客户拜访-------压缩后的图片::"+bitmap_new); try { imagePath_new=bitmapUtils.saveBitmap(bitmap_new); shareMethod.recordLog("客户拜访-------新的地址::"+imagePath_new); } catch (IOException e) { e.printStackTrace(); } if(!imagePath_new.equals("")){ new Thread(new Runnable() { @Override public void run() { Looper.prepare(); File originImage=new File(imagePath); originImage.delete(); Looper.loop(); } }).start(); } db = new Optdb_interfce(VisCust.this); // 获得登录者姓名 String userName = db.searchEmpName(share_obj .getDataFromPres("GUID")); db.close_SqlDb(); bundle = new Bundle(); System.out.println("GetCamera+sendPath:" + imagePath); String path = imagePath_new.equals("")?imagePath:imagePath_new; Intent intent = new Intent(); bundle.putString("imagePath", path); bundle.putString("gguid", share_obj.getDataFromPres("GGUID")); bundle.putString("guid", share_obj.getDataFromPres("GUID")); bundle.putString("cosim", share_obj.getDataFromPres("COSIM")); bundle.putString("regsim", share_obj.getDataFromPres("REGSIM")); bundle.putString("cuLon", cuLon + ""); bundle.putString("cuLat", cuLat + ""); bundle.putString("cuClon", cuClon + ""); bundle.putString("cuClat", cuClat + ""); bundle.putString("cname", khmc.getText().toString()); bundle.putString("zdmc", userName); bundle.putString("cid", custId); bundle.putString("content", bfnrStr); bundle.putString("type", type + ""); bundle.putString("jhid", jhid); intent.putExtras(bundle); shareMethod.recordLog("客户拜访-------拍照结束"); intent.setClass(VisCust.this, PicVist.class); startActivity(intent); shareMethod.recordLog("客户拜访---地址++"+Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath()+"/"+path); MediaScannerConnection.scanFile(VisCust.this, new String[]{path}, null, null); finish(); }else{ Toast.makeText(this, "取消拍照", Toast.LENGTH_SHORT).show(); } } // 获得图片保存的路径 public static String getRealPathFromURI(Uri uri, ContentResolver resolver) { String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = resolver.query(uri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String str = cursor.getString(column_index); cursor.close(); return str; } /** * 登录结果显示 * * @param message */ public void showToast(final String message) { new AlertDialog.Builder(this).setTitle("提示").setMessage(message) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (message.contains("成功")) { finish(); } } }).show(); } @Override protected Dialog onCreateDialog(int id) { // TODO Auto-generated method stub ProgressDialog dialog = new ProgressDialog(this); dialog.setIndeterminate(true); dialog.setCancelable(false); switch (id) { case 1: dialog.setMessage("正在上传,请稍候……"); break; case 2: dialog.setMessage("正在搜索GPS位置,请耐心等待……"); break; } return dialog; } @Override public void finish() { // TODO Auto-generated method stub super.finish(); // 终止上报线程 if (khbfThread != null && khbfThread.isAlive()) { System.out.println("终止上报线程"); try { KhbfThread.currentThread().interrupt(); } catch (Exception e) { // TODO Auto-generated catch block System.out.println("终止线程出现异常"); e.printStackTrace(); } } freeBdListener(); } // 销毁百度定位监听器 public void freeBdListener() { if (baidu != null) { baidu.stopListener(); baidu = null; } } // 返回就关闭activity @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { finish(); } return super.onKeyDown(keyCode, event); } }