<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <!-- 用于申请获取蓝牙信息进行室内定位 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- 高德定位SDK需要的权限 END -->
+ <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
- <uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
// ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));\r
// runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
+// }\r
+ }\r
+ }else if (Config.custom_branch_name.equals("SGL")) {\r
+ if (Config.getConfigInitFlag(this)==0) {\r
+ Config.setLocationMode(this, CUSTOM_MOD8_GPS);\r
+ Config.setLocationCycle(this, 1800);\r
+ Config.setPPGTestCycle(this, 0);\r
+ Config.setTemperatureTestCycle(runtime, 0);\r
+ Config.setConfigInitFlag(this, 1);\r
+// int contactcount=runtime.getDbHelper().getContactCount(getContentResolver());\r
+// ICLogger.i("=====Contact count "+contactcount);\r
+// if(contactcount==0){ //如果没有SOS\r
+// ICLogger.i("=====add SOS 07522312120 ");\r
+// ArrayList<Contact> contactArray=new ArrayList<Contact>();\r
+// contactArray.add(new Contact(Contact.CATEGORY_SOS, "sos1", "07522312120"));\r
+// runtime.getDbHelper().saveContacts(contactArray,false,false,false,false,false,true);\r
// }\r
}\r
}else{\r
import android.os.PowerManager;\r
import android.os.SystemClock;\r
\r
+import com.enqualcomm.support.adapter.BTHelper;\r
import com.enqualcomm.support.utils.AlarmHelper;\r
import com.enqualcomm.support.adapter.LBSHelper;\r
import com.enqualcomm.support.utils.Connection;\r
import com.enqualcomm.support.bean.Runtime;\r
import com.enqualcomm.support.utils.TimeUtil;\r
\r
+import java.util.ArrayList;\r
import java.util.concurrent.ExecutorService;\r
import java.util.concurrent.Executors;\r
\r
\r
\r
private LBSHelper mLbsHelper;\r
- \r
+ private static BTHelper btHelper=null;\r
+\r
private int mPedometer2;\r
\r
private SimSignalUtil mSignalUtil;\r
public LocationClient(Connection paramNettyConnection, Runtime paramRuntime) {\r
connection = paramNettyConnection;\r
runtime = paramRuntime;\r
+ btHelper=BTHelper.getInstance(paramRuntime.getContextProxy().context, new BTHelper.BTScanCallback() {\r
+ @Override\r
+ public void OnScanFinished(ArrayList<String> btPairedScanResult, ArrayList<String> btNewScanResult) {\r
+\r
+ if (btNewScanResult.size() > 0) {\r
+ ICLogger.i("found bt mac " + btNewScanResult.size());\r
+ boolean in_area = false;\r
+ for (String mac : btNewScanResult) {\r
+ if (runtime.bleInfo.btMacList.contains(mac)) {\r
+ in_area = true;\r
+ break;\r
+ }\r
+ runtime.bleInfo.is_in_area = in_area;\r
+ }\r
+\r
\r
+ } else {\r
+ runtime.bleInfo.is_in_area = false;\r
+ }\r
+ ICLogger.i("Dev Is in Area " + runtime.bleInfo.is_in_area);\r
+\r
+ if (runtime.bleInfo.is_in_area == false) {\r
+ ICLogger.i("不在区域内,开启定位流程");\r
+ startLocationProcess(runtime.getLocationInstance().getWorkingMod());\r
+ }else{\r
+ ICLogger.i("在区域内,直接发送区域坐标即可!");\r
+ StringMessage AP01_CMD = protocolAPIHelper.getGPSLocationMSG(runtime);\r
+ Deliver.sendLocationMSG(AP01_CMD);\r
+ }\r
+ }\r
+ });\r
gLocationCline=this;\r
//GPS 监听管理初始化\r
this.nmeaListener = new NMEAListener(paramRuntime.getContextProxy().getLocationManager(), paramRuntime);\r
public void call(Object param1Object) { waitAndSendLocation(); }\r
});\r
}else if (msg.what == msgWhat_StartLocationProcess){\r
- startLocationProcess(runtime.getLocationInstance().getWorkingMod());\r
+ if (runtime.bleInfo.btMacList.size()>0){\r
+ //有蓝牙搜索要求则 先进行蓝牙扫描\r
+ btHelper.scanBLE();\r
+ }else{\r
+ //没有蓝牙搜索要求,就正常定位\r
+ startLocationProcess(runtime.getLocationInstance().getWorkingMod());\r
+ }\r
+\r
}else if (msg.what == msgWhat_StartSOSLocationProcess){\r
startSOSLocation=true;//启动SOS定位,为了快速响应,只要wifi定位即可。\r
forceLocation=1;\r
private static int gpsTimeoutCountOnNoMove=0;// 记录gps 无信号或者timeout的次数,超过5 就会停止使用gps定位,只要有一次 移动,或者设置为wifi定位,则清零。\r
private static final int MaxGpsTimeoutCountOnNoMove=5;//不动的情况最大的gps搜不到星的次数。\r
private static boolean skipMoveCheck=false;\r
+\r
+\r
public static void setSkipMoveCheck(boolean _skipMoveCheck){\r
skipMoveCheck=_skipMoveCheck;\r
}\r
\r
private static boolean NoMoveAndNoGPSsignalSkipGpsFlag=false;\r
private static boolean noMove=false;\r
- public void startLocationProcess(int mod){\r
\r
\r
\r
+ public void startLocationProcess(int mod){\r
+\r
updateStepCount();//update StepCount,保证每次定位前,计步数据是最新的。防止丢数据。\r
ICLogger.i("forceLocation="+forceLocation+", WorkingMod="+mod+", isLocating="+isLocating+", lastStep="+runtime.getLastStepCount()+", currentStep="+ runtime.getTotalStepCount());\r
if (isLocating && 1!=forceLocation) { //如果是强制定位,则即使是正在定位,也要执行,因为有时模式变换的时候,需要取消上一次定位信息,马上新的模式定位。\r
import android.widget.Button;
import android.widget.TextView;
+import com.enqualcomm.support.adapter.BTHelper;
import com.enqualcomm.support.utils.DeviceInfoUtil;
import com.enqualcomm.support.utils.ICLogger;
import com.enqualcomm.support.utils.ImageUtil;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
+import java.util.ArrayList;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
return false;
}
});
+
+ BTHelper btHelper=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
+
Intent intent=new Intent();
ComponentName var3 = new ComponentName("com.enqualcomm.support", "com.enqualcomm.support.toolActivity");
intent.addFlags(FLAG_ACTIVITY_NEW_TASK);
intent.setComponent(var3);
startActivity(intent);
+
+
}
});
// testpic();
}
+
+ private void testBLE(){
+ btHelper= BTHelper.getInstance(MainActivity.this, new BTHelper.BTScanCallback() {
+ @Override
+ public void OnScanFinished(ArrayList<String> btPairedScanResult, ArrayList<String> btNewScanResult) {
+
+
+// ICLogger.i("BT Pared "+btPairedScanResult.size());
+// for ( String i :btPairedScanResult){
+// ICLogger.i(i);
+// }
+ int count=btNewScanResult.size();
+ ICLogger.i("BT New "+count);
+ for(int i=0;i<count;i++)
+ ICLogger.i("BT "+btNewScanResult.get(i));
+ }
+
+ });
+ btHelper.scanBLE();
+ }
@Override
protected void onResume() {
super.onResume();
ICLogger.d("SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES "+ SharPreferenceUtil.getPrefIntPublic(this,Constants.SHAREKEY_SETTING_SIT_ALARM_RANGE_IN_MINUTES,0));
}
+
+
+
}
--- /dev/null
+package com.enqualcomm.support.adapter;\r
+\r
+import android.bluetooth.BluetoothAdapter;\r
+import android.bluetooth.BluetoothAdapter.LeScanCallback;\r
+import android.bluetooth.BluetoothDevice;\r
+import android.content.BroadcastReceiver;\r
+import android.content.Context;\r
+import android.content.Intent;\r
+import android.content.IntentFilter;\r
+import android.os.Handler;\r
+\r
+import com.enqualcomm.support.utils.ICLogger;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Set;\r
+\r
+public class BTHelper {\r
+\r
+ private BluetoothAdapter mBtAdapter;\r
+ private ArrayList<String> mPairedDevicesArray=new ArrayList<>();\r
+ private ArrayList<String> mNewDevicesArray=new ArrayList<>();\r
+ private Context mContext=null;\r
+ private BTScanCallback mCallback=null;\r
+ private static BTHelper mBThelper=null;\r
+\r
+ private boolean enabledBeforScan=false;\r
+ BTHelper(){\r
+\r
+ }\r
+\r
+ //enableBT\r
+ public void enableBT() {\r
+ ICLogger.i( "BT enableBT()");\r
+ if (!mBtAdapter.isEnabled()) {\r
+// Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);\r
+// mContext.startActivity(enableIntent);\r
+\r
+ mBtAdapter.enable();\r
+ try {\r
+ Thread.sleep(2000);\r
+ } catch (InterruptedException e) {\r
+ e.printStackTrace();\r
+ }\r
+ //此处无法执行说没权限\r
+// mBtAdapter.enableNoAutoConnect();\r
+ }\r
+ }\r
+\r
+ //disableBT\r
+ public void disableBT(){\r
+ ICLogger.i( "BT disableBT()");\r
+ if (mBtAdapter.isEnabled()) {\r
+ mBtAdapter.disable();\r
+// Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);\r
+// mContext.startActivity(enableIntent);\r
+ }\r
+ }\r
+\r
+ //初始化 BTHlper\r
+ public void Init(Context context , BTScanCallback callback){\r
+ ICLogger.i( "BT Init()");\r
+ mCallback=callback;\r
+ mContext=context;\r
+// // Register for broadcasts when a device is discovered\r
+// IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);\r
+// mContext.registerReceiver(mReceiver, filter);\r
+//\r
+// // Register for broadcasts when discovery has finished\r
+// filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);\r
+// mContext.registerReceiver(mReceiver, filter);\r
+//\r
+\r
+ // Get the local Bluetooth adapter\r
+ mBtAdapter = BluetoothAdapter.getDefaultAdapter();\r
+\r
+ }\r
+\r
+ //获取实例\r
+ public static BTHelper getInstance(Context context , BTScanCallback callback){\r
+ if (mBThelper==null) {\r
+ ICLogger.i( "BT getInstance ");\r
+ mBThelper = new BTHelper();\r
+ mBThelper.Init(context,callback);\r
+ }\r
+ return mBThelper;\r
+ }\r
+\r
+// // The BroadcastReceiver that listens for discovered devices and\r
+// // changes the title when discovery is finished\r
+// private final BroadcastReceiver mReceiver = new BroadcastReceiver() {\r
+// @Override\r
+// public void onReceive(Context context, Intent intent) {\r
+// String action = intent.getAction();\r
+// ICLogger.i( "BT onReceive "+action);\r
+// // When discovery finds a device\r
+// if (BluetoothDevice.ACTION_FOUND.equals(action)) {\r
+// // Get the BluetoothDevice object from the Intent\r
+// BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);\r
+// // If it's already paired, skip it, because it's been listed already\r
+//\r
+// ICLogger.i("BT "+device.getName() + "\t" + device.getAddress());\r
+//\r
+//// ICLogger.i( device.getName() + "\n" + device.getAddress());\r
+// if (device.getBondState() != BluetoothDevice.BOND_BONDED) {\r
+// if(!mNewDevicesArray.contains(device.getAddress()))\r
+// mNewDevicesArray.add(device.getAddress());\r
+// }\r
+// // When discovery is finished, change the Activity title\r
+// } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {\r
+//\r
+// if (mNewDevicesArray.size() == 0) {\r
+// //没有设备\r
+// }\r
+// // Get a set of currently paired devices\r
+// Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();\r
+//\r
+// // If there are paired devices, add each one to the ArrayAdapter\r
+// if (pairedDevices.size() > 0) {\r
+// for (BluetoothDevice device : pairedDevices) {\r
+// ICLogger.i("BT "+device.getName() + "\t" + device.getAddress());\r
+// if(!mPairedDevicesArray.contains(device.getAddress()))\r
+// mPairedDevicesArray.add(device.getAddress());\r
+//\r
+// }\r
+// }\r
+//\r
+// //开始扫描前是关闭的,就关闭它\r
+// if(!enabledBeforScan)\r
+// disableBT();\r
+//\r
+// if (mCallback!=null)\r
+// mCallback.OnScanFinished(mPairedDevicesArray,mNewDevicesArray);\r
+// }\r
+// }\r
+// };\r
+\r
+ //清除BThelper\r
+// public void Deinit() {\r
+// ICLogger.i( "BT Deinit()");\r
+// // Make sure we're not doing discovery anymore\r
+//// if (mBtAdapter != null) {\r
+//// mBtAdapter.cancelDiscovery();\r
+//// }\r
+////\r
+//// // Unregister broadcast listeners\r
+//// if(mContext!=null)\r
+//// mContext.unregisterReceiver(mReceiver);\r
+////\r
+//\r
+//\r
+//// mContext=null;\r
+////// mCallback=null;\r
+//\r
+// }\r
+\r
+ //开始扫描BLE\r
+ public void scanBLE() {\r
+ ICLogger.i( "BT doDiscovery()");\r
+\r
+\r
+ enabledBeforScan=mBtAdapter.isEnabled();\r
+\r
+ enableBT();\r
+\r
+\r
+ // If we're already discovering, stop it\r
+\r
+// ICLogger.i(" mBtAdapter.isDiscovering() "+mBtAdapter.isDiscovering());\r
+// if (mBtAdapter.isDiscovering()) {\r
+// mBtAdapter.cancelDiscovery();\r
+// }\r
+\r
+// mBtAdapter.setDiscoverableTimeout(3);\r
+ mPairedDevicesArray.clear();\r
+ mNewDevicesArray.clear();\r
+ // Request discover from BluetoothAdapter\r
+\r
+\r
+\r
+// mBtAdapter.startDiscovery();\r
+\r
+\r
+\r
+\r
+\r
+ mBtAdapter.setScanMode(BluetoothAdapter.SCAN_MODE_NONE,5);\r
+ LeScanCallback lecallback=new LeScanCallback(){\r
+\r
+ @Override\r
+ public void onLeScan(BluetoothDevice bluetoothDevice, int rssi, byte[] scanRecode) {\r
+ ICLogger.i( "BT onLeScan "+bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()+" rssi "+rssi);\r
+ ICLogger.logToFile("LBS","BT onLeScan "+bluetoothDevice.getName()+" "+bluetoothDevice.getAddress()+" rssi "+rssi );\r
+ if(!mNewDevicesArray.contains(bluetoothDevice.getAddress()))\r
+ mNewDevicesArray.add(bluetoothDevice.getAddress());\r
+ }\r
+ };\r
+\r
+ ICLogger.i("BT startLeScan");\r
+ mBtAdapter.startLeScan(lecallback);\r
+\r
+\r
+ new Handler().postDelayed(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ mBtAdapter.stopLeScan(lecallback);\r
+ ICLogger.i("BT stopLeScan");\r
+\r
+ //开始扫描前是关闭的,就关闭它\r
+ if(!enabledBeforScan)\r
+ disableBT();\r
+\r
+ if (mCallback!=null)\r
+ mCallback.OnScanFinished(mPairedDevicesArray,mNewDevicesArray);\r
+ }\r
+ },5000);\r
+\r
+\r
+ }\r
+\r
+\r
+\r
+ //开启蓝牙可被搜索300秒\r
+ private void ensureDiscoverable() {\r
+ ICLogger.i("ensure discoverable");\r
+ if (mBtAdapter.getScanMode() !=\r
+ BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {\r
+\r
+// Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);\r
+// discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);\r
+// mContext.startActivity(discoverableIntent);\r
+ }\r
+ }\r
+\r
+ private advcallback advcb=new advcallback();\r
+\r
+ //停止自定义广播\r
+ public void stopGattAdvertising(){\r
+ if (mBtAdapter.isEnabled())\r
+ mBtAdapter.stopAdvertising(advcb);\r
+\r
+ }\r
+\r
+ //开启自定义广播数据,前两字会被丢弃\r
+ public void enableGattAdvertising(String serverData){\r
+ byte[] serviceData = serverData.getBytes();\r
+ if (mBtAdapter.isEnabled())\r
+ mBtAdapter.startAdvertising(advcb, serviceData);\r
+ }\r
+ public class advcallback implements BluetoothAdapter.AdvertiseCallback {\r
+\r
+\r
+ public void onAdvertiseStart(int status){\r
+ ICLogger.i( "--onAdvertiseStart --");\r
+\r
+ }\r
+\r
+ public void onAdvertiseStop(int status){\r
+\r
+ ICLogger.i( "-- onAdvertiseStop --");\r
+\r
+ }\r
+ }\r
+ public interface BTScanCallback{\r
+ void OnScanFinished(ArrayList<String> btPairedScanResult,ArrayList<String> btNewScanResult);\r
+\r
+ }\r
+}\r
\r
return sb.toString();\r
}\r
+ public String getMqttGPSData(){\r
\r
+/***\r
+ * A,22.570733,N,113.8626083,E,0.00,249.5,0.0,6\r
+ * A,gps 定位有效\r
+ * 22.570733,纬度 N,\r
+ * 113.8626083,经度 E,\r
+ * 0.00,速度\r
+ * 249.5,方向\r
+ * 0.0,海拔\r
+ * 6,卫星个数\r
+ */\r
+ StringBuilder sb=new StringBuilder();\r
+ int speedi=(int)gpsp.getLocation().speed;\r
+ int speedl=(int) ((gpsp.getLocation().speed - speedi)*100);\r
+\r
+ String latStr=gpsp.getLocation().latGPSStr;\r
+ String lonStr=gpsp.getLocation().lonGPSStr;\r
+\r
+ if(bleInfo.is_in_area==true){\r
+ latStr=bleInfo.gps_n;\r
+ lonStr=bleInfo.gps_e;\r
+ }\r
+ String heading=String.valueOf(gpsp.getLocation().heading);\r
+ int starcount=gpsp.getLocation().used_gps_numbs;\r
+ if (isGPSFixed()|| bleInfo.is_in_area)\r
+ {\r
+ String gpsStr = String.format(",%s,N,%s,E,%d.%02d,%s,0.0,%d", latStr, lonStr, speedi, speedl,heading,starcount);\r
+ sb.append("A").append(gpsStr);\r
+\r
+ }else{\r
+ String gpsStr=String.format(",0.000,N,0.000,E,0.0,0.0,0.0,0");\r
+ sb.append("V").append(gpsStr);\r
+ }\r
+\r
+\r
+ return sb.toString();\r
+ }\r
public String getFZDGPSData(){\r
\r
/***\r
String cmd = cmdMap.get(CMD_TYPE.UD);\r
sb.append(TimeUtil.getUTCSystemDateYYMMDD()).append(CMDSPLIT)\r
.append(TimeUtil.getUTCSystemTimeHHmmss()).append(CMDSPLIT)\r
- .append(runtime.getFZDGPSData()).append(CMDSPLIT)\r
+ .append(runtime.getMqttGPSData()).append(CMDSPLIT)\r
.append(String.format("%03d", abs(runtime.getSignalStrength()))).append(CMDSPLIT)\r
.append(runtime.getBattery()).append(CMDSPLIT)\r
.append(runtime.getTotalStepCount()).append(CMDSPLIT)\r