--- /dev/null
+package mobile.miki;\r
+\r
+import android.content.Context;\r
+import android.graphics.Color;\r
+import android.graphics.Rect;\r
+import android.location.Criteria;\r
+import android.location.GpsStatus;\r
+import android.location.Location;\r
+import android.location.LocationListener;\r
+import android.location.LocationManager;\r
+import android.os.Bundle;\r
+import android.os.Handler;\r
+import android.os.Message;\r
+import android.os.PowerManager;\r
+import android.provider.Settings;\r
+import android.support.v7.widget.LinearLayoutManager;\r
+import android.support.v7.widget.RecyclerView;\r
+import android.view.View;\r
+import android.widget.TextView;\r
+\r
+\r
+import java.text.DecimalFormat;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.List;\r
+import java.util.Timer;\r
+\r
+import mobile.miki.util.Logger;\r
+\r
+import static android.location.LocationManager.GPS_PROVIDER;\r
+\r
+public class GPSActivity extends BaseActivity {\r
+\r
+ private RecyclerView mRv;\r
+\r
+ private TextView mFix;\r
+ private TextView mStar;\r
+ private TextView mHoop;\r
+ private TextView mSearchCount;\r
+ private boolean showmessage=false;\r
+ private Timer timer;\r
+ final LocationSnrAdapter adapter = new LocationSnrAdapter(testSnrEntriyDate(null));\r
+\r
+\r
+\r
+ @Override\r
+ protected void onCreate(Bundle savedInstanceState) {\r
+ super.onCreate(savedInstanceState);\r
+ setContentView(R.layout.gps_full_test_activity);\r
+\r
+ mRv = (RecyclerView)findViewById(R.id.app_list);\r
+\r
+ mFix=(TextView)findViewById(R.id.ic_lc_fix_value);\r
+ mStar =(TextView) findViewById(R.id.ic_lc_star_value);\r
+ mHoop = (TextView)findViewById(R.id.ic_lc_hoop_value);\r
+ mSearchCount= (TextView)findViewById(R.id.ic_lc_searchCount_value);\r
+ mRv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));\r
+\r
+ mRv.addItemDecoration(new SpacesItemDecoration(10));\r
+ mRv.setAdapter(adapter);\r
+\r
+ mFix.setText("notFixed");\r
+ mStar.setText("0 in 0/ inMap 0");\r
+ mHoop.setText("0.0米");\r
+ mSearchCount.setText("0秒");\r
+ locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);\r
+ startListen();\r
+ }\r
+\r
+ public void on_locating_changed(GPS_locationStatus gps_status) {\r
+\r
+ gps_status_show.numSatelliteList.clear();\r
+ gps_status_show.hdop=gps_status.hdop;\r
+ gps_status_show.locating_status=gps_status.locating_status;\r
+ gps_status_show.satlite_numbss=gps_status.satlite_numbss;\r
+ gps_status_show.search_time_cost=gps_status.search_time_cost;\r
+ gps_status_show.used_gps_numbs=gps_status.used_gps_numbs;\r
+// gps_status_show.numSatelliteList=gps_status.numSatelliteList;\r
+ for (int i=0;i<gps_status.numSatelliteList.size();i++) {\r
+ gps_status_show.numSatelliteList.add(i, new GpsSatellitePriv(gps_status.numSatelliteList.get(i).prn,gps_status.numSatelliteList.get(i).snr));\r
+ }\r
+\r
+ mHandler.sendEmptyMessage(0);\r
+ }\r
+\r
+ public class SpacesItemDecoration extends RecyclerView.ItemDecoration {\r
+ private int space;\r
+\r
+ public SpacesItemDecoration(int space) {\r
+ this.space = space;\r
+ }\r
+\r
+ @Override\r
+ public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {\r
+ outRect.right = space;\r
+ }\r
+ }\r
+ public static String getLocalTime2() { return getLocalTime2(System.currentTimeMillis()); }\r
+\r
+ public static String getLocalTime2(long paramLong) { return (new SimpleDateFormat("MMdd-HHmmss")).format(new Date(paramLong)); }\r
+ public static class GpsSatellitePriv {\r
+ int prn;\r
+ float snr;\r
+ public GpsSatellitePriv(int _prn, float _snr) {\r
+ prn=_prn;\r
+ snr=_snr;\r
+ }\r
+ public int getPrn() {\r
+ return prn;\r
+ }\r
+ public float getSnr() {\r
+ return snr;\r
+ }\r
+ }\r
+ public static class GPS_locationStatus{\r
+ public List<GpsSatellitePriv> numSatelliteList = new ArrayList<GpsSatellitePriv>(); // 卫星信号\r
+ public int used_gps_numbs;\r
+ public float hdop;\r
+ public int satlite_numbss;\r
+ public int search_time_cost;\r
+ public int locating_status;\r
+ }\r
+ public ArrayList<SnrEntriy> testSnrEntriyDate(List<GpsSatellitePriv> gpslist) {\r
+ ArrayList<SnrEntriy> entity = new ArrayList<>();\r
+\r
+ if (gpslist!=null) {\r
+ for (int i = 0; i < gpslist.size(); i++) {\r
+\r
+ float snr=gpslist.get(i).getSnr();\r
+ int prn=gpslist.get(i).getPrn();\r
+ Logger.d("testSnrEntriyDate snr="+snr+",prn="+prn);\r
+ SnrEntriy info = new SnrEntriy(snr,prn , (snr>=40? Color.GREEN:((snr>=25&&snr<40)? Color.YELLOW: Color.RED)));\r
+ entity.add(info);\r
+ }\r
+ }\r
+ return entity;\r
+ }\r
+ PowerManager.WakeLock screenOnWakelock=null;\r
+ @Override\r
+ protected void onResume() {\r
+ super.onResume();\r
+ if (screenOnWakelock==null)\r
+ screenOnWakelock = getScreenOnWakeLock(this,GPSActivity.class.getSimpleName());\r
+\r
+ }\r
+ public static PowerManager.WakeLock getScreenOnWakeLock(Context context, String tag) {\r
+ PowerManager.WakeLock wakeLock = ((PowerManager)(context.getSystemService(Context.POWER_SERVICE))).newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, tag);\r
+ wakeLock.acquire();\r
+ return wakeLock;\r
+ }\r
+ @Override\r
+ protected void onPause() {\r
+ super.onPause();\r
+ if(screenOnWakelock!=null) {\r
+ if (screenOnWakelock.isHeld()) {\r
+ screenOnWakelock.release();\r
+ }\r
+ screenOnWakelock=null;\r
+ }\r
+\r
+\r
+ }\r
+\r
+ @Override\r
+ protected void onDestroy(){\r
+ super.onDestroy();\r
+ stopListen();\r
+\r
+ }\r
+\r
+ private class myGpsListener implements GpsStatus.NmeaListener, LocationListener{\r
+\r
+ @Override\r
+ public void onNmeaReceived(long l, String s) {\r
+ mOnNmeaReceived(l,s);\r
+ }\r
+\r
+ @Override\r
+ public void onLocationChanged(Location location) {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void onStatusChanged(String s, int i, Bundle bundle) {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void onProviderEnabled(String s) {\r
+\r
+ }\r
+\r
+ @Override\r
+ public void onProviderDisabled(String s) {\r
+\r
+ }\r
+ }\r
+\r
+ Handler mHandler=new Handler(new Handler.Callback() {\r
+ @Override\r
+ public boolean handleMessage(Message message) {\r
+\r
+ List<GpsSatellitePriv> gpslist =gps_status_show.numSatelliteList;\r
+ adapter.updateLocationValue(testSnrEntriyDate(gpslist));\r
+ String fixed=new StringBuilder().append(gps_status_show.locating_status>0?\r
+ "Fixed ":"notFixed ").append(getLocalTime2()).toString();\r
+ String satlites=new StringBuilder("used ").append(gps_status_show.used_gps_numbs).append(" in ")\r
+ .append(gps_status_show.numSatelliteList.size()).append("/ inMap ").append(gps_status_show.satlite_numbss).toString();\r
+ String locationTime=new StringBuilder().append(gps_status_show.search_time_cost).append("秒").toString();\r
+ String hdop=new StringBuilder().append(String.valueOf(gps_status_show.hdop)).append("米").toString();\r
+ mFix.setText(fixed);\r
+ mStar.setText(satlites);\r
+ mHoop.setText(hdop);\r
+ mSearchCount.setText(locationTime);\r
+\r
+ return false;\r
+ }\r
+ });\r
+ myGpsListener gpsListener=new myGpsListener();\r
+ private boolean listening=false;\r
+ public boolean startListen() {\r
+\r
+ if (this.listening == false) {\r
+ Settings.Secure.setLocationProviderEnabled(this.getContentResolver(), GPS_PROVIDER, true);\r
+\r
+\r
+ Criteria criteria = new Criteria();\r
+ criteria.setAccuracy(Criteria.ACCURACY_FINE);// 设置为最大精度\r
+ criteria.setAltitudeRequired(false);//不要求海拔信息\r
+ criteria.setBearingRequired(false);// 不要求方位信息\r
+ criteria.setCostAllowed(true);//是否允许付费\r
+ criteria.setPowerRequirement(Criteria.POWER_LOW);// 对电量的要求\r
+\r
+ String provider = locationManager.getBestProvider(criteria, true);\r
+\r
+ Logger.d("GPS StartListen with Provider " + provider);\r
+ this.locationManager.requestLocationUpdates(provider, 0L, 0.0F, gpsListener);\r
+\r
+ this.listening = true;\r
+ longitude = 0;\r
+ latitude = 0;\r
+ searchCout = 0;\r
+ locationFixedCount=0;\r
+\r
+// locationManager.addGpsStatusListener(statusListener);//监听搜星状态\r
+ locationManager.addNmeaListener(gpsListener); //监听NMEA 协议数据。\r
+\r
+ //做个热启动\r
+ return true;//gpsHotStart();\r
+ }else{\r
+ Logger.d(" location listening, skip !");\r
+ return true;\r
+ }\r
+ }\r
+\r
+\r
+ public void stopListen() {\r
+ this.locationManager.removeNmeaListener(gpsListener);\r
+ this.locationManager.removeUpdates(gpsListener);\r
+ this.listening = false;\r
+ Logger.d("stopListen 定位 ");\r
+\r
+ Settings.Secure.setLocationProviderEnabled(this.getContentResolver(), GPS_PROVIDER, false);\r
+\r
+ }\r
+\r
+ private LocationManager locationManager;\r
+ private double longitude;\r
+ private double latitude;\r
+\r
+ private int searchCout=0;\r
+\r
+ private GPS_locationStatus gps_status = new GPS_locationStatus();\r
+ private GPS_locationStatus gps_status_show = new GPS_locationStatus();\r
+\r
+ private static int locationFixedCount=0;\r
+ static int satindex=0;\r
+ public void mOnNmeaReceived(long paramLong, String nmeastr) {\r
+// EqcAlgorithmNative.native_EqcAlgorithmMethod5(paramString);\r
+// ICLogger.i("Nmea :"+nmeastr+" "+paramLong);\r
+\r
+ if(nmeastr.startsWith("$RD_RSSI")) {\r
+\r
+ searchCout++;\r
+ on_locating_changed(gps_status);\r
+ gps_status.numSatelliteList.clear();\r
+ gps_status.search_time_cost=searchCout;\r
+ }\r
+\r
+\r
+ if (nmeastr.startsWith("$GPGLL,")){\r
+ String tmplist[]=nmeastr.split(",");\r
+// GPGLL编辑\r
+//(地理定位信息)\r
+// 例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D\r
+// 字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息\r
+// 字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)\r
+// 字段2:纬度N(北纬)或S(南纬)\r
+// 字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)\r
+// 字段4:经度E(东经)或W(西经)\r
+// 字段5:UTC时间,hhmmss.sss格式\r
+// 字段6:状态,A=定位,V=未定位\r
+// 字段7:校验值($与*之间的数异或后的值)\r
+ String Lat=tmplist[1];\r
+ String lon=tmplist[3];\r
+ String fixed=tmplist[6];\r
+// ICLogger.i("GPGLL Lat="+Lat+",Lon="+lon+",fixed="+fixed);\r
+\r
+ }else if (nmeastr.startsWith("$GPRMC,")) {\r
+// GPRMC编辑\r
+//(推荐定位信息数据格式)\r
+// 例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50\r
+// 字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息\r
+// 字段1:UTC时间,hhmmss.sss格式\r
+// 字段2:状态,A=定位,V=未定位\r
+// 字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)\r
+// 字段4:纬度N(北纬)或S(南纬)\r
+// 字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)\r
+// 字段6:经度E(东经)或W(西经)\r
+// 字段7:速度,节,Knots\r
+// 字段8:方位角,度\r
+// 字段9:UTC日期,DDMMYY格式\r
+// 字段10:磁偏角,(000 - 180)度(前导位数不足则补0)\r
+// 字段11:磁偏角方向,E=东W=西\r
+// 字段12:模式,A=自动,D=差分,E=估测,N=数据无效(3.0协议内容)\r
+// 字段13:校验值($与*之间的数异或后的值)\r
+ String tmplist[]=nmeastr.split(",");\r
+ String utctime=tmplist[1];\r
+ String Lat=tmplist[3];\r
+ String lon=tmplist[5];\r
+ String fixed=tmplist[2];\r
+ String speed=tmplist[7];\r
+// ICLogger.i("GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);\r
+// if (Config.LOG_TOFILE)\r
+// FileOutputUtil.fileOutput(this.runtime.getCacheDir(), "GPS", "GPRMC GPSTime="+utctime+",Lat="+Lat+",Lon="+lon+",fixed="+fixed+",speed="+speed);\r
+ if (fixed.trim().equals("A")) {\r
+ if (speed.trim().isEmpty()) speed = "0.0";\r
+ }\r
+\r
+\r
+ }else if (nmeastr.startsWith("$GPGSV,")) {\r
+\r
+// GPGSV编辑\r
+// (可见卫星信息)\r
+// 例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70\r
+// 字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息\r
+// 字段1:本次GSV语句的总数目(1 - 3)\r
+// 字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)\r
+// 字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)\r
+// 字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)\r
+// 字段5:卫星仰角(00 - 90)度(前导位数不足则补0)\r
+// 字段6:卫星方位角(00 - 359)度(前导位数不足则补0)\r
+// 字段7:信噪比(00-99)dbHz\r
+// 字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)\r
+// 字段9:卫星仰角(00 - 90)度(前导位数不足则补0)\r
+// 字段10:卫星方位角(00 - 359)度(前导位数不足则补0)\r
+// 字段11:信噪比(00-99)dbHz\r
+// 字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)\r
+// 字段13:卫星仰角(00 - 90)度(前导位数不足则补0)\r
+//// 字段14:卫星方位角(00 - 359)度(前导位数不足则补0)\r
+//// 字段15:信噪比(00-99)dbHz\r
+// 字段16:校验值($与*之间的数异或后的值)\r
+\r
+ String tmplist[]=nmeastr.split(",");\r
+ int maxPageCount= Integer.valueOf(tmplist[1]);\r
+ int currentPage= Integer.valueOf(tmplist[2]);\r
+ int SatlitesCount= Integer.valueOf(tmplist[3]);\r
+ if (maxPageCount>0 && currentPage==1){\r
+ //第一页把数组初始化一遍。\r
+ satindex=0;\r
+ gps_status.satlite_numbss=SatlitesCount;\r
+ }\r
+ int satcount=(tmplist.length-4)/4;\r
+// ICLogger.i("Nmea :"+nmeastr+" "+satcount);\r
+ for (int i=0;i<satcount;i++){\r
+ satindex++;\r
+ String prn=tmplist[i*4+4];\r
+ String snr=tmplist[i*4+4+3];\r
+ if (snr.contains("*")){\r
+ snr=snr.substring(0,snr.indexOf("*"));\r
+ }\r
+ if (snr.trim().isEmpty()){\r
+ snr="0";\r
+ }\r
+ Logger.d("Sat="+satindex+",prn="+prn+",snr="+snr);\r
+\r
+ int intprn= Integer.valueOf(prn);\r
+ float floatsnr= Float.valueOf(snr);\r
+ if (floatsnr>0) {\r
+ gps_status.numSatelliteList.add(new GpsSatellitePriv(intprn, floatsnr));\r
+ }\r
+ }\r
+\r
+ if (maxPageCount==currentPage) {\r
+ //最后一页,打印搜星情况,并作一些判断。\r
+ StringBuilder sb=new StringBuilder();\r
+ sb.append("搜索"+searchCout+"次,搜索到卫星个数" + SatlitesCount+", [SNR>0] ="+ gps_status.numSatelliteList.size());\r
+\r
+ Logger.d( sb.toString());\r
+\r
+ }\r
+ }else if (nmeastr.startsWith("$GPGGA,")) {\r
+\r
+// GPGGA编辑\r
+//(定位信息)\r
+// 例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,12.2,M,19.7,M,,0000*1F\r
+// 字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息\r
+// 字段1:UTC 时间,hhmmss.sss,时分秒格式\r
+// 字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)\r
+// 字段3:纬度N(北纬)或S(南纬)\r
+// 字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)\r
+// 字段5:经度E(东经)或W(西经)\r
+// 字段6:GPS状态,0=不可用(FIX NOT valid),1=单点定位(GPS FIX),2=差分定位(DGPS),3=无效PPS,4=实时差分定位(RTK FIX),5=RTK FLOAT,6=正在估算\r
+// 字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)\r
+// 字段8:HDOP水平精度因子(0.5 - 99.9)\r
+// 字段9:海拔高度(-9999.9 - 99999.9)\r
+// 字段10:单位:M(米)\r
+// 字段11:地球椭球面相对大地水准面的高度 WGS84水准面划分\r
+// 字段12:WGS84水准面划分单位:M(米)\r
+// 字段13:差分时间(从接收到差分信号开始的秒数,如果不是差分定位将为空)\r
+// 字段14:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)\r
+// 字段15:校验值($与*之间的数异或后的值)\r
+\r
+ String tmplist[]=nmeastr.split(",");\r
+ String utctime=tmplist[1];\r
+ String Lat=tmplist[2];\r
+ String lon=tmplist[4];\r
+ String fixed=tmplist[6];\r
+ String usedStarts=tmplist[7];\r
+ String hdop=tmplist[8];\r
+\r
+\r
+ if ( (fixed.trim().equals("1"))||(fixed.trim().equals("2"))||(fixed.trim().equals("6"))){\r
+\r
+\r
+ // 转换GPS坐标为度,以便在各种应用中可以方便查找。\r
+ latitude= Double.valueOf(Lat);\r
+ longitude= Double.valueOf(lon);\r
+ // 转换单位,从分转换到度\r
+\r
+ double intdu= (int)(longitude /100f); //小数转换到分为单位\r
+ double du=(longitude - intdu*100)/60f;\r
+ double last= intdu+du;\r
+ longitude =last;\r
+ intdu= (int)(latitude /100f); //小数转换到分为单位\r
+ du=(latitude - intdu*100)/60f;\r
+ last= intdu+du;\r
+ latitude=last;\r
+\r
+ // 经纬度 保留4位小数点\r
+ DecimalFormat df = new DecimalFormat("#.000000");\r
+ String strLatitude = df.format(latitude);\r
+ String strLongitude = df.format(longitude);\r
+\r
+ //定位\r
+ StringBuilder sb=new StringBuilder();\r
+ sb.append("GPGGA, location time= " + getLocalTime2() + ", FixedCount=" + locationFixedCount + ", GPSTime="+utctime+", Lat="+Lat+" ("+strLatitude+"), Lon="+lon+" ("+strLongitude+"), fixed="+fixed+", hdop="+hdop+", usedStarts="+usedStarts);\r
+ Logger.d(sb.toString());\r
+\r
+ gps_status.locating_status=1; //fixed\r
+ }else{\r
+ gps_status.locating_status=0; //notfixed\r
+ }\r
+ gps_status.hdop= Float.valueOf(hdop.trim());\r
+ gps_status.used_gps_numbs= Integer.valueOf(usedStarts.trim());\r
+\r
+\r
+ }else if (nmeastr.startsWith("$GPGSA,")) {\r
+\r
+// GPGSA编辑\r
+//( 当前卫星信息)\r
+// 例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A\r
+// 字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息\r
+// 字段1:定位模式(选择2D/3D),A=自动选择,M=手动选择\r
+// 字段2:定位类型,1=未定位,2=2D定位,3=3D定位\r
+// 字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)\r
+// 字段15:PDOP综合位置精度因子(0.5 - 99.9)\r
+// 字段16:HDOP水平精度因子(0.5 - 99.9)\r
+// 字段17:VDOP垂直精度因子(0.5 - 99.9)\r
+// 字段18:校验值($与*之间的数异或后的值)\r
+\r
+// String tmplist[]=nmeastr.split(",");\r
+// String locationmod=tmplist[1];\r
+// String fixed=tmplist[2];\r
+// String hdop=tmplist[16];\r
+// if (!fixed.trim().equals("1")){\r
+// //定位\r
+// ICLogger.i("GPGSA fixed="+fixed+",hdop="+hdop);\r
+// }\r
+ }\r
+ }\r
+\r
+}\r
--- /dev/null
+package mobile.miki;\r
+\r
+import android.content.Context;\r
+import android.graphics.Canvas;\r
+import android.graphics.Color;\r
+import android.graphics.Paint;\r
+import android.support.annotation.Nullable;\r
+import android.util.AttributeSet;\r
+import android.util.TypedValue;\r
+import android.view.View;\r
+\r
+\r
+public class SnrHistogramView extends View {\r
+\r
+\r
+ private int mWidth = 0;\r
+ private int mHeight = 0;\r
+\r
+ private Paint mPaint;\r
+ private Paint mTextPaint;\r
+\r
+ private String mSnrValue = "80";\r
+ private String mSnrNmber = "60";\r
+\r
+ private float mBL=1f;\r
+\r
+ public SnrHistogramView(Context context) {\r
+ this(context, null);\r
+ }\r
+\r
+ public SnrHistogramView(Context context, @Nullable AttributeSet attrs) {\r
+ this(context, attrs, 0);\r
+ }\r
+\r
+ public SnrHistogramView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\r
+ super(context, attrs, defStyleAttr);\r
+ mPaint = new Paint();\r
+ mTextPaint = new Paint();\r
+\r
+ mPaint.setAntiAlias(true);\r
+ mPaint.setDither(true);\r
+ int mBgColor = Color.GREEN;\r
+ mPaint.setColor(mBgColor);\r
+ mPaint.setStyle(Paint.Style.FILL);\r
+\r
+ mTextPaint.setAntiAlias(true);\r
+ mTextPaint.setDither(true);\r
+ mTextPaint.setColor(Color.WHITE);\r
+ mTextPaint.setStyle(Paint.Style.FILL);\r
+ mTextPaint.setTextSize(spToPx(24));\r
+ }\r
+\r
+ @Override\r
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\r
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);\r
+\r
+\r
+ int widthSize = MeasureSpec.getSize(widthMeasureSpec);\r
+ int widthMode = MeasureSpec.getMode(widthMeasureSpec);\r
+ int heightSize = MeasureSpec.getSize(heightMeasureSpec);\r
+ int heightMode = MeasureSpec.getMode(heightMeasureSpec);\r
+\r
+\r
+ if (widthMode == MeasureSpec.AT_MOST\r
+ || widthMode == MeasureSpec.UNSPECIFIED\r
+ || heightMeasureSpec == MeasureSpec.AT_MOST\r
+ || heightMeasureSpec == MeasureSpec.UNSPECIFIED) {\r
+ //宽度高度至少有一个确定的值,不能同时为wrap_content\r
+ return;\r
+ } else { //至少有一个为确定值,要获取其中的最小值\r
+ if (widthMode == MeasureSpec.EXACTLY) {\r
+ mWidth = widthSize;\r
+ }\r
+\r
+ if (heightMode == MeasureSpec.EXACTLY) {\r
+ mHeight = heightSize;\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ @Override\r
+ protected void onDraw(Canvas canvas) {\r
+ super.onDraw(canvas);\r
+\r
+ float[] snrNmber = measureTextWidth(mSnrNmber, mTextPaint);\r
+ float[] snrValue = measureTextWidth(mSnrValue, mTextPaint);\r
+\r
+ float hv = getHistogramHeight(snrValue[1], snrNmber[1], mBL);\r
+\r
+ canvas.drawText(mSnrNmber, (mWidth - snrNmber[0]) / 2, mHeight, mTextPaint);\r
+ canvas.drawText(mSnrValue, (mWidth - snrValue[0]) / 2, mHeight - snrNmber[1] - hv, mTextPaint);\r
+\r
+ canvas.drawRect(0, mHeight - (hv + snrNmber[1] - 2), mWidth, mHeight - snrNmber[1], mPaint);\r
+ }\r
+\r
+ private float getHistogramHeight(float vh, float nh, float bl) {\r
+ return (mHeight - vh - nh) * bl;\r
+ }\r
+\r
+ private float[] measureTextWidth(String mText, Paint textPaint) {\r
+ Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();\r
+ float height1 = fontMetrics.bottom - fontMetrics.top;\r
+ float strWidth = textPaint.measureText(mText);\r
+ return new float[]{strWidth, height1};\r
+ }\r
+\r
+ private float spToPx(float sp) {\r
+ return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics());\r
+ }\r
+\r
+ public void updateValue(float value,int number,int bgColor){\r
+ mPaint.setColor(bgColor);\r
+ mSnrNmber = String.valueOf(number);\r
+ mSnrValue = String.valueOf((int)value);\r
+ mBL=value*0.025F;\r
+\r
+ invalidate();\r
+ }\r
+}\r