| @@ -4,9 +4,9 @@ android { | |||
| compileSdkVersion 33 | |||
| defaultConfig { | |||
| applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | |||
| minSdkVersion 19 | |||
| minSdkVersion 21 | |||
| targetSdkVersion 33 | |||
| versionName "1.11.11" | |||
| versionName "1.11.14" | |||
| versionCode getVersionCodeNumber(versionName) | |||
| testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | |||
| } | |||
| @@ -66,9 +66,10 @@ dependencies { | |||
| implementation 'androidx.constraintlayout:constraintlayout:2.0.4' | |||
| implementation 'androidx.cardview:cardview:1.0.0' | |||
| testImplementation 'junit:junit:4.12' | |||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.5'//蓝牙核心库 | |||
| // implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.1.4'//OTA库,需要依赖核心库 | |||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.3'//蓝牙解析库 | |||
| implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.14.6'//蓝牙核心库 | |||
| //OTA库,需要依赖核心库 | |||
| // implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.1.6' | |||
| implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.9.4'//蓝牙解析库 | |||
| implementation 'androidx.recyclerview:recyclerview:1.3.2' | |||
| implementation 'com.jakewharton:butterknife:10.2.3' | |||
| annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' | |||
| @@ -32,8 +32,8 @@ | |||
| android:theme="@style/AppTheme" | |||
| android:usesCleartextTraffic="true" | |||
| tools:targetApi="q"> | |||
| <activity android:name=".ClearShakeHandsActivity" /> | |||
| <activity android:name=".MainActivity" | |||
| <activity android:name=".home.MainActivity" | |||
| android:exported="true"> | |||
| <intent-filter> | |||
| <action android:name="android.intent.action.VIEW" /> | |||
| @@ -42,6 +42,9 @@ | |||
| <category android:name="android.intent.category.LAUNCHER" /> | |||
| </intent-filter> | |||
| </activity> | |||
| <activity android:name=".ClearShakeHandsActivity" /> | |||
| <activity android:name=".ShowBleActivity" /> | |||
| <activity android:name=".BabyCmdActivity" /> | |||
| <activity android:name=".TempGunCmdActivity" /> | |||
| @@ -54,7 +57,6 @@ | |||
| <activity android:name=".ConnectBleTestActivity" /> | |||
| <activity android:name=".ADWeightScaleCmdActivity" /> | |||
| <activity android:name=".ADWeightScaleUserActivity" /> | |||
| <activity android:name=".WeightScaleWifiBleActivity" /> | |||
| <activity android:name=".WeightScaleBleActivity" /> | |||
| <activity android:name=".WifiConfigActivity" /> | |||
| <activity android:name=".EightBodyfatActivity" /> | |||
| @@ -1,11 +1,15 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.content.Context; | |||
| import android.content.Intent; | |||
| import android.net.Uri; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.os.Message; | |||
| import android.text.TextUtils; | |||
| import android.view.Menu; | |||
| import android.view.MenuItem; | |||
| import android.view.View; | |||
| import android.view.WindowManager; | |||
| import android.widget.ArrayAdapter; | |||
| @@ -16,7 +20,9 @@ import android.widget.Toast; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.bean.BleValueBean; | |||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.config.BleConfig; | |||
| import com.pingwang.bluetoothlib.config.CmdConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| @@ -38,11 +44,15 @@ import com.pingwang.bluetoothlib.utils.BleDataUtils; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppPhoneInfoUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileProvider7; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| @@ -63,7 +73,10 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| private BleSendCmdUtil mBleSendCmdUtil; | |||
| private BleDataUtils bleDataUtils; | |||
| private BleDevice mBleDevice; | |||
| private int type; | |||
| private int mCid; | |||
| private int mVid; | |||
| private int mPid; | |||
| private String mDeviceVersion; | |||
| /** | |||
| * 是否暂停显示数据 | |||
| */ | |||
| @@ -84,7 +97,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| private void addShowData(String data) { | |||
| mId++; | |||
| mList.add("ID:" +mId+" " + TimeUtils.getTimeSSS() + data); | |||
| mList.add("ID:" + mId + " " + TimeUtils.getTimeSSS() + data); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @@ -95,9 +108,12 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); | |||
| mContext = this; | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| type = getIntent().getIntExtra("type", -1); | |||
| mCid = getIntent().getIntExtra("cid", -1); | |||
| mVid = getIntent().getIntExtra("vid", -1); | |||
| mPid = getIntent().getIntExtra("pid", -1); | |||
| mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||
| init(); | |||
| BleConfig.setHandshakeStatus((int[]) null, mAddress, true); | |||
| } | |||
| private void init() { | |||
| @@ -153,7 +169,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| addShowData("断开连接"); | |||
| break; | |||
| case R.id.btnConnect: | |||
| mAILinkBleManager.connectDevice(mAddress); | |||
| mAILinkBleManager.connectDevice(new BleValueBean(mAddress, mCid, mVid, mPid)); | |||
| addShowData("连接设备"); | |||
| break; | |||
| case R.id.btnClear: | |||
| @@ -175,27 +191,18 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| case R.id.btnVersion: | |||
| if (mBleDevice != null) { | |||
| String version = mBleDevice.getVersion(); | |||
| if (TextUtils.isEmpty(version)) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| sendData(sendBleBean); | |||
| addShowData("正在获取版本号."); | |||
| return; | |||
| } | |||
| addShowData("版本号:" + version); | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||
| sendData(sendBleBean); | |||
| addShowData("正在获取版本号."); | |||
| } | |||
| break; | |||
| case R.id.btnBattery: | |||
| for (int i = 0; i < 10; i++) { | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| sendData(sendBleBean); | |||
| } | |||
| sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||
| sendData(sendBleBean); | |||
| addShowData("读取电量"); | |||
| break; | |||
| case R.id.btnTimeRead: | |||
| sendBleBean = new SendBleBean(); | |||
| @@ -411,7 +418,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| public void unbindServices() { | |||
| CallbackDisIm.getInstance().removeListener(this); | |||
| mAILinkBleManager.disconnectAll(); | |||
| if (mAILinkBleManager !=null) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.removeOnCallbackBle(this); | |||
| } | |||
| } | |||
| @@ -423,13 +430,13 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onConnecting(@NonNull String mac) { | |||
| //TODO 连接中 | |||
| BleLog.i(TAG, "连接中"); | |||
| L.iw(TAG, "连接中"); | |||
| } | |||
| @Override | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| //TODO 连接断开 | |||
| BleLog.i(TAG, "连接断开"); | |||
| L.iw(TAG, "连接断开"); | |||
| if (mAddress.equals(mac)) { | |||
| Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||
| mBleDevice = null; | |||
| @@ -440,7 +447,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onServicesDiscovered(@NonNull String mac) { | |||
| //TODO 连接成功(获取服务成功) | |||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
| L.iw(TAG, "连接成功(获取服务成功):" + mac); | |||
| connectSuccess(); | |||
| } | |||
| @@ -452,7 +459,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void bleClose() { | |||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
| L.iw(TAG, "蓝牙未开启,可请求开启"); | |||
| addShowData("蓝牙未开启"); | |||
| } | |||
| @@ -460,7 +468,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onNotifyOtherData(byte[] data) { | |||
| public void onNotifyOtherData(String uuid, byte[] data) { | |||
| L.iw(TAG, "透传数据(完整):" + BleStrUtils.byte2HexStr(data)); | |||
| if (mPauseShowCmd) { | |||
| return; | |||
| } | |||
| @@ -469,7 +478,8 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| } | |||
| @Override | |||
| public void onNotifyDataA6(byte[] hex) { | |||
| public void onNotifyDataA6(String uuid, byte[] hex) { | |||
| L.iw(TAG, "收到A6(payload):" + BleStrUtils.byte2HexStr(hex)); | |||
| if (hex != null && hex.length > 0) { | |||
| switch (hex[0]) { | |||
| case CmdConfig.SET_DEVICE_INFO: { | |||
| @@ -500,6 +510,7 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onNotifyData(String uuid, byte[] hex, int type) { | |||
| L.iw(TAG, "收到A7:\nCID:" + type + "\npayload:" + BleStrUtils.byte2HexStr(hex)); | |||
| if (mPauseShowCmd) { | |||
| return; | |||
| } | |||
| @@ -516,12 +527,14 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| @Override | |||
| public void onHandshake(boolean status) { | |||
| L.iw(TAG, "握手:" + status); | |||
| addShowData("握手:" + status); | |||
| } | |||
| @Override | |||
| public void onBmVersion(String version) { | |||
| mDeviceVersion = version; | |||
| addShowData("版本号:" + version); | |||
| } | |||
| @@ -662,4 +675,46 @@ public class BleCmdActivity extends BleBaseActivity implements OnCallbackBle, On | |||
| super.onDestroy(); | |||
| BleLog.i(TAG, "onDestroy"); | |||
| } | |||
| @Override | |||
| public boolean onCreateOptionsMenu(Menu menu) { | |||
| getMenuInflater().inflate(R.menu.toolbar_menu_share, menu); | |||
| return super.onCreateOptionsMenu(menu); | |||
| } | |||
| @Override | |||
| public boolean onOptionsItemSelected(@NonNull MenuItem item) { | |||
| if (item.getItemId() == R.id.toolbar_right_menu) { | |||
| shareData(); | |||
| return true; | |||
| } | |||
| return super.onOptionsItemSelected(item); | |||
| } | |||
| private void shareData() { | |||
| int systemBattery = AppPhoneInfoUtils.getSystemBattery(mContext); | |||
| String appData = "包名:" + BuildConfig.APPLICATION_ID + | |||
| "\nApp版本:" + AppPhoneInfoUtils.getVersionName(mContext) + | |||
| "\n设备版本:" + mDeviceVersion + | |||
| "\n设备:CID=0x" + Integer.toHexString(mCid) + " VID=0x" + Integer.toHexString(mVid) + " PID=0x" + Integer.toHexString(mPid) + | |||
| "\n手机型号:" + AppPhoneInfoUtils.getPhoneInfo() + " " + AppPhoneInfoUtils.getBrand() + | |||
| "\n手机系统:" + AppPhoneInfoUtils.getSystemVersionString()+ | |||
| "\n手机电量:" + systemBattery; | |||
| L.iw(appData); | |||
| String logPath = L.getDefaultLogPath(mContext); | |||
| String logName = L.getDefaultLogName(); | |||
| File file = new File(logPath, logName); | |||
| Uri uriForFile = FileProvider7.getUriForFile(mContext, file); | |||
| Intent sendIntent = new Intent(); | |||
| sendIntent.setAction(Intent.ACTION_SEND); | |||
| sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||
| sendIntent.putExtra(Intent.EXTRA_STREAM, uriForFile); | |||
| sendIntent.setType("*/*"); | |||
| startActivity(sendIntent); | |||
| } | |||
| } | |||
| @@ -1,209 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.os.Bundle; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.Button; | |||
| import android.widget.CompoundButton; | |||
| import android.widget.ListView; | |||
| import android.widget.RadioButton; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; | |||
| public class BloodGlucoseActivity extends aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity implements OnCallbackBle ,BloodGlucoseBleDeviceData.BloodGlucoseCallback{ | |||
| private Button support_unit, quest_status,showdata; | |||
| private RadioButton mmol, mg; | |||
| private ListView log_list; | |||
| private List<String> mLogList; | |||
| private ArrayAdapter listAdapter; | |||
| private String mAddress; | |||
| private boolean isShowData=false; | |||
| private BloodGlucoseBleDeviceData mBloodGlucoseBleDeviceData; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_blood_glucose); | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| support_unit = findViewById(R.id.support_unit); | |||
| quest_status = findViewById(R.id.quest_status); | |||
| showdata=findViewById(R.id.showdata); | |||
| mmol = findViewById(R.id.mmol); | |||
| mg = findViewById(R.id.mg); | |||
| log_list = findViewById(R.id.log_list); | |||
| mLogList = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList); | |||
| log_list.setAdapter(listAdapter); | |||
| mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| if (isChecked) | |||
| if (mBloodGlucoseBleDeviceData != null) | |||
| mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MMOL_L); | |||
| } | |||
| }); | |||
| mg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| if (isChecked) | |||
| if (mBloodGlucoseBleDeviceData != null) | |||
| mBloodGlucoseBleDeviceData.setUnit(BloodGlucoseUtil.UNIT_MG_DL); | |||
| } | |||
| }); | |||
| showdata.setOnClickListener(new View.OnClickListener() { | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (!isShowData){ | |||
| showdata.setText("隐藏Data数据"); | |||
| isShowData=true; | |||
| }else { | |||
| showdata.setText("显示Data数据"); | |||
| isShowData=false; | |||
| } | |||
| } | |||
| }); | |||
| quest_status.setOnClickListener(new View.OnClickListener() { | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (mBloodGlucoseBleDeviceData != null) | |||
| mBloodGlucoseBleDeviceData.queryStatus(); | |||
| } | |||
| }); | |||
| } | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| mLogList.add(0, "绑定服务成功"); | |||
| listAdapter.notifyDataSetChanged(); | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.setOnCallbackBle(this); | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| mBloodGlucoseBleDeviceData = new BloodGlucoseBleDeviceData(bleDevice); | |||
| mBloodGlucoseBleDeviceData.setBloodGlucoseCallback(this); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| } | |||
| @Override | |||
| public void onVersion(String version) { | |||
| mLogList.add(0, "版本号:"+version); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| public void onSupportUnit(List<SupportUnitBean> list) { | |||
| mLogList.add(0, "支持单位:"); | |||
| for (SupportUnitBean supportUnitBean:list) { | |||
| mLogList.add(0, supportUnitBean.toString()); | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| public void onDeviceStatus(int status) { | |||
| switch (status){ | |||
| case BloodGlucoseUtil.STATUS_STATELESS: | |||
| mLogList.add(0,status+" 无状态"); | |||
| break; | |||
| case BloodGlucoseUtil.STATUS_WAIT_TEST_PAPER: | |||
| mLogList.add(0,status+" 设备等待插入试纸"); | |||
| break; | |||
| case BloodGlucoseUtil.STATUS_WAIT_BLOOD_SAMPLES: | |||
| mLogList.add(0,status+" 设备已插入试纸,等待获取血样"); | |||
| break; | |||
| case BloodGlucoseUtil.STATUS_ANALYSIS_BLOOD_SAMPLES: | |||
| mLogList.add(0,status+" 血样已获取,分析血样中"); | |||
| break; | |||
| case BloodGlucoseUtil.STATUS_TEST_FINISH: | |||
| mLogList.add(0,status+" 上发数据完成,测量完成"); | |||
| break; | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| public void onResult(int originalValue, float value, int unit, int decimal) { | |||
| mLogList.add(0,"原始数据:"+originalValue+" 值:"+value+" 单位:"+unit+" 小数点位:"+decimal); | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| public void onErrorCode(int code) { | |||
| switch (code){ | |||
| case BloodGlucoseUtil.ERROR_CODE_NO_ELECTRICITY: | |||
| mLogList.add(0,code+" 电池没电"); | |||
| break; | |||
| case BloodGlucoseUtil.ERROR_CODE_USED_TEST_PAPER: | |||
| mLogList.add(0,code+" 已使用过的试纸"); | |||
| break; | |||
| case BloodGlucoseUtil.ERROR_CODE_TEMPERATURE_OUT_OF_RANGE: | |||
| mLogList.add(0,code+" 环境温度超出使用范围"); | |||
| break; | |||
| case BloodGlucoseUtil.ERROR_CODE_WITHDRAWN_TEST_PAPER: | |||
| mLogList.add(0,code+" 试纸施加血样后测试未完成,被退出试纸"); | |||
| break; | |||
| case BloodGlucoseUtil.ERROR_CODE_SELF_CHECK_FAIL: | |||
| mLogList.add(0,code+" 机器自检未通过"); | |||
| break; | |||
| case BloodGlucoseUtil.ERROR_CODE_RESULT_LOWER: | |||
| mLogList.add(0,code+" 测量结果过低,超出测量范围"); | |||
| break; | |||
| case BloodGlucoseUtil.ERROR_CODE_RESULT_OVERTOP: | |||
| mLogList.add(0,code+" 测量结果过高,超出测量范围"); | |||
| break; | |||
| default: | |||
| mLogList.add(0,"错误码:"+code); | |||
| break; | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| public void onSetUnitResult(int result) { | |||
| switch (result){ | |||
| case BloodGlucoseUtil.SUCCESS: | |||
| mLogList.add(0,result+" 成功"); | |||
| break; | |||
| case BloodGlucoseUtil.FAILED: | |||
| mLogList.add(0,result+" 失败"); | |||
| break; | |||
| case BloodGlucoseUtil.NONSUPPORT: | |||
| mLogList.add(0,result+" 不支持"); | |||
| break; | |||
| } | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| @Override | |||
| public void onData(String data) { | |||
| if (isShowData) | |||
| mLogList.add(0,data); | |||
| } | |||
| } | |||
| @@ -19,6 +19,7 @@ import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatAlgorithms; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.EightBodyFatBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatUtil; | |||
| @@ -43,6 +44,21 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| loglist = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||
| log_list.setAdapter(listAdapter); | |||
| weight = 60; | |||
| if (mEightBodyfatAdc == null) { | |||
| mEightBodyfatAdc = new EightBodyfatAdc(); | |||
| } | |||
| mEightBodyfatAdc.setAdcFoot(5784349); | |||
| mEightBodyfatAdc.setAdcHand(5121114); | |||
| mEightBodyfatAdc.setAdcLeftHand(12854746); | |||
| mEightBodyfatAdc.setAdcRightHand(15738341); | |||
| mEightBodyfatAdc.setAdcLeftFoot(1074604); | |||
| mEightBodyfatAdc.setAdcRightFoot(13046299); | |||
| mEightBodyfatAdc.setAdcLeftBody(7480094); | |||
| mEightBodyfatAdc.setAdcRightBody(7480094); | |||
| kaimengJieMi(mEightBodyfatAdc); | |||
| } | |||
| @@ -135,7 +151,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void unbindServices() { | |||
| if (mAILinkBleManager !=null) { | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.removeOnCallbackBle(this); | |||
| } | |||
| } | |||
| @@ -243,7 +259,9 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| case EightBodyFatUtil.MEASUREMENT_END: | |||
| loglist.add(0, "测量完成"); | |||
| //测量完成 | |||
| if (mEightBodyfatAdc!=null)kaimengJieMi(mEightBodyfatAdc); | |||
| if (mEightBodyfatAdc != null) { | |||
| kaimengJieMi(mEightBodyfatAdc); | |||
| } | |||
| break; | |||
| case EightBodyFatUtil.MUC_CALL_BACK_RESULT: | |||
| @@ -300,7 +318,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| } else if (state == EightBodyFatUtil.WEIGHT_STABILIZATION_WEIGHT) { | |||
| stateStr = "稳定体重"; | |||
| } | |||
| this.weight=weight; | |||
| this.weight = weight; | |||
| if (unit == EightBodyFatUtil.ST) { | |||
| loglist.add(0, "测量状态:" + state + stateStr + " 体重:" + EightBodyFatUtil.lbtostlb(weight) + " 体重单位:" + unit + " 小数点位" + decimal); | |||
| } else { | |||
| @@ -311,7 +329,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| @Override | |||
| public void onImpedance(int adc, int part, int arithmetic) { | |||
| loglist.add(0, "阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic); | |||
| kaimeng(part,adc,arithmetic); | |||
| kaimeng(part, adc, arithmetic); | |||
| } | |||
| @Override | |||
| @@ -347,7 +365,7 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| private EightBodyfatAdc mEightBodyfatAdc; | |||
| private void kaimeng(int part, int adc,int algorithms) { | |||
| private void kaimeng(int part, int adc, int algorithms) { | |||
| if (mEightBodyfatAdc == null) { | |||
| mEightBodyfatAdc = new EightBodyfatAdc(); | |||
| } | |||
| @@ -412,16 +430,15 @@ public class EightBodyfatActivity extends BleBaseActivity implements View.OnClic | |||
| } | |||
| private void kaimengJieMi(EightBodyfatAdc mEightBodyfatAdc) { | |||
| loglist.add(0,mEightBodyfatAdc.toString()); | |||
| loglist.add(0, "默认传入用户: 性别:男,身高:180,年龄27,"+"weight "+weight+"kg"); | |||
| EightBodyFatBean algorithmsData = | |||
| EightBodyFatAlgorithms.getInstance().getAlgorithmsData(mEightBodyfatAdc.getAlgorithms(), 1, 180, weight, 27, mEightBodyfatAdc); | |||
| loglist.add(0, mEightBodyfatAdc.toString()); | |||
| loglist.add(0, "默认传入用户: 性别:男,身高:180,年龄27," + "weight " + weight + "kg"); | |||
| EightBodyFatBean algorithmsData = EightBodyFatAlgorithms.getInstance() | |||
| .getAlgorithmsData(mEightBodyfatAdc.getAlgorithms(), 1, 180, weight, 27, mEightBodyfatAdc); | |||
| // EightBodyFatBean algorithmsData = | |||
| // EightBodyFatAlgorithms.getInstance().getAlgorithmsData(2, 0, 165, weight, 27, mEightBodyfatAdc); | |||
| loglist.add(0, algorithmsData.toString()); | |||
| L.i("算法结果" + algorithmsData.toString()); | |||
| } | |||
| } | |||
| @@ -26,12 +26,12 @@ import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
| import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | |||
| @@ -1,656 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| import android.Manifest; | |||
| import android.content.Context; | |||
| import android.content.Intent; | |||
| import android.content.pm.PackageManager; | |||
| import android.os.Build; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.view.View; | |||
| import android.widget.TextView; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import androidx.appcompat.app.ActionBar; | |||
| import androidx.appcompat.app.AppCompatActivity; | |||
| import androidx.core.app.ActivityCompat; | |||
| import androidx.core.content.ContextCompat; | |||
| import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.AILinkSDK; | |||
| import com.pingwang.bluetoothlib.bean.AilinkLicenseBean; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.AppConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingSetActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| public class MainActivity extends AppCompatActivity { | |||
| private static String TAG = MainActivity.class.getName(); | |||
| private List<View> mList = new ArrayList<>(); | |||
| private Context mContext; | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()); | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_main); | |||
| mContext = this; | |||
| initView(); | |||
| initData(); | |||
| initListener(); | |||
| int bodyComposition = new BhBodyComposition().getBodyComposition(); | |||
| L.i("bodyComposition:" + bodyComposition); | |||
| // Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086")); | |||
| // Method setDefaultSim = null; | |||
| // try { | |||
| // setDefaultSim = TelephonyManager.class.getDeclaredMethod("setDefaultSim", Context.class, int.class, int.class); | |||
| // setDefaultSim.invoke(null, this, 0, 0); | |||
| // } catch (NoSuchMethodException e) { | |||
| // e.printStackTrace(); | |||
| // } catch (IllegalAccessException e) { | |||
| // e.printStackTrace(); | |||
| // } catch (InvocationTargetException e) { | |||
| // e.printStackTrace(); | |||
| // } | |||
| // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||
| // startActivity(intent); | |||
| } | |||
| protected void initListener() { | |||
| String version = getString(R.string.version) + ":" + BuildConfig.VERSION_NAME; | |||
| ((TextView) findViewById(R.id.tv_app_version)).setText(version); | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) | |||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | |||
| findViewById(R.id.btn_about).setOnClickListener(new View.OnClickListener() { | |||
| @Override | |||
| public void onClick(View v) { | |||
| startActivity(new Intent(mContext, AboutActivity.class)); | |||
| } | |||
| }); | |||
| MyListener listener = new MyListener(); | |||
| // Button btn_shpy = findViewById(R.id.btn_sphy); | |||
| // Button btn_tempgun = findViewById(R.id.btn_tempgun); | |||
| // Button btn_temp = findViewById(R.id.btn_temp); | |||
| // Button btn_baby = findViewById(R.id.btn_baby); | |||
| // Button btn_height = findViewById(R.id.btn_height); | |||
| // Button btn_ble = findViewById(R.id.btn_ble); | |||
| // Button btn_weightScale = findViewById(R.id.btn_lock); | |||
| // Button btn_ble_test = findViewById(R.id.btn_ble_test); | |||
| // Button btnConnectTest = findViewById(R.id.btnConnectTest); | |||
| // Button btn_ad_weight = findViewById(R.id.btn_ad_weight); | |||
| // Button btn_ble_weight = findViewById(R.id.btn_ble_weight); | |||
| // Button btn_wifi_ble_tooth = findViewById(R.id.btn_wifi_ble_tooth); | |||
| // Button wifi_config = findViewById(R.id.wifi_config); | |||
| // Button eight_scale = findViewById(R.id.eight_scale); | |||
| // Button btn_ota = findViewById(R.id.btn_ota); | |||
| // Button btn_wristband = findViewById(R.id.btn_wristband); | |||
| // Button glucometer = findViewById(R.id.glucometer); | |||
| // Button btn_broadcast_scale = findViewById(R.id.btn_broadcast_scale); | |||
| // Button btn_broadcast_blood_oxygen = findViewById(R.id.btn_broadcast_blood_oxygen); | |||
| // Button btn_smart_mask = findViewById(R.id.btn_smart_mask); | |||
| // Button btn_bld = findViewById(R.id.btn_bld); | |||
| // Button btn_bleBo = findViewById(R.id.btn_bleBo); | |||
| // Button btn_coffeeScale = findViewById(R.id.btn_coffeeScale); | |||
| // Button btn_scooter = findViewById(R.id.btn_scooter); | |||
| // Button btn_shareCharger = findViewById(R.id.btn_shareCharger); | |||
| // Button btn_transmission = findViewById(R.id.btn_transmission); | |||
| // Button btn_wifi_ble_weight = findViewById(R.id.btn_wifi_ble_weight); | |||
| // Button btn_baby_body_fat = findViewById(R.id.btn_baby_body_fat); | |||
| mList.add(findViewById(R.id.btn_sphy)); | |||
| mList.add(findViewById(R.id.btn_sphy_wifi_ble)); | |||
| mList.add(findViewById(R.id.btn_tempgun)); | |||
| mList.add(findViewById(R.id.btn_temp)); | |||
| mList.add(findViewById(R.id.btn_baby)); | |||
| mList.add(findViewById(R.id.btn_height)); | |||
| mList.add(findViewById(R.id.btn_ble)); | |||
| // mList.add(findViewById(R.id.btn_lock)); | |||
| mList.add(findViewById(R.id.btn_ble_test)); | |||
| mList.add(findViewById(R.id.btnConnectTest)); | |||
| mList.add(findViewById(R.id.btn_ad_weight)); | |||
| mList.add(findViewById(R.id.btn_ble_weight)); | |||
| mList.add(findViewById(R.id.btn_wifi_ble_tooth)); | |||
| mList.add(findViewById(R.id.wifi_config)); | |||
| mList.add(findViewById(R.id.eight_scale)); | |||
| mList.add(findViewById(R.id.btn_ota)); | |||
| mList.add(findViewById(R.id.glucometer)); | |||
| mList.add(findViewById(R.id.btn_broadcast_scale)); | |||
| mList.add(findViewById(R.id.btn_broadcast_blood_oxygen)); | |||
| mList.add(findViewById(R.id.btn_smart_mask)); | |||
| mList.add(findViewById(R.id.btn_bld)); | |||
| mList.add(findViewById(R.id.btn_bleBo)); | |||
| mList.add(findViewById(R.id.btn_coffeeScale)); | |||
| mList.add(findViewById(R.id.btn_scooter)); | |||
| mList.add(findViewById(R.id.btn_shareCharger)); | |||
| mList.add(findViewById(R.id.btn_share_socket)); | |||
| mList.add(findViewById(R.id.btn_transmission)); | |||
| mList.add(findViewById(R.id.btn_wifi_ble_weight)); | |||
| mList.add(findViewById(R.id.btn_baby_body_fat)); | |||
| mList.add(findViewById(R.id.btn_broadcast_height)); | |||
| mList.add(findViewById(R.id.btn_hbfs)); | |||
| mList.add(findViewById(R.id.btn_find)); | |||
| mList.add(findViewById(R.id.btn_4g_bs)); | |||
| mList.add(findViewById(R.id.btn_clear_shake_hands)); | |||
| mList.add(findViewById(R.id.btn_food_temp)); | |||
| mList.add(findViewById(R.id.btn_temp_humidity)); | |||
| mList.add(findViewById(R.id.btn_share_condom)); | |||
| mList.add(findViewById(R.id.btn_rope_skip)); | |||
| mList.add(findViewById(R.id.btn_broadcast_nutrition)); | |||
| mList.add(findViewById(R.id.btn_ble_nutrition)); | |||
| mList.add(findViewById(R.id.btn_toothbrush_test)); | |||
| mList.add(findViewById(R.id.btn_leaone_broadcast)); | |||
| mList.add(findViewById(R.id.btn_fascia_gun)); | |||
| mList.add(findViewById(R.id.btn_blood_pressure_tc)); | |||
| mList.add(findViewById(R.id.btn_body_scale_4g)); | |||
| mList.add(findViewById(R.id.btn_scooter_cm02)); | |||
| mList.add(findViewById(R.id.btn_temp_instrument)); | |||
| mList.add(findViewById(R.id.btn_public_ble_network)); | |||
| mList.add(findViewById(R.id.btn_rope_skipping_set_mode)); | |||
| mList.add(findViewById(R.id.btn_air_detector)); | |||
| mList.add(findViewById(R.id.btn_mqtt_air_detector)); | |||
| mList.add(findViewById(R.id.btn_mqtt)); | |||
| mList.add(findViewById(R.id.btn_wifi_ble_noise_meter)); | |||
| mList.add(findViewById(R.id.btn_ble_noise_meter)); | |||
| mList.add(findViewById(R.id.btn_meat_probe_charger)); | |||
| mList.add(findViewById(R.id.btn_weight_scale)); | |||
| mList.add(findViewById(R.id.btn_broadcast_scale_weight)); | |||
| mList.add(findViewById(R.id.btn_meat_probe)); | |||
| mList.add(findViewById(R.id.btn_barometric_temp_humidity)); | |||
| for (View view : mList) { | |||
| view.setOnClickListener(listener); | |||
| } | |||
| List<Integer> showViewId = AppConfig.SHOW_VIEW_ID; | |||
| if (showViewId != null) { | |||
| for (View view : mList) { | |||
| view.setVisibility(View.GONE); | |||
| } | |||
| for (Integer integer : showViewId) { | |||
| findViewById(integer).setVisibility(View.VISIBLE); | |||
| } | |||
| } | |||
| findViewById(R.id.btn_rope_skipping_set_mode).setOnClickListener(new View.OnClickListener() { | |||
| @Override | |||
| public void onClick(View v) { | |||
| startActivity(new Intent(mContext, RopeSkippingSetActivity.class)); | |||
| // Intent intent = new Intent(); | |||
| // intent.setAction("android.media.action.STILL_IMAGE_CAMERA"); | |||
| // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||
| // startActivity(intent); | |||
| // | |||
| // mHandler.postDelayed(new Runnable() { | |||
| // @Override | |||
| // public void run() { | |||
| // try { | |||
| // L.i("按下音量+ start"); | |||
| // String keyCommand = "input keyevent " + KeyEvent.KEYCODE_VOLUME_UP; | |||
| // Runtime runtime = Runtime.getRuntime(); | |||
| // Process proc = runtime.exec(keyCommand); | |||
| // L.i("按下音量+ stop"+proc.toString()); | |||
| // } catch (IOException e) { | |||
| // e.printStackTrace(); | |||
| // } | |||
| // | |||
| // } | |||
| // }, 5000); | |||
| } | |||
| }); | |||
| // AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | |||
| // @Override | |||
| // public void onInitSuccess() { | |||
| // L.i("初始化成功"); | |||
| // AILinkBleManager.getInstance().startScan(1000); | |||
| // AILinkBleManager.getInstance().setOnCallbackBle(new OnCallbackBle() { | |||
| // @Override | |||
| // public void onScanning(BleValueBean data) { | |||
| // L.i("当前搜索到的设备:"+data.getName()+" mac="+data.getMac()); | |||
| // AILinkBleManager.getInstance().stopScan(); | |||
| // AILinkBleManager.getInstance().connectDevice(data); | |||
| // } | |||
| // | |||
| // @Override | |||
| // public void onServicesDiscovered(String mac) { | |||
| // L.i("连接成功:"+mac); | |||
| // } | |||
| // }); | |||
| // | |||
| // } | |||
| // | |||
| // @Override | |||
| // public void onInitFailure() { | |||
| // L.i("初始化失败"); | |||
| // } | |||
| // }); | |||
| } | |||
| protected void initData() { | |||
| initPermissions(); | |||
| List<AilinkLicenseBean> list = new ArrayList<>(); | |||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||
| AILinkSDK.getInstance().initLicense(list); | |||
| } | |||
| protected void initView() { | |||
| BleLog.init(true); | |||
| //connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0 | |||
| //sdk | |||
| AILinkSDK.getInstance().init(mContext); | |||
| AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | |||
| @Override | |||
| public void onInitSuccess() { | |||
| AILinkBleManager.getInstance().startScan(0); | |||
| } | |||
| @Override | |||
| public void onInitFailure() { | |||
| } | |||
| }); | |||
| SP.init(this); | |||
| } | |||
| private class MyListener implements View.OnClickListener { | |||
| @Override | |||
| public void onClick(View v) { | |||
| // boolean onClick= initPermissions(); | |||
| // if (!onClick){ | |||
| // return; | |||
| // } | |||
| int type = 0; | |||
| switch (v.getId()) { | |||
| case R.id.btn_clear_shake_hands: | |||
| type = BleDeviceConfig.CLEAR_SHAKE_HANDS; | |||
| break; | |||
| case R.id.btn_sphy: | |||
| type = BleDeviceConfig.BLOOD_PRESSURE; | |||
| break; | |||
| case R.id.btn_sphy_wifi_ble: | |||
| type = BleDeviceConfig.SPHY_WIFI_BLE; | |||
| break; | |||
| case R.id.btn_tempgun: | |||
| type = BleDeviceConfig.INFRARED_THERMOMETER; | |||
| break; | |||
| case R.id.btn_temp: | |||
| type = BleDeviceConfig.THERMOMETER; | |||
| break; | |||
| case R.id.btn_baby: | |||
| type = BleDeviceConfig.BABY_SCALE; | |||
| break; | |||
| case R.id.btn_height: | |||
| type = BleDeviceConfig.HEIGHT_METER; | |||
| break; | |||
| case R.id.btn_lock: | |||
| type = BleDeviceConfig.SMART_LOCK; | |||
| break; | |||
| case R.id.btn_ad_weight: | |||
| type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; | |||
| break; | |||
| case R.id.btn_wifi_ble_weight: | |||
| type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE; | |||
| break; | |||
| case R.id.btn_wifi_ble_tooth: | |||
| type = BleDeviceConfig.TOOTHBRUSH_WIFI_BLE; | |||
| break; | |||
| case R.id.btn_ble_weight: | |||
| type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE; | |||
| break; | |||
| case R.id.glucometer: | |||
| type = BleDeviceConfig.BLOOD_GLUCOSE; | |||
| break; | |||
| case R.id.btn_baby_body_fat: | |||
| type = BleDeviceConfig.BABY_BODY_FAT; | |||
| break; | |||
| case R.id.btn_temp_instrument: | |||
| type = BleDeviceConfig.TEMP_INSTRUMENT; | |||
| break; | |||
| case R.id.btn_mqtt_air_detector: | |||
| type = BleDeviceConfig.MQTT_AIR_DETECTOR; | |||
| break; | |||
| case R.id.btn_air_detector: | |||
| type = BleDeviceConfig.AIR_DETECTOR; | |||
| break; | |||
| case R.id.btn_broadcast_scale: | |||
| Intent intentBroadcast = new Intent(MainActivity.this, BroadcastScaleActivity.class); | |||
| startActivity(intentBroadcast); | |||
| return; | |||
| case R.id.btn_broadcast_scale_weight: | |||
| Intent intentBroadcastWeight = new Intent(MainActivity.this, BroadcastWeightScaleActivity.class); | |||
| startActivity(intentBroadcastWeight); | |||
| return; | |||
| case R.id.btn_broadcast_blood_oxygen: | |||
| Intent intentBloodOxygen = new Intent(MainActivity.this, BroadcastBloodOxygenActivity.class); | |||
| startActivity(intentBloodOxygen); | |||
| return; | |||
| case R.id.btn_smart_mask: | |||
| type = BleDeviceConfig.SMART_MASK; | |||
| break; | |||
| case R.id.btn_bleBo: | |||
| type = BleDeviceConfig.BLE_BOOLD_OXYGEN; | |||
| break; | |||
| // case R.id.btn_bld: | |||
| // type = BleDeviceConfig.BLD_WEIGHT; | |||
| // break; | |||
| case R.id.btn_ble: | |||
| type = -1; | |||
| break; | |||
| case R.id.btn_ble_test: | |||
| type = -2; | |||
| break; | |||
| case R.id.btn_ota: | |||
| type = -3; | |||
| break; | |||
| case R.id.btn_transmission: | |||
| type = -4; | |||
| break; | |||
| case R.id.btn_blood_pressure_tc: | |||
| // 血压计透传 | |||
| type = -10; | |||
| break; | |||
| case R.id.eight_scale: | |||
| type = BleDeviceConfig.EIGHT_BODY_FAT_SCALE; | |||
| break; | |||
| case R.id.btnConnectTest: | |||
| Intent intent = new Intent(MainActivity.this, ConnectBleTestActivity.class); | |||
| startActivity(intent); | |||
| return; | |||
| case R.id.wifi_config: | |||
| Intent intent1 = new Intent(MainActivity.this, WifiConfigActivity.class); | |||
| startActivity(intent1); | |||
| return; | |||
| case R.id.btn_coffeeScale: | |||
| // 咖啡秤 | |||
| type = BleDeviceConfig.COFFEE_SCALE; | |||
| break; | |||
| case R.id.btn_scooter: | |||
| type = BleDeviceConfig.SMART_SCOOTER; | |||
| break; | |||
| case R.id.btn_shareCharger: | |||
| // 共享充电器 | |||
| type = BleDeviceConfig.SHARE_CHARGER; | |||
| break; | |||
| case R.id.btn_share_socket: | |||
| // 共享插座 | |||
| type = BleDeviceConfig.SHARE_SOCKET; | |||
| break; | |||
| case R.id.btn_share_condom: | |||
| // 共享插座 | |||
| type = BleDeviceConfig.SHARE_CONDOM; | |||
| break; | |||
| case R.id.btn_find: | |||
| // 寻物器 | |||
| Intent findDeviceActivity = new Intent(MainActivity.this, FindDeviceNewActivity.class); | |||
| startActivity(findDeviceActivity); | |||
| return; | |||
| case R.id.btn_broadcast_height: | |||
| // 广播身高仪 | |||
| Intent intentBroadcastHeight = new Intent(MainActivity.this, BroadcastHeightActivity.class); | |||
| startActivity(intentBroadcastHeight); | |||
| return; | |||
| case R.id.btn_4g_bs: | |||
| // 4G 血糖仪 | |||
| Intent bloodSugar4GIntent = new Intent(MainActivity.this, BloodSugar4GActivity.class); | |||
| startActivity(bloodSugar4GIntent); | |||
| return; | |||
| case R.id.btn_food_temp: | |||
| // 食品温度计 | |||
| type = BleDeviceConfig.FOOD_TEMP; | |||
| break; | |||
| case R.id.btn_hbfs: | |||
| type = BleDeviceConfig.HEIGHT_BODY_FAT; | |||
| break; | |||
| case R.id.btn_temp_humidity: | |||
| type = BleDeviceConfig.TEMP_Humidity; | |||
| break; | |||
| case R.id.btn_rope_skip: | |||
| type = BleDeviceConfig.ROPE_SKIPPING; | |||
| break; | |||
| case R.id.btn_broadcast_nutrition: | |||
| // 广播营养秤 | |||
| Intent broadcastNutritionIntent = new Intent(MainActivity.this, BroadNutritionActivity.class); | |||
| startActivity(broadcastNutritionIntent); | |||
| return; | |||
| case R.id.btn_ble_nutrition: | |||
| // 蓝牙营养秤 | |||
| type = BleDeviceConfig.BLE_NUTRITION_SCALE; | |||
| break; | |||
| case R.id.btn_toothbrush_test: | |||
| // 牙刷测试 | |||
| type = BleDeviceConfig.TOOTHBRUSH_TEST; | |||
| break; | |||
| case R.id.btn_leaone_broadcast: | |||
| // LeaOne 广播秤 | |||
| Intent broadcastLeaOneIntent = new Intent(MainActivity.this, LeaOneBroadcastActivity.class); | |||
| startActivity(broadcastLeaOneIntent); | |||
| return; | |||
| case R.id.btn_fascia_gun: | |||
| // 筋膜枪 | |||
| type = BleDeviceConfig.FASCIA_GUN; | |||
| break; | |||
| case R.id.btn_scooter_cm02: | |||
| type = BleDeviceConfig.SMART_SCOOTER_CM02; | |||
| break; | |||
| case R.id.btn_body_scale_4g: | |||
| // 4G 体脂秤 | |||
| Intent bodyScaleIntent = new Intent(MainActivity.this, BodyScale4GActivity.class); | |||
| startActivity(bodyScaleIntent); | |||
| return; | |||
| case R.id.btn_public_ble_network: | |||
| // BLE通用配网 | |||
| type = BleDeviceConfig.PUBLIC_BLE_NETWORK; | |||
| break; | |||
| case R.id.btn_wifi_ble_noise_meter: | |||
| // wifi+ble噪音计 | |||
| type = BleDeviceConfig.WIFI_BLE_NOISE_METER; | |||
| break; | |||
| case R.id.btn_ble_noise_meter: | |||
| // ble噪音计 | |||
| type = BleDeviceConfig.BLE_NOISE_METER; | |||
| break; | |||
| case R.id.btn_meat_probe_charger: | |||
| //食物探针充电盒 | |||
| type = BleDeviceConfig.MEAT_PROBE_CHARGER; | |||
| break; | |||
| case R.id.btn_weight_scale: | |||
| //体重秤 | |||
| type = BleDeviceConfig.WEIGHT_SCALE; | |||
| break; | |||
| case R.id.btn_meat_probe: | |||
| // 食物探针 | |||
| type = BleDeviceConfig.MEAT_PROBE; | |||
| break; | |||
| case R.id.btn_barometric_temp_humidity: | |||
| type = BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY; | |||
| break; | |||
| case R.id.btn_mqtt: | |||
| return; | |||
| default: | |||
| return; | |||
| } | |||
| startActivity(type); | |||
| } | |||
| } | |||
| private void startActivity(int type) { | |||
| Intent intent = new Intent(this, ShowBleActivity.class); | |||
| intent.putExtra("type", type); | |||
| startActivity(intent); | |||
| } | |||
| @Override | |||
| protected void onResume() { | |||
| super.onResume(); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| BleLog.quit(); | |||
| } | |||
| //-----------------------权限---------------------------------------- | |||
| /** | |||
| * 需要申请的权限 | |||
| */ | |||
| private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}; | |||
| private final static String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT}; | |||
| /** | |||
| * 权限请求返回 | |||
| */ | |||
| private final int PERMISSION = 101; | |||
| /** | |||
| * 定位服务返回 | |||
| */ | |||
| protected final int LOCATION_SERVER = 102; | |||
| private HintDataDialogFragment mHintDataDialog = null; | |||
| protected void initPermissions() { | |||
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | |||
| onPermissionsOk(); | |||
| return; | |||
| } | |||
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | |||
| if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) { | |||
| ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | |||
| } else { | |||
| boolean bleStatus = AppStart.isLocServiceEnable(mContext); | |||
| if (!bleStatus) { | |||
| //没有开启定位服务 | |||
| mHintDataDialog = HintDataDialogFragment.newInstance() | |||
| .setTitle("提示", 0) | |||
| .setCancel("取消", 0) | |||
| .setOk("确定", 0) | |||
| .setContent("请求开启定位服务", true) | |||
| .setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v) { | |||
| startLocationActivity(); | |||
| } | |||
| }); | |||
| mHintDataDialog.show(getSupportFragmentManager()); | |||
| } else { | |||
| onPermissionsOk(); | |||
| } | |||
| } | |||
| } else { | |||
| if (ContextCompat.checkSelfPermission(this, BLUETOOTH_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) { | |||
| ActivityCompat.requestPermissions(this, BLUETOOTH_PERMISSION, PERMISSION); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||
| super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
| //请求权限被拒绝 | |||
| if (requestCode != PERMISSION) | |||
| return; | |||
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | |||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
| initPermissions(); | |||
| } else { | |||
| if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERMISSION[0])) { | |||
| //权限请求失败,但未选中“不再提示”选项,再次请求 | |||
| ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | |||
| } else { | |||
| //权限请求失败,选中“不再提示”选项 | |||
| mHintDataDialog = HintDataDialogFragment.newInstance() | |||
| .setTitle("提示", 0) | |||
| .setCancel("取消", 0) | |||
| .setOk("确定", 0) | |||
| .setContent("请求开启定位权限", true) | |||
| .setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v) { | |||
| AppStart.startUseSetActivity(mContext); | |||
| } | |||
| }); | |||
| mHintDataDialog.show(getSupportFragmentManager()); | |||
| } | |||
| } | |||
| } else { | |||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
| initPermissions(); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 启动去设置定位服务 | |||
| */ | |||
| protected void startLocationActivity() { | |||
| AppStart.startLocationActivity(this, LOCATION_SERVER); | |||
| } | |||
| /** | |||
| * 权限ok | |||
| */ | |||
| protected void onPermissionsOk() { | |||
| } | |||
| @Override | |||
| protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |||
| super.onActivityResult(requestCode, resultCode, data); | |||
| if (requestCode == LOCATION_SERVER) { | |||
| //定位服务页面返回 | |||
| initPermissions(); | |||
| } | |||
| } | |||
| } | |||
| @@ -34,7 +34,6 @@ import com.pingwang.bluetoothlib.config.BleConfig; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||
| import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||
| import com.pingwang.bluetoothlib.server.ELinkBleServer; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| @@ -47,28 +46,9 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.home.HomeDataManager; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.home.MainActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifible_sphy.WifiBleSphyActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | |||
| import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData; | |||
| @@ -103,6 +83,7 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| private int mPid; | |||
| private int mScanCid = 0; | |||
| private String mBleName; | |||
| private Class<?> targetClass; | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| @@ -126,26 +107,29 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_show_ble); | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | |||
| Intent mUserService = new Intent(this.getApplicationContext(), ELinkBleServer.class); | |||
| //核心用户服务 | |||
| startService(mUserService); | |||
| } | |||
| mContext = this; | |||
| mType = getIntent().getIntExtra("type", 0); | |||
| mCid = getIntent().getIntExtra("cid", 0); | |||
| if (0 == mType) { | |||
| finish(); | |||
| return; | |||
| } | |||
| mScanCid = mType; | |||
| mScanCid = mCid; | |||
| targetClass = HomeDataManager.getTargetActivityClass(mType); | |||
| if (targetClass == null) { | |||
| return; | |||
| } | |||
| init(); | |||
| initData(); | |||
| // 如果是蓝牙牙刷,就弹个框提醒 | |||
| if (mType == BleDeviceConfig.TOOTHBRUSH_TEST) { | |||
| if (mCid == BleDeviceConfig.TOOTHBRUSH_TEST) { | |||
| new AlertDialog.Builder(mContext).setMessage("启动牙刷,工作10秒钟,然后关闭牙刷(让牙刷处于广播状态),然后点击搜索,选中列表中的牙刷,开始测试") | |||
| .setPositiveButton("确认", null) | |||
| .show(); | |||
| .setPositiveButton("确认", null) | |||
| .show(); | |||
| } | |||
| } | |||
| @@ -269,8 +253,10 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| } | |||
| } else if (mCid == BleDeviceConfig.MEAT_PROBE_CHARGER) { | |||
| //探针充电盒握手 | |||
| BleConfig.setHandshakeStatus(mac, true, mCid, mVid, mPid); | |||
| mNoEncryptionMac = mac; | |||
| if (mVid == 0x54) { | |||
| BleConfig.setHandshakeStatus(mac, true, mCid, mVid, mPid); | |||
| mNoEncryptionMac = mac; | |||
| } | |||
| } | |||
| if (mAILinkBleManager != null) { | |||
| mAILinkBleManager.stopScan(); | |||
| @@ -383,172 +369,8 @@ public class ShowBleActivity extends BleBaseActivity implements OnCallbackBle, O | |||
| dismissLoading(); | |||
| Intent intent = new Intent(); | |||
| int type = mType;//默认婴儿秤 | |||
| switch (type) { | |||
| case BleDeviceConfig.BABY_SCALE: | |||
| intent.setClass(ShowBleActivity.this, BabyCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.INFRARED_THERMOMETER: | |||
| intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.BLOOD_PRESSURE: | |||
| intent.setClass(ShowBleActivity.this, SphyCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.SPHY_WIFI_BLE: | |||
| intent.setClass(ShowBleActivity.this, WifiBleSphyActivity.class); | |||
| break; | |||
| case BleDeviceConfig.THERMOMETER: | |||
| intent.setClass(ShowBleActivity.this, TempCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.HEIGHT_METER: | |||
| intent.setClass(ShowBleActivity.this, HeightCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE: | |||
| intent.setClass(ShowBleActivity.this, WeightScaleBleActivity.class); | |||
| break; | |||
| case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD: | |||
| intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE: | |||
| intent.setClass(ShowBleActivity.this, WeightScaleWifiBleActivity.class); | |||
| break; | |||
| case BleDeviceConfig.TOOTHBRUSH_WIFI_BLE: | |||
| intent.setClass(ShowBleActivity.this, ToothBrushWifiBleActivity.class); | |||
| break; | |||
| case BleDeviceConfig.EIGHT_BODY_FAT_SCALE: | |||
| intent.setClass(ShowBleActivity.this, EightBodyfatActivity.class); | |||
| break; | |||
| case BleDeviceConfig.BLOOD_GLUCOSE: | |||
| intent.setClass(ShowBleActivity.this, BloodGlucoseActivity.class); | |||
| break; | |||
| case BleDeviceConfig.BABY_BODY_FAT: | |||
| intent.setClass(ShowBleActivity.this, BabyBodyFatCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.SMART_MASK: | |||
| intent.setClass(ShowBleActivity.this, SmartMaskActivity.class); | |||
| break; | |||
| case BleDeviceConfig.SMART_SCOOTER_CM02: | |||
| intent.setClass(ShowBleActivity.this, AiLinkScooterActivity.class); | |||
| break; | |||
| case BleDeviceConfig.BLE_BOOLD_OXYGEN: | |||
| intent.setClass(ShowBleActivity.this, BloodOxygenActivity.class); | |||
| break; | |||
| case BleDeviceConfig.COFFEE_SCALE: | |||
| // 咖啡秤 | |||
| intent.setClass(ShowBleActivity.this, CoffeeScaleActivity.class); | |||
| break; | |||
| case BleDeviceConfig.SHARE_CHARGER: | |||
| // 共享充电器 | |||
| intent.setClass(ShowBleActivity.this, ShareChargerActivity.class); | |||
| break; | |||
| case BleDeviceConfig.SHARE_SOCKET: | |||
| // 共享插座 | |||
| intent.setClass(ShowBleActivity.this, ShareSocketActivity.class); | |||
| break; | |||
| case BleDeviceConfig.SHARE_CONDOM: | |||
| // 共享套套机 | |||
| intent.setClass(ShowBleActivity.this, ShareCondomActivity.class); | |||
| break; | |||
| case BleDeviceConfig.FIND_DEVICE: | |||
| // 寻物器 | |||
| // intent.setClass(ShowBleActivity.this, FindDeviceActivity.class); | |||
| intent.setClass(ShowBleActivity.this, FindDeviceNewActivity.class); | |||
| BleConfig.setHandshakeStatus(mac, false); | |||
| break; | |||
| case BleDeviceConfig.FOOD_TEMP: | |||
| // 食品温度计 | |||
| intent.setClass(ShowBleActivity.this, FoodTempActivity.class); | |||
| break; | |||
| case BleDeviceConfig.HEIGHT_BODY_FAT: | |||
| intent.setClass(ShowBleActivity.this, HeightWeightScaleActivity.class); | |||
| break; | |||
| case BleDeviceConfig.TEMP_Humidity: | |||
| case BleDeviceConfig.TEMP_Humidity_wifi: | |||
| intent.setClass(ShowBleActivity.this, TempHumidityActivity.class); | |||
| break; | |||
| case BleDeviceConfig.ROPE_SKIPPING: | |||
| intent.setClass(ShowBleActivity.this, RopeSkippingActivity.class); | |||
| break; | |||
| case BleDeviceConfig.BLE_NUTRITION_SCALE: | |||
| // 蓝牙营养秤 | |||
| intent.setClass(ShowBleActivity.this, BleNutritionActivity.class); | |||
| break; | |||
| case BleDeviceConfig.TOOTHBRUSH_TEST: | |||
| // 牙刷测试 | |||
| intent.setClass(ShowBleActivity.this, ToothbrushTestActivity.class); | |||
| break; | |||
| case BleDeviceConfig.FASCIA_GUN: | |||
| // 筋膜枪 | |||
| intent.setClass(ShowBleActivity.this, FasciaGunActivity.class); | |||
| break; | |||
| case BleDeviceConfig.TEMP_INSTRUMENT: | |||
| // 测温仪 | |||
| intent.setClass(ShowBleActivity.this, TempInstrumentActivity.class); | |||
| break; | |||
| case BleDeviceConfig.PUBLIC_BLE_NETWORK: | |||
| // 通用配网 | |||
| intent.setClass(ShowBleActivity.this, PublicBleNetworkCmdActivity.class); | |||
| break; | |||
| case BleDeviceConfig.AIR_DETECTOR: | |||
| case BleDeviceConfig.MQTT_AIR_DETECTOR: | |||
| intent.setClass(ShowBleActivity.this, AirDetectorActivity.class); | |||
| break; | |||
| //wifi+ble噪音计 | |||
| case BleDeviceConfig.WIFI_BLE_NOISE_METER: | |||
| intent.setClass(ShowBleActivity.this, WifiBleNoiseMeterActivity.class); | |||
| break; | |||
| //ble噪音计 | |||
| case BleDeviceConfig.BLE_NOISE_METER: | |||
| intent.setClass(ShowBleActivity.this, BleNoiseMeterActivity.class); | |||
| break; | |||
| //探针充电盒 | |||
| case BleDeviceConfig.MEAT_PROBE_CHARGER: | |||
| intent.setClass(ShowBleActivity.this, MeatProbeChargerActivity.class); | |||
| break; | |||
| //体脂秤 | |||
| case BleDeviceConfig.WEIGHT_SCALE: | |||
| intent.setClass(ShowBleActivity.this, WeightScaleActivity.class); | |||
| break; | |||
| // case BleDeviceConfig.BLD_WEIGHT: | |||
| // intent.setClass(ShowBleActivity.this, BLDWeightScaleBle.class); | |||
| // break; | |||
| case -1: | |||
| intent.setClass(ShowBleActivity.this, BleCmdActivity.class); | |||
| break; | |||
| case -2: | |||
| intent.setClass(ShowBleActivity.this, TestCmdActivity.class); | |||
| break; | |||
| case -3: | |||
| // intent.setClass(ShowBleActivity.this, TestOtaActivity.class); | |||
| break; | |||
| case -4: | |||
| intent.setClass(ShowBleActivity.this, TransmissionActivity.class); | |||
| break; | |||
| case -10: | |||
| // 血压计透传 | |||
| intent.setClass(ShowBleActivity.this, BloodPressureTcActivity.class); | |||
| break; | |||
| case BleDeviceConfig.CLEAR_SHAKE_HANDS: | |||
| //验证不握手不加密的界面 | |||
| intent.setClass(ShowBleActivity.this, ClearShakeHandsActivity.class); | |||
| break; | |||
| //食物探针 | |||
| case BleDeviceConfig.MEAT_PROBE: | |||
| intent.setClass(ShowBleActivity.this, MeatProbeActivity.class); | |||
| break; | |||
| case BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY: | |||
| // 气压温湿度计 | |||
| intent.setClass(ShowBleActivity.this, BarometricTempHygrometerActivity.class); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| intent.setClass(ShowBleActivity.this, targetClass); | |||
| mAILinkBleManager.removeOnCallbackBle(this); | |||
| intent.putExtra("type", type); | |||
| intent.putExtra("mac", mac); | |||
| intent.putExtra("cid", mCid); | |||
| @@ -25,15 +25,14 @@ import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||
| import com.pingwang.bluetoothlib.utils.UuidUtils; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import java.util.Locale; | |||
| import java.util.UUID; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| /** | |||
| * xing<br> | |||
| @@ -462,7 +462,6 @@ public class WeightScaleBleActivity extends BleBaseActivity implements View.OnCl | |||
| } | |||
| @Override | |||
| public void onIpData(String ip) { | |||
| @@ -2,6 +2,9 @@ package aicare.net.cn.sdk.ailinksdkdemoandroid.base; | |||
| import android.app.Application; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| public class MyApplication extends Application { | |||
| private static MyApplication sInstance; | |||
| @@ -10,6 +13,14 @@ public class MyApplication extends Application { | |||
| public void onCreate() { | |||
| super.onCreate(); | |||
| sInstance = this; | |||
| initLog(); | |||
| } | |||
| private void initLog() { | |||
| String logPath = L.getDefaultLogPath(this); | |||
| String fileName = L.getDefaultLogName(); | |||
| L.init(logPath, fileName, true); | |||
| } | |||
| public static MyApplication getInstance(){ | |||
| @@ -1,21 +0,0 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.config; | |||
| import java.util.List; | |||
| /** | |||
| * xing<br> | |||
| * 2021/3/5<br> | |||
| * java类作用描述 | |||
| */ | |||
| public class AppConfig { | |||
| /** | |||
| * 是否为客户专用OTA | |||
| */ | |||
| public static boolean APP_TYPE_OTA=false; | |||
| /** | |||
| * 支持显示的ID,null表示所有的都显示,ID是按钮的ID不是CID | |||
| */ | |||
| public static List<Integer> SHOW_VIEW_ID = null; | |||
| } | |||
| @@ -259,7 +259,22 @@ public class BleDeviceConfig { | |||
| public static final int BAROMETRIC_TEMP_HUMIDITY = 0x005C; | |||
| //------------------特殊 | |||
| /** | |||
| * Ble通用设置 | |||
| */ | |||
| public static final int BLE_GENERAL_SETTINGS = -1; | |||
| /** | |||
| * Ble test | |||
| */ | |||
| public static final int BLE_TEST = -2; | |||
| /** | |||
| * OTA通用 | |||
| */ | |||
| public static final int OTA = -3; | |||
| /** | |||
| * 透传 | |||
| */ | |||
| public static final int PENETRATE = -4; | |||
| /** | |||
| * 验证不握手不加密的id | |||
| @@ -269,4 +284,12 @@ public class BleDeviceConfig { | |||
| * 通用配网 | |||
| */ | |||
| public final static int PUBLIC_BLE_NETWORK = -7; | |||
| /** | |||
| * 血压计透传 | |||
| */ | |||
| public static final int SPHYGMOMETER_PENETRATE = -10; | |||
| /** | |||
| * wifi_ble_OTA | |||
| */ | |||
| public final static int WIFI_BLE_OTA = -11; | |||
| } | |||
| @@ -19,7 +19,6 @@ import androidx.fragment.app.FragmentManager; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| public class WifiDialog extends DialogFragment implements View.OnClickListener { | |||
| /** | |||
| @@ -0,0 +1,206 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
| import java.util.ArrayList; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.AiLinkScooterActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BabyBodyFatCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BabyCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BleCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodOxygenActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BloodSugar4GActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ClearShakeHandsActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.HeightWeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TempHumidityActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.PublicBleNetworkCmdActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.TempInstrument.TempInstrumentActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.airdetector.AirDetectorActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.barometric_temp_humidity.BarometricTempHygrometerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ble_nutrition.BleNutritionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_glucose.BloodGlucoseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.blood_pressure_tc.BloodPressureTcActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.body_scale_4g.BodyScale4GActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_height.BroadcastHeightActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_nutrition.BroadNutritionActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.broadcast_weight_sacle.BroadcastWeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.coffee_scale.CoffeeScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.fascia_gun.FasciaGunActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.leaone_broadcast.LeaOneBroadcastActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe.MeatProbeActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.meat_probe_charger.MeatProbeChargerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.BleNoiseMeterActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.noise_meter.WifiBleNoiseMeterActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.ropeskipping.RopeSkippingSetActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush.ToothBrushWifiBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.toothbrush_test.ToothbrushTestActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.weight_scale.WeightScaleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale.WeightScaleWifiBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifible_sphy.WifiBleSphyActivity; | |||
| /** | |||
| * 说明: | |||
| * | |||
| * @author yesp | |||
| * 2024/1/5 | |||
| */ | |||
| public class HomeDataManager { | |||
| public static final int IGNORE_TYPE = -1000; | |||
| /** | |||
| * 获取 item 集合 | |||
| */ | |||
| public static ArrayList<JumpBean> getHomeDataList() { | |||
| ArrayList<JumpBean> beanList = new ArrayList<>(); | |||
| // Ble通用设置 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_GENERAL_SETTINGS, R.string.item_ble_general_settings, null, BleCmdActivity.class)); | |||
| // BLE通用配网 | |||
| beanList.add(new JumpBean(BleDeviceConfig.PUBLIC_BLE_NETWORK, R.string.item_ble_universal_distribution_network, null, PublicBleNetworkCmdActivity.class)); | |||
| // Ble test | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_TEST, R.string.item_ble_test, null, TestCmdActivity.class)); | |||
| // Ble connect test | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_ble_connect_test, ConnectBleTestActivity.class, null)); | |||
| // 透传 | |||
| beanList.add(new JumpBean(BleDeviceConfig.PENETRATE, R.string.item_penetrate, null, TransmissionActivity.class)); | |||
| // 广播秤 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_broadcast, BroadcastScaleActivity.class, null)); | |||
| // Ble体脂秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_ble, null, WeightScaleBleActivity.class)); | |||
| // 4G体脂秤 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_body_fat_scale_4g, BodyScale4GActivity.class, null)); | |||
| // WiFi+Ble体脂秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE, R.string.item_body_fat_scale_wifi_ble, null, WeightScaleWifiBleActivity.class)); | |||
| // 八极秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.EIGHT_BODY_FAT_SCALE, R.string.item_body_fat_scale_eight, null, EightBodyfatActivity.class)); | |||
| // 艾迪体脂秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD, R.string.item_body_fat_scale_aidi, null, ADWeightScaleCmdActivity.class)); | |||
| // 婴儿秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BABY_SCALE, R.string.item_baby_scale, null, BabyCmdActivity.class)); | |||
| // 婴儿体脂两用秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BABY_BODY_FAT, R.string.item_baby_body_fat_scale, null, BabyBodyFatCmdActivity.class)); | |||
| // Ble体重秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.WEIGHT_SCALE, R.string.item_weight_scale_ble, null, WeightScaleActivity.class)); | |||
| // 广播体重秤 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_weight_scale_broadcast, BroadcastWeightScaleActivity.class, null)); | |||
| // 蓝牙营养秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_NUTRITION_SCALE, R.string.item_nutritional_scale_ble, null, BleNutritionActivity.class)); | |||
| // 广播营养秤 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_nutritional_scale_broadcast, BroadNutritionActivity.class, null)); | |||
| // 咖啡秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.COFFEE_SCALE, R.string.item_coffee_scale, null, CoffeeScaleActivity.class)); | |||
| // 身高体脂秤 | |||
| beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_BODY_FAT, R.string.item_height_body_fat_scale, null, HeightWeightScaleActivity.class)); | |||
| // 身高仪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.HEIGHT_METER, R.string.item_height_measuring_ble, null, HeightCmdActivity.class)); | |||
| // 广播身高仪 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_height_measuring_broadcast, BroadcastHeightActivity.class, null)); | |||
| // BLE血压计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLOOD_PRESSURE, R.string.item_sphygmometer_ble, null, SphyCmdActivity.class)); | |||
| // wifi血压计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SPHY_WIFI_BLE, R.string.item_sphygmometer_wifi, null, WifiBleSphyActivity.class)); | |||
| // 血压计透传 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SPHYGMOMETER_PENETRATE, R.string.item_sphygmometer_penetrate, null, BloodPressureTcActivity.class)); | |||
| // 血糖仪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLOOD_GLUCOSE, R.string.item_blood_glucose_meter_ble, null, BloodGlucoseActivity.class)); | |||
| // 4G血糖仪 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_blood_glucose_meter_4g, BloodSugar4GActivity.class, null)); | |||
| // 血氧仪(广播) | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_oximeter_broadcast, BroadcastBloodOxygenActivity.class, null)); | |||
| // 血氧(连接) | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_BOOLD_OXYGEN, R.string.item_oximeter_ble, null, BloodOxygenActivity.class)); | |||
| // 额温枪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.INFRARED_THERMOMETER, R.string.item_infrared_thermometer, null, TempGunCmdActivity.class)); | |||
| // 体温计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.THERMOMETER, R.string.item_thermometer, null, TempCmdActivity.class)); | |||
| // 测温仪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.TEMP_INSTRUMENT, R.string.item_auto_thermometer, null, TempInstrumentActivity.class)); | |||
| // 食品温度计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.FOOD_TEMP, R.string.item_food_thermometer, null, FoodTempActivity.class)); | |||
| // 食物探针 | |||
| beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE, R.string.item_meat_probe, null, MeatProbeActivity.class)); | |||
| // 探针充电盒 | |||
| beanList.add(new JumpBean(BleDeviceConfig.MEAT_PROBE_CHARGER, R.string.item_probe_charging_box, null, MeatProbeChargerActivity.class)); | |||
| // 牙刷(wifi+ble) | |||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_WIFI_BLE, R.string.item_toothbrush_wifi_ble, null, ToothBrushWifiBleActivity.class)); | |||
| // 牙刷测试 | |||
| beanList.add(new JumpBean(BleDeviceConfig.TOOTHBRUSH_TEST, R.string.item_toothbrush_test, null, ToothbrushTestActivity.class)); | |||
| // 口罩 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SMART_MASK, R.string.item_smart_mask, null, SmartMaskActivity.class)); | |||
| // 筋膜枪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.FASCIA_GUN, R.string.item_fascia_gun, null, FasciaGunActivity.class)); | |||
| // 跳绳 | |||
| beanList.add(new JumpBean(BleDeviceConfig.ROPE_SKIPPING, R.string.item_rope_skipping, null, RopeSkippingActivity.class)); | |||
| // 跳绳设置模式 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_rope_skipping_set_mode, RopeSkippingSetActivity.class, null)); | |||
| // 温湿度计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.TEMP_Humidity, R.string.item_hygrothermograph, null, TempHumidityActivity.class)); | |||
| // 气压温湿度计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BAROMETRIC_TEMP_HUMIDITY, R.string.item_barothermohygrograph, null, BarometricTempHygrometerActivity.class)); | |||
| // ble噪音计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.BLE_NOISE_METER, R.string.item_noise_meter_ble, null, BleNoiseMeterActivity.class)); | |||
| // wifi+ble噪音计 | |||
| beanList.add(new JumpBean(BleDeviceConfig.WIFI_BLE_NOISE_METER, R.string.item_noise_meter_wifi_ble, null, WifiBleNoiseMeterActivity.class)); | |||
| // 空气检测仪 | |||
| beanList.add(new JumpBean(BleDeviceConfig.MQTT_AIR_DETECTOR, R.string.item_air_Detector, null, AirDetectorActivity.class)); | |||
| // 电滑板Cm02 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SMART_SCOOTER_CM02, R.string.item_scooter_cm02, null, AiLinkScooterActivity.class)); | |||
| // 共享充电器 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SHARE_CHARGER, R.string.item_shared_charger, null, ShareChargerActivity.class)); | |||
| // 共享插座 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SHARE_SOCKET, R.string.item_shared_socket, null, ShareSocketActivity.class)); | |||
| // 共享套套机 | |||
| beanList.add(new JumpBean(BleDeviceConfig.SHARE_CONDOM, R.string.item_condom, null, ShareCondomActivity.class)); | |||
| // 寻物器 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_finder, FindDeviceNewActivity.class, null)); | |||
| // LeaOne测试 | |||
| beanList.add(new JumpBean(IGNORE_TYPE, R.string.item_leaone, LeaOneBroadcastActivity.class, null)); | |||
| return beanList; | |||
| } | |||
| public static ArrayList<JumpBean> getHideDataList() { | |||
| ArrayList<JumpBean> hideList = new ArrayList<>(); | |||
| // 不握手不加密 | |||
| hideList.add(new JumpBean(BleDeviceConfig.CLEAR_SHAKE_HANDS, R.string.item_no_handshake_encryption, null, ClearShakeHandsActivity.class)); | |||
| // wifi 配置 | |||
| hideList.add(new JumpBean(IGNORE_TYPE, R.string.item_wifi_config, WifiConfigActivity.class, null)); | |||
| return hideList; | |||
| } | |||
| /** | |||
| * 要跳转的目标Activity | |||
| * @param type | |||
| * @return | |||
| */ | |||
| public static Class<?> getTargetActivityClass(int type) { | |||
| ArrayList<JumpBean> dataList = getHomeDataList(); | |||
| for (JumpBean bean : dataList) { | |||
| if (bean.getItemType() == type) { | |||
| return bean.getTargetActivityClass(); | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -0,0 +1,91 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
| import android.content.Context; | |||
| import android.view.LayoutInflater; | |||
| import android.view.View; | |||
| import android.view.ViewGroup; | |||
| import android.widget.TextView; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.recyclerview.widget.RecyclerView; | |||
| import java.util.ArrayList; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| /** | |||
| * 说明: | |||
| * | |||
| * @author yesp | |||
| * 2024/1/5 | |||
| */ | |||
| public class HomeListAdapter extends RecyclerView.Adapter<HomeListAdapter.MyHolder> { | |||
| private Context context; | |||
| private ArrayList<JumpBean> list; | |||
| private ItemClickListener itemClickListener; | |||
| public HomeListAdapter(Context context, ArrayList<JumpBean> list) { | |||
| this.context = context; | |||
| this.list = list; | |||
| } | |||
| public void setList(ArrayList<JumpBean> list) { | |||
| this.list = list; | |||
| } | |||
| public void setItemClickListener(ItemClickListener itemClickListener) { | |||
| this.itemClickListener = itemClickListener; | |||
| } | |||
| @NonNull | |||
| @Override | |||
| public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||
| MyHolder holder = new MyHolder(LayoutInflater.from(context).inflate(R.layout.item_home_list, parent, false)); | |||
| holder.itemView.setOnClickListener(v -> { | |||
| if (itemClickListener != null) { | |||
| int position = holder.getBindingAdapterPosition(); | |||
| if (position < 0 || position >= list.size()) { | |||
| return; | |||
| } | |||
| itemClickListener.onItemClick(list.get(position)); | |||
| } | |||
| }); | |||
| return holder; | |||
| } | |||
| @Override | |||
| public void onBindViewHolder(@NonNull MyHolder holder, int position) { | |||
| holder.tvContent.setText(context.getString(list.get(position).getItemNameResId())); | |||
| } | |||
| @Override | |||
| public int getItemCount() { | |||
| if (list != null && list.size() > 0) { | |||
| return list.size(); | |||
| } else { | |||
| return 0; | |||
| } | |||
| } | |||
| class MyHolder extends RecyclerView.ViewHolder { | |||
| private TextView tvContent; | |||
| public MyHolder(@NonNull View itemView) { | |||
| super(itemView); | |||
| tvContent = itemView.findViewById(R.id.tv_content); | |||
| } | |||
| } | |||
| public interface ItemClickListener { | |||
| /** | |||
| * item 点击 | |||
| * | |||
| * @param bean bean | |||
| */ | |||
| void onItemClick(JumpBean bean); | |||
| } | |||
| } | |||
| @@ -0,0 +1,85 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
| /** | |||
| * 说明: | |||
| * | |||
| * @author yesp | |||
| * 2024/1/5 | |||
| */ | |||
| public class JumpBean { | |||
| private int itemType; | |||
| /** | |||
| * cid | |||
| */ | |||
| private int cid; | |||
| /** | |||
| * 显示名称 | |||
| */ | |||
| private int itemNameResId; | |||
| /** | |||
| * 需要单独跳转的 Activity | |||
| */ | |||
| private Class<?> jumpActivityClass; | |||
| /** | |||
| * 目的跳转的 Activity | |||
| */ | |||
| private Class<?> targetActivityClass; | |||
| public JumpBean(int itemType, int itemNameResId, Class<?> jumpActivityClass, Class<?> targetActivityClass) { | |||
| this.itemType = itemType; | |||
| this.cid = itemType; | |||
| this.itemNameResId = itemNameResId; | |||
| this.jumpActivityClass = jumpActivityClass; | |||
| this.targetActivityClass = targetActivityClass; | |||
| } | |||
| public JumpBean(int itemType, int cid, int itemNameResId, Class<?> jumpActivityClass, Class<?> targetActivityClass) { | |||
| this.itemType = itemType; | |||
| this.cid = cid; | |||
| this.itemNameResId = itemNameResId; | |||
| this.jumpActivityClass = jumpActivityClass; | |||
| this.targetActivityClass = targetActivityClass; | |||
| } | |||
| public int getItemType() { | |||
| return itemType; | |||
| } | |||
| public void setItemType(int itemType) { | |||
| this.itemType = itemType; | |||
| } | |||
| public int getItemNameResId() { | |||
| return itemNameResId; | |||
| } | |||
| public void setItemNameResId(int itemNameResId) { | |||
| this.itemNameResId = itemNameResId; | |||
| } | |||
| public Class<?> getJumpActivityClass() { | |||
| return jumpActivityClass; | |||
| } | |||
| public void setJumpActivityClass(Class<?> jumpActivityClass) { | |||
| this.jumpActivityClass = jumpActivityClass; | |||
| } | |||
| public Class<?> getTargetActivityClass() { | |||
| return targetActivityClass; | |||
| } | |||
| public void setTargetActivityClass(Class<?> targetActivityClass) { | |||
| this.targetActivityClass = targetActivityClass; | |||
| } | |||
| public int getCid() { | |||
| return cid; | |||
| } | |||
| public void setCid(int cid) { | |||
| this.cid = cid; | |||
| } | |||
| } | |||
| @@ -0,0 +1,296 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.home; | |||
| import android.Manifest; | |||
| import android.content.Context; | |||
| import android.content.Intent; | |||
| import android.content.pm.PackageManager; | |||
| import android.graphics.Canvas; | |||
| import android.graphics.Rect; | |||
| import android.os.Build; | |||
| import android.os.Bundle; | |||
| import android.view.Menu; | |||
| import android.view.MenuItem; | |||
| import android.view.View; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import androidx.appcompat.app.ActionBar; | |||
| import androidx.appcompat.app.AppCompatActivity; | |||
| import androidx.core.app.ActivityCompat; | |||
| import androidx.core.content.ContextCompat; | |||
| import androidx.recyclerview.widget.LinearLayoutManager; | |||
| import androidx.recyclerview.widget.RecyclerView; | |||
| import com.besthealth.bhBodyComposition120.BhBodyComposition; | |||
| import com.pingwang.bluetoothlib.AILinkBleManager; | |||
| import com.pingwang.bluetoothlib.AILinkSDK; | |||
| import com.pingwang.bluetoothlib.bean.AilinkLicenseBean; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.AboutActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.BuildConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| public class MainActivity extends AppCompatActivity { | |||
| private Context mContext; | |||
| private RecyclerView rvList; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_main); | |||
| mContext = this; | |||
| initView(); | |||
| initData(); | |||
| initListener(); | |||
| int bodyComposition = new BhBodyComposition().getBodyComposition(); | |||
| L.i("bodyComposition:" + bodyComposition); | |||
| } | |||
| protected void initListener() { | |||
| ActionBar supportActionBar = getSupportActionBar(); | |||
| if (supportActionBar != null) { | |||
| supportActionBar.setTitle(getString(R.string.app_name) + BuildConfig.VERSION_NAME); | |||
| } | |||
| } | |||
| protected void initData() { | |||
| initPermissions(); | |||
| List<AilinkLicenseBean> list = new ArrayList<>(); | |||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x09)); | |||
| list.add(new AilinkLicenseBean(0x2F, 0x03, 0x01)); | |||
| list.add(new AilinkLicenseBean(65544, 103, 0)); | |||
| AILinkSDK.getInstance().initLicense(list); | |||
| } | |||
| protected void initView() { | |||
| BleLog.init(true); | |||
| //connectDevice(BleValueBean bleValueBean);连接的时候需要传广播对象,否则返回的cid,vid,pid始终都是0 | |||
| //sdk | |||
| AILinkSDK.getInstance().init(mContext); | |||
| AILinkBleManager.getInstance().init(mContext, new AILinkBleManager.onInitListener() { | |||
| @Override | |||
| public void onInitSuccess() { | |||
| AILinkBleManager.getInstance().startScan(0); | |||
| } | |||
| @Override | |||
| public void onInitFailure() { | |||
| } | |||
| }); | |||
| SP.init(this); | |||
| rvList = findViewById(R.id.rv_list); | |||
| rvList.setLayoutManager(new LinearLayoutManager(this)); | |||
| HomeListAdapter adapter = new HomeListAdapter(this, HomeDataManager.getHomeDataList()); | |||
| rvList.setAdapter(adapter); | |||
| adapter.setItemClickListener(new HomeListAdapter.ItemClickListener() { | |||
| @Override | |||
| public void onItemClick(JumpBean bean) { | |||
| if (bean.getJumpActivityClass() != null) { | |||
| startActivity(bean.getJumpActivityClass()); | |||
| } else { | |||
| startActivity(bean.getItemType(),bean.getCid()); | |||
| } | |||
| } | |||
| }); | |||
| rvList.addItemDecoration(new RecyclerView.ItemDecoration() { | |||
| @Override | |||
| public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { | |||
| super.getItemOffsets(outRect, view, parent, state); | |||
| if (parent.getChildAdapterPosition(view) == 0) { | |||
| outRect.set(0, 30, 0, 0); | |||
| } | |||
| } | |||
| @Override | |||
| public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { | |||
| super.onDraw(c, parent, state); | |||
| } | |||
| }); | |||
| } | |||
| private void startActivity(int type,int cid) { | |||
| Intent intent = new Intent(this, ShowBleActivity.class); | |||
| intent.putExtra("type", type); | |||
| intent.putExtra("cid", cid); | |||
| startActivity(intent); | |||
| } | |||
| private void startActivity(Class<?> activityClass) { | |||
| Intent intent = new Intent(this, activityClass); | |||
| startActivity(intent); | |||
| } | |||
| @Override | |||
| protected void onResume() { | |||
| super.onResume(); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| BleLog.quit(); | |||
| } | |||
| @Override | |||
| public boolean onCreateOptionsMenu(Menu menu) { | |||
| getMenuInflater().inflate(R.menu.toolbar_menu, menu); | |||
| return super.onCreateOptionsMenu(menu); | |||
| } | |||
| @Override | |||
| public boolean onOptionsItemSelected(@NonNull MenuItem item) { | |||
| if (item.getItemId() == R.id.toolbar_right_menu) { | |||
| startActivity(new Intent(mContext, AboutActivity.class)); | |||
| return true; | |||
| } | |||
| return super.onOptionsItemSelected(item); | |||
| } | |||
| //-----------------------权限---------------------------------------- | |||
| /** | |||
| * 需要申请的权限 | |||
| */ | |||
| private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.WRITE_EXTERNAL_STORAGE}; | |||
| private final static String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT}; | |||
| /** | |||
| * 权限请求返回 | |||
| */ | |||
| private final int PERMISSION = 101; | |||
| /** | |||
| * 定位服务返回 | |||
| */ | |||
| protected final int LOCATION_SERVER = 102; | |||
| private HintDataDialogFragment mHintDataDialog = null; | |||
| protected void initPermissions() { | |||
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | |||
| onPermissionsOk(); | |||
| return; | |||
| } | |||
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | |||
| if (ContextCompat.checkSelfPermission(this, LOCATION_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) { | |||
| ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | |||
| } else { | |||
| boolean bleStatus = AppStart.isLocServiceEnable(mContext); | |||
| if (!bleStatus) { | |||
| //没有开启定位服务 | |||
| mHintDataDialog = HintDataDialogFragment.newInstance() | |||
| .setTitle("提示", 0) | |||
| .setCancel("取消", 0) | |||
| .setOk("确定", 0) | |||
| .setContent("请求开启定位服务", true) | |||
| .setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v) { | |||
| startLocationActivity(); | |||
| } | |||
| }); | |||
| mHintDataDialog.show(getSupportFragmentManager()); | |||
| } else { | |||
| onPermissionsOk(); | |||
| } | |||
| } | |||
| } else { | |||
| if (ContextCompat.checkSelfPermission(this, BLUETOOTH_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) { | |||
| ActivityCompat.requestPermissions(this, BLUETOOTH_PERMISSION, PERMISSION); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||
| super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||
| //请求权限被拒绝 | |||
| if (requestCode != PERMISSION) { | |||
| return; | |||
| } | |||
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { | |||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
| initPermissions(); | |||
| } else { | |||
| if (ActivityCompat.shouldShowRequestPermissionRationale(this, LOCATION_PERMISSION[0])) { | |||
| //权限请求失败,但未选中“不再提示”选项,再次请求 | |||
| ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | |||
| } else { | |||
| //权限请求失败,选中“不再提示”选项 | |||
| mHintDataDialog = HintDataDialogFragment.newInstance() | |||
| .setTitle("提示", 0) | |||
| .setCancel("取消", 0) | |||
| .setOk("确定", 0) | |||
| .setContent("请求开启定位权限", true) | |||
| .setOnDialogListener(new HintDataDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v) { | |||
| AppStart.startUseSetActivity(mContext); | |||
| } | |||
| }); | |||
| mHintDataDialog.show(getSupportFragmentManager()); | |||
| } | |||
| } | |||
| } else { | |||
| if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||
| initPermissions(); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * 启动去设置定位服务 | |||
| */ | |||
| protected void startLocationActivity() { | |||
| AppStart.startLocationActivity(this, LOCATION_SERVER); | |||
| } | |||
| /** | |||
| * 权限ok | |||
| */ | |||
| protected void onPermissionsOk() { | |||
| } | |||
| @Override | |||
| protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { | |||
| super.onActivityResult(requestCode, resultCode, data); | |||
| if (requestCode == LOCATION_SERVER) { | |||
| //定位服务页面返回 | |||
| initPermissions(); | |||
| } | |||
| } | |||
| } | |||
| @@ -19,7 +19,7 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| * | |||
| * @author xing | |||
| */ | |||
| public class BleDemoActivity extends BleBaseActivity { | |||
| public class BleDemoActivity extends BleBaseActivity { | |||
| private ListView list_view; | |||
| @@ -362,7 +362,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| if (type == CmdConfig.SET_WIFI_PAW) { | |||
| if (type == CmdConfig.SET_WIFI_PWD) { | |||
| mList.add("设置的密码状态 " + status); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| if (status == BodyFatDataUtil.STATUS_SUCCESS && issetMac) { | |||
| @@ -533,7 +533,7 @@ public class PublicBleNetworkCmdActivity extends BleBaseActivity implements OnCa | |||
| if (password != null) { | |||
| length = password.length + 1; | |||
| bytes1 = new byte[length + 1]; | |||
| bytes1[0] = (byte) CmdConfig.SET_WIFI_PAW; | |||
| bytes1[0] = (byte) CmdConfig.SET_WIFI_PWD; | |||
| bytes1[1] = (byte) subpackage; | |||
| System.arraycopy(password, 0, bytes1, 2, password.length); | |||
| @@ -0,0 +1,528 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules; | |||
| import android.content.Context; | |||
| import android.os.Bundle; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.os.Message; | |||
| import android.text.TextUtils; | |||
| import android.view.View; | |||
| import android.widget.ArrayAdapter; | |||
| import android.widget.Button; | |||
| import android.widget.ListView; | |||
| import android.widget.TextView; | |||
| import androidx.annotation.NonNull; | |||
| import androidx.annotation.Nullable; | |||
| import com.pingwang.bluetoothlib.device.BleDevice; | |||
| import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||
| import com.pingwang.bluetoothlib.device.SendBleBean; | |||
| import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||
| import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||
| import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||
| import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||
| import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||
| import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||
| import com.pingwang.bluetoothlib.utils.BleLog; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.MoveDataDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleDeviceData; | |||
| import cn.net.aicare.modulelibrary.module.wifibleDevice.WifiBleInfoBean; | |||
| /** | |||
| * wifi ble 血压计界面 | |||
| * | |||
| * @author xing | |||
| * @date 2023/10/07 | |||
| */ | |||
| public class PublicWifiBleOtaActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||
| private static String TAG = PublicWifiBleOtaActivity.class.getName(); | |||
| private final String WIFI_BLE_SSID = "WIFI_BLE_SSID_KEY"; | |||
| private final String WIFI_BLE_SSID_MAC = "WIFI_BLE_SSID_MAC"; | |||
| private final String WIFI_BLE_PWD = "WIFI_BLE_PWD"; | |||
| private final int REFRESH_DATA = 3; | |||
| private List<String> mList; | |||
| private ArrayAdapter listAdapter; | |||
| private TextView tv_wifi_ssid, tv_wifi_status, tv_wifi_info; | |||
| private Context mContext; | |||
| private WifiBleDeviceData mWifiBleDeviceData; | |||
| private List<DialogStringImageBean> mWifiList = new ArrayList<>(); | |||
| private String mAddress; | |||
| private int mType; | |||
| private int mCid; | |||
| private byte unit = 0; | |||
| private String mSsid = ""; | |||
| private String mMac = ""; | |||
| private String mPwd = ""; | |||
| private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||
| @Override | |||
| public void handleMessage(Message msg) { | |||
| if (msg.what == REFRESH_DATA) { | |||
| if (listAdapter != null) | |||
| listAdapter.notifyDataSetChanged(); | |||
| } | |||
| } | |||
| }; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| super.onCreate(savedInstanceState); | |||
| setContentView(R.layout.activity_wifi_ble_ota); | |||
| mContext = this; | |||
| mAddress = getIntent().getStringExtra("mac"); | |||
| mType = getIntent().getIntExtra("type", -1); | |||
| mCid = getIntent().getIntExtra("cid", -1); | |||
| mSsid = (String) SP.getInstance().get(WIFI_BLE_SSID, ""); | |||
| mMac = (String) SP.getInstance().get(WIFI_BLE_SSID_MAC, ""); | |||
| mPwd = (String) SP.getInstance().get(WIFI_BLE_PWD, ""); | |||
| init(); | |||
| } | |||
| private void init() { | |||
| mList = new ArrayList<>(); | |||
| ListView listView = findViewById(R.id.listview); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||
| listView.setAdapter(listAdapter); | |||
| Button clear = findViewById(R.id.clear); | |||
| clear.setOnClickListener(new View.OnClickListener() { | |||
| @Override | |||
| public void onClick(View v) { | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| }); | |||
| tv_wifi_ssid = findViewById(R.id.tv_wifi_ssid); | |||
| tv_wifi_info = findViewById(R.id.tv_wifi_info); | |||
| tv_wifi_status = findViewById(R.id.tv_wifi_status); | |||
| findViewById(R.id.clear).setOnClickListener(this); | |||
| findViewById(R.id.btn_wifi).setOnClickListener(this); | |||
| findViewById(R.id.btn_read_wifi_status).setOnClickListener(this); | |||
| findViewById(R.id.btn_start_ota).setOnClickListener(this); | |||
| if (tv_wifi_info != null) { | |||
| tv_wifi_info.setText(mSsid + "\n" + mPwd); | |||
| } | |||
| } | |||
| @Override | |||
| public void onClick(View v) { | |||
| switch (v.getId()) { | |||
| case R.id.clear: | |||
| if (mList != null) | |||
| mList.clear(); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| SP.getInstance().put(WIFI_BLE_SSID, ""); | |||
| SP.getInstance().put(WIFI_BLE_SSID_MAC, ""); | |||
| SP.getInstance().put(WIFI_BLE_PWD, ""); | |||
| mSsid = ""; | |||
| mMac = ""; | |||
| mPwd = ""; | |||
| if (tv_wifi_info != null) { | |||
| tv_wifi_info.setText(""); | |||
| } | |||
| break; | |||
| case R.id.btn_read_wifi_status: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| } | |||
| break; | |||
| case R.id.btn_start_ota: | |||
| if (mWifiBleDeviceData != null) { | |||
| setConnectWifi(mMac, mPwd); | |||
| } | |||
| break; | |||
| case R.id.btn_wifi: | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.getWifiList(); | |||
| mList.add(TimeUtils.getTime() + "正在扫描附近可用的wifi..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| showWifiList(); | |||
| break; | |||
| default: | |||
| break; | |||
| } | |||
| } | |||
| private ShowListDialogFragment mShowListDialogFragment; | |||
| private void showWifiList() { | |||
| if (mShowListDialogFragment == null) { | |||
| mShowListDialogFragment = ShowListDialogFragment.newInstance(); | |||
| mShowListDialogFragment.setList(mWifiList); | |||
| mShowListDialogFragment.setTitle("选择WIFI"); | |||
| mShowListDialogFragment.setCancel("取消", 0); | |||
| mShowListDialogFragment.setOnDialogListener(new ShowListDialogFragment.onDialogListener() { | |||
| @Override | |||
| public void onItemListener(int position) { | |||
| WifiBleInfoBean wifiBleInfoBean = mWifiBleInfoBeanList.get(position); | |||
| mSsid = wifiBleInfoBean.getSsid(); | |||
| MoveDataDialogFragment.newInstance() | |||
| .setTitle(mSsid, "") | |||
| .setContent("", "请输入密码", MoveDataDialogFragment.NAME) | |||
| .setOk("OK", 0) | |||
| .setCancel("取消", 0) | |||
| .setOnDialogListener(new MoveDataDialogFragment.OnDialogListener() { | |||
| @Override | |||
| public void onSucceedListener(View v, String data) { | |||
| mMac = wifiBleInfoBean.getMac(); | |||
| mPwd = data.trim(); | |||
| SP.getInstance().put(WIFI_BLE_SSID, mSsid); | |||
| SP.getInstance().put(WIFI_BLE_SSID_MAC, mMac); | |||
| SP.getInstance().put(WIFI_BLE_PWD, mPwd); | |||
| setConnectWifi(mMac, mPwd); | |||
| } | |||
| }) | |||
| .show(getSupportFragmentManager()); | |||
| } | |||
| @Override | |||
| public void onCancelListener(View v) { | |||
| } | |||
| }); | |||
| } | |||
| mShowListDialogFragment.show(getSupportFragmentManager()); | |||
| } | |||
| //-------------------BLE send--------------- | |||
| /** | |||
| * 设置连接wifi | |||
| * | |||
| * @param mac mac | |||
| * @param pwd 密码 | |||
| */ | |||
| private void setConnectWifi(String mac, String pwd) { | |||
| if (mWifiBleDeviceData != null) { | |||
| mWifiBleDeviceData.setConnectWifiMac(mac, pwd); | |||
| mList.add(TimeUtils.getTime() + "正在连接wifi..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| if (tv_wifi_info != null) { | |||
| tv_wifi_info.setText(mSsid + "\n" + mPwd); | |||
| } | |||
| } | |||
| //---------------------------------服务--------------------------------------------------- | |||
| @Override | |||
| public void onServiceSuccess() { | |||
| CallbackDisIm.getInstance().addListListener(this); | |||
| BleLog.i(TAG, "服务与界面建立连接成功"); | |||
| //与服务建立连接 | |||
| if (mAILinkBleManager != null) { | |||
| BleDevice bleDevice = mAILinkBleManager.getBleDevice(mAddress); | |||
| if (bleDevice != null) { | |||
| mWifiBleDeviceData = WifiBleDeviceData.getInstance(bleDevice); | |||
| mWifiBleDeviceData.setOnWiFiBleCallback(new WifiBleDeviceListener()); | |||
| bleDevice.setOnBleDeviceDataListener(new OnBleDeviceDataListener() { | |||
| @Override | |||
| public void onNotifyDataA6(String uuid, byte[] hex) { | |||
| int cmd = hex[0] & 0xff; | |||
| if (cmd == 0x91) { | |||
| int status = hex[1] & 0xff; | |||
| if (status == 0) { | |||
| mList.add(TimeUtils.getTime() + "WIFI OTA成功"); | |||
| } else if (status == 1) { | |||
| mList.add(TimeUtils.getTime() + "WIFI OTA失败"); | |||
| } else if (status == 2) { | |||
| mList.add(TimeUtils.getTime() + "不支持WIFI OTA"); | |||
| } else { | |||
| mList.add(TimeUtils.getTime() + "模块主动开始 WIFI OTA"); | |||
| } | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| }); | |||
| bleDevice.setOnBleVersionListener(this); | |||
| //获取版本号 | |||
| bleDevice.sendData(new SendBleBean(BleSendCmdUtil.getInstance().getBleVersion())); | |||
| mWifiBleDeviceData.getWifiCurrentState(); | |||
| mList.add(TimeUtils.getTime() + "获取版本号指令"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| } | |||
| @Override | |||
| public void onServiceErr() { | |||
| BleLog.i(TAG, "服务与界面连接断开"); | |||
| //与服务断开连接 | |||
| mAILinkBleManager = null; | |||
| } | |||
| @Override | |||
| public void unbindServices() { | |||
| CallbackDisIm.getInstance().removeListener(this); | |||
| mAILinkBleManager.disconnect(mAddress); | |||
| } | |||
| private void startOta() { | |||
| mList.add(TimeUtils.getTime() + "发送开始OTA指令"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| SendBleBean sendBleBean = new SendBleBean(); | |||
| sendBleBean.setHex(new byte[]{(byte) 0x91, 0x01}); | |||
| mWifiBleDeviceData.getBleDevice().sendData(sendBleBean); | |||
| } | |||
| //-----------------状态------------------- | |||
| @Override | |||
| public void onConnecting(@NonNull String mac) { | |||
| //TODO 连接中 | |||
| if (mAddress.equals(mac)) { | |||
| BleLog.i(TAG, "连接中"); | |||
| } | |||
| } | |||
| @Override | |||
| public void onDisConnected(@NonNull String mac, int code) { | |||
| //TODO 连接断开 | |||
| if (mAddress.equals(mac)) { | |||
| BleLog.i(TAG, "连接断开"); | |||
| finish(); | |||
| } | |||
| } | |||
| @Override | |||
| public void onServicesDiscovered(@NonNull String mac) { | |||
| //TODO 连接成功(获取服务成功) | |||
| if (mAddress.equals(mac)) | |||
| BleLog.i(TAG, "连接成功(获取服务成功)"); | |||
| } | |||
| @Override | |||
| public void bleOpen() { | |||
| } | |||
| @Override | |||
| public void bleClose() { | |||
| BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||
| finish(); | |||
| } | |||
| //-----------------通知------------------- | |||
| private List<WifiBleInfoBean> mWifiBleInfoBeanList; | |||
| private class WifiBleDeviceListener implements WifiBleDeviceData.OnWiFiBleCallback { | |||
| /** | |||
| * 在ble和wifi状态 | |||
| * | |||
| * @param bleStatus ble状态 | |||
| * @param wifiStatus wifi状态 | |||
| * @param workStatus 工作状态 | |||
| */ | |||
| @Override | |||
| public void onBleAndWifiStatus(int bleStatus, int wifiStatus, int workStatus) { | |||
| String wifiStatusStr = ""; | |||
| switch (wifiStatus) { | |||
| case 0: | |||
| wifiStatusStr = "未配置AP"; | |||
| break; | |||
| case 1: | |||
| wifiStatusStr = "连接AP失败"; | |||
| break; | |||
| case 2: | |||
| wifiStatusStr = "连接的AP信号不好"; | |||
| break; | |||
| case 3: | |||
| wifiStatusStr = "成功连接上AP"; | |||
| break; | |||
| case 4: | |||
| wifiStatusStr = "正在连接AP"; | |||
| break; | |||
| } | |||
| mList.add(TimeUtils.getTime() + "蓝牙状态:" + bleStatus + "\nwifi状态:" + wifiStatusStr + "\n工作状态:" + workStatus); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| if (tv_wifi_status != null) { | |||
| tv_wifi_status.setText(wifiStatusStr); | |||
| } | |||
| if (wifiStatus == 3) { | |||
| startOta(); | |||
| } | |||
| } | |||
| @Override | |||
| public void onWifiScanStatus(int status) { | |||
| } | |||
| @Override | |||
| public void onConnectWifiName(String name) { | |||
| if (tv_wifi_ssid != null) { | |||
| tv_wifi_ssid.setText(name); | |||
| } | |||
| } | |||
| @Override | |||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||
| L.i("扫描到的wifi信息:" + wifiBleInfoBean.toString()); | |||
| } | |||
| @Override | |||
| public void onWifiScanFinish(List<WifiBleInfoBean> list) { | |||
| if (mWifiBleInfoBeanList == null) { | |||
| mWifiBleInfoBeanList = new ArrayList<>(); | |||
| } | |||
| mWifiBleInfoBeanList.clear(); | |||
| mWifiList.clear(); | |||
| for (WifiBleInfoBean wifiBleInfoBean : list) { | |||
| String ssid = wifiBleInfoBean.getSsid(); | |||
| if (TextUtils.isEmpty(ssid)) { | |||
| continue; | |||
| } | |||
| mWifiList.add(new DialogStringImageBean(ssid, wifiBleInfoBean.getType())); | |||
| mWifiBleInfoBeanList.add(wifiBleInfoBean); | |||
| } | |||
| if (mShowListDialogFragment != null) { | |||
| mShowListDialogFragment.setList(mWifiList); | |||
| } | |||
| } | |||
| /** | |||
| * 设置wifi名字或密码的状态回调 | |||
| * | |||
| * @param type 类型 | |||
| * @param status 状态 | |||
| */ | |||
| @Override | |||
| public void onSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||
| } | |||
| @Override | |||
| public void onWifiConnecting(int status) { | |||
| L.i("wifi正在连接中:" + status); | |||
| mList.add(TimeUtils.getTime() + "wifi正在连接中..."); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| /** | |||
| * 当前连接的wifi mac地址 | |||
| * | |||
| * @param mac mac | |||
| */ | |||
| @Override | |||
| public void onConnectWifiMac(String mac) { | |||
| } | |||
| @Override | |||
| public void onConnectWifiPwd(String pwd) { | |||
| } | |||
| @Override | |||
| public void onDeviceSn(long sn) { | |||
| //主要用于查询设备是否在服务器注册成功 | |||
| mList.add(TimeUtils.getTime() + "设备SN号:" + sn); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onServerIp(String ip) { | |||
| mList.add(TimeUtils.getTime() + "设备ip地址:" + ip); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onServerPort(int port) { | |||
| mList.add(TimeUtils.getTime() + "设备端口:" + port); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onServerPath(String path) { | |||
| mList.add(TimeUtils.getTime() + "设备路径地址:" + path); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onServerSettingInfo(boolean status) { | |||
| mList.add(TimeUtils.getTime() + "服务器配置:" + (status ? "成功" : "失败")); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| } | |||
| @Override | |||
| public void onBmVersion(String version) { | |||
| mList.add(TimeUtils.getTime() + "版本号:" + version); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void OnDID(int cid, int vid, int pid) { | |||
| String didStr = "cid:" + cid + "||vid:" + vid + "||pid:" + pid; | |||
| mList.add(TimeUtils.getTime() + "ID:" + didStr); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onMcuBatteryStatus(int status, int battery) { | |||
| mList.add(TimeUtils.getTime() + "电量:" + battery + "%"); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| public void onSysTime(int status, int[] times) { | |||
| String time = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5]; | |||
| mList.add(TimeUtils.getTime() + "系统时间:" + time); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @Override | |||
| protected void onDestroy() { | |||
| super.onDestroy(); | |||
| BleLog.i(TAG, "onDestroy"); | |||
| } | |||
| } | |||
| @@ -20,7 +20,6 @@ import androidx.fragment.app.FragmentManager; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| public class EditParamsDialog extends DialogFragment implements View.OnClickListener { | |||
| /** | |||
| @@ -52,7 +52,7 @@ public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackB | |||
| log_list = findViewById(R.id.log_list); | |||
| mLogList = new ArrayList<>(); | |||
| listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mLogList); | |||
| log_list.setAdapter(listAdapter); | |||
| log_list.setAdapter(listAdapter); | |||
| mmol.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||
| @Override | |||
| public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||
| @@ -283,7 +283,7 @@ public class MeatProbeChargerActivity extends BleBaseActivity implements View.On | |||
| btn_probe_version.postDelayed(new Runnable() { | |||
| @Override | |||
| public void run() { | |||
| mBleDevice.setMtu(247); | |||
| mBleDevice.setMtu(517); | |||
| } | |||
| }, 200); | |||
| } | |||
| @@ -236,7 +236,7 @@ public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.O | |||
| mMHandler.sendEmptyMessage(ConnectWifi); | |||
| } | |||
| } | |||
| if (type == CmdConfig.DISCONNECT_WIFI) { | |||
| if (type == CmdConfig.DIS_OR_CON_WIFI) { | |||
| mList.add(0, "发起连接 " + status); | |||
| mMHandler.sendEmptyMessage(ToRefreUi); | |||
| } | |||
| @@ -290,11 +290,11 @@ public class WeightScaleActivity extends BleBaseActivity implements WeightScaleD | |||
| addText("版本号:" + version); | |||
| } | |||
| /** | |||
| * 请求同步时间 | |||
| * | |||
| * @param quest 1-请求同步时间 | |||
| */ | |||
| // /** | |||
| // * 请求同步时间 | |||
| // * | |||
| // * @param quest 1-请求同步时间 | |||
| // */ | |||
| // @Override | |||
| // public void onSyncTime(int quest) { | |||
| // if (quest == 1) { | |||
| @@ -1,4 +1,4 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.modules.wifi_ble_scale; | |||
| import android.content.Intent; | |||
| @@ -33,6 +33,7 @@ import java.util.ArrayList; | |||
| import java.util.Arrays; | |||
| import java.util.List; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleBaseActivity; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||
| import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageBean; | |||
| @@ -69,16 +70,11 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| private EditText et_ip, et_path, et_port; | |||
| private TextView tv_path; | |||
| private byte[] testIp = new byte[]{0x74, 0x65, 0x73, 0x74, 0x2e, 0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x72, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e}; | |||
| private byte[] productIp = new byte[]{0x61, 0x69, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x69, 0x6f, 0x74, 0x2e, 0x61, 0x69, 0x63, 0x61, 0x72, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2e, 0x63, 0x6e}; | |||
| private byte[] IpUrl = new byte[]{0x2f, 0x64, 0x65, 0x76, 0x69, 0x76, 0x63, 0x64, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x64, 0x72, 0x52, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2f}; | |||
| private boolean isTest = false; | |||
| private ArrayList<DialogStringImageBean> mDialogList; | |||
| private ActivityResultLauncher<Boolean> launcher; | |||
| private WifiBleDeviceData mWifiBleDeviceData; | |||
| private User selectUser; | |||
| @Override | |||
| protected void onCreate(@Nullable Bundle savedInstanceState) { | |||
| @@ -161,6 +157,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| FileUtils.init(); | |||
| mDialogList = new ArrayList<>(); | |||
| initLauncher(); | |||
| selectUser = getDefault(); | |||
| } | |||
| @@ -454,6 +451,9 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| break; | |||
| case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||
| mList.add(0, getString(R.string.measurement_status) + status + "\n" + getString(R.string.request_user_information)); | |||
| if (bodyFatBleUtilsData != null) { | |||
| bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||
| } | |||
| break; | |||
| default: | |||
| mList.add(0, getString(R.string.measurement_status) + status); | |||
| @@ -756,7 +756,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| if (type == CmdConfig.SET_WIFI_PAW) { | |||
| if (type == CmdConfig.SET_WIFI_PWD) { | |||
| mList.add(0, getString(R.string.get_set_password_status) + status); | |||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||
| } | |||
| @@ -787,7 +787,7 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View. | |||
| } | |||
| @Override | |||
| public void onDeviceSn(String sn) { | |||
| public void onDeviceSn(long sn) { | |||
| L.i(TAG, "设备sn: " + sn); | |||
| mList.add(0, "sn: " + sn); | |||
| mMHandler.sendEmptyMessage(REFRESH_DATA); | |||
| @@ -576,11 +576,6 @@ public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDi | |||
| } | |||
| } | |||
| @Override | |||
| public void onConnectWifiPwd(String pwd) { | |||
| } | |||
| @Override | |||
| public void onWifiScanBean(WifiBleInfoBean wifiBleInfoBean) { | |||
| L.i("扫描到的wifi信息:" + wifiBleInfoBean.toString()); | |||
| @@ -635,7 +630,12 @@ public class WifiBleSphyActivity extends BleBaseActivity implements OnCallbackDi | |||
| } | |||
| @Override | |||
| public void onDeviceSn(String sn) { | |||
| public void onConnectWifiPwd(String pwd) { | |||
| } | |||
| @Override | |||
| public void onDeviceSn(long sn) { | |||
| //主要用于查询设备是否在服务器注册成功 | |||
| mList.add("设备SN号:" + sn); | |||
| mHandler.sendEmptyMessage(REFRESH_DATA); | |||
| @@ -0,0 +1,343 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
| import android.annotation.SuppressLint; | |||
| import android.app.ActivityManager; | |||
| import android.content.Context; | |||
| import android.content.Intent; | |||
| import android.content.IntentFilter; | |||
| import android.content.pm.PackageInfo; | |||
| import android.content.pm.PackageManager; | |||
| import android.net.Uri; | |||
| import android.os.Build; | |||
| import android.telephony.TelephonyManager; | |||
| import java.io.BufferedReader; | |||
| import java.io.IOException; | |||
| import java.io.InputStreamReader; | |||
| import java.util.List; | |||
| /** | |||
| * APP和手机信息获取工具类 | |||
| */ | |||
| public class AppPhoneInfoUtils { | |||
| private AppPhoneInfoUtils() { | |||
| /* cannot be instantiated */ | |||
| throw new UnsupportedOperationException("cannot be instantiated"); | |||
| } | |||
| /** | |||
| * 版本名--给用户看 | |||
| */ | |||
| public static String getVersionName(Context context) { | |||
| PackageInfo mPackageInfo = getPackageInfo(context.getApplicationContext()); | |||
| if (mPackageInfo != null) { | |||
| return mPackageInfo.versionName; | |||
| } | |||
| return "1.0.0"; | |||
| } | |||
| /** | |||
| * 版本号---主要用于程序升级检测 | |||
| */ | |||
| public static int getVersionCode(Context context) { | |||
| PackageInfo mPackageInfo = getPackageInfo(context.getApplicationContext()); | |||
| if (mPackageInfo != null) { | |||
| return mPackageInfo.versionCode; | |||
| } | |||
| return 1; | |||
| } | |||
| private static PackageInfo getPackageInfo(Context context) { | |||
| PackageInfo pi = null; | |||
| try { | |||
| PackageManager pm = context.getPackageManager(); | |||
| pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_CONFIGURATIONS); | |||
| return pi; | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return pi; | |||
| } | |||
| public static String getSystemVersion() { | |||
| try { | |||
| if (getPhoneBrand().toLowerCase().equalsIgnoreCase("xiaomi")) { | |||
| return getMIUI(); | |||
| } else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("huawei") || getPhoneBrand().toLowerCase().equals("honor")) { | |||
| return getEMUI(); | |||
| } else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("vivo")) { | |||
| String[] vivo = getVivo(); | |||
| if (vivo != null && vivo.length > 1) { | |||
| return vivo[0] + "_" + vivo[1]; | |||
| } | |||
| return ""; | |||
| } else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("oppo")) { | |||
| return getOppo(); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| return "解析错误"; | |||
| } | |||
| return "不是HMOV,没有做解析"; | |||
| } | |||
| public static String getSystemVersionString() { | |||
| try { | |||
| if (getPhoneBrand().toLowerCase().equalsIgnoreCase("xiaomi")) { | |||
| return getSystemProperty("ro.miui.ui.version.name"); | |||
| } else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("huawei") || getPhoneBrand().toLowerCase().equals("honor")) { | |||
| return getSystemProperty("ro.build.version.emui"); | |||
| } else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("vivo")) { | |||
| return getSystemProperty("ro.vivo.os.build.display.id"); | |||
| } else if (getPhoneBrand().toLowerCase().equalsIgnoreCase("oppo") || getPhoneBrand().toLowerCase().equals("realme")) { | |||
| return getSystemProperty("ro.build.version.opporom"); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| return "解析错误"; | |||
| } | |||
| return "不是HMOV,没有做解析"; | |||
| } | |||
| /** | |||
| * 获取华为手机emui版本 | |||
| * | |||
| * @return String | |||
| */ | |||
| public static String getEMUI() { | |||
| String systemProperty = ""; | |||
| try { | |||
| systemProperty = getSystemProperty("ro.build.version.emui"); | |||
| //EmotionUI_11.1.0=harmonyOS2.0 | |||
| return systemProperty != null ? systemProperty.substring(systemProperty.indexOf("_") + 1).trim() : ""; | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return systemProperty; | |||
| } | |||
| /** | |||
| * 获取小米手机版本 | |||
| * | |||
| * @return String | |||
| */ | |||
| public static String getMIUI() { | |||
| String systemProperty = ""; | |||
| try { | |||
| systemProperty = getSystemProperty("ro.miui.ui.version.name"); | |||
| return systemProperty != null ? systemProperty.substring(systemProperty.indexOf("V") + 1).trim() : ""; | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return systemProperty; | |||
| } | |||
| /** | |||
| * 获取vivo手机版本 | |||
| * | |||
| * @return String | |||
| */ | |||
| public static String[] getVivo() { | |||
| try { | |||
| String systemProperty = getSystemProperty("ro.vivo.os.build.display.id"); | |||
| if (systemProperty != null) { | |||
| if (!systemProperty.contains("_")) { | |||
| systemProperty = systemProperty.replace(" ", "_"); | |||
| } | |||
| return systemProperty.split("_"); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| //OriginOS 1.0 | |||
| //Funtouch OS | |||
| return null; | |||
| } | |||
| public static String getOppo() { | |||
| //ro.build.version.opporom | |||
| String systemProperty = ""; | |||
| try { | |||
| systemProperty = getSystemProperty("ro.build.version.opporom"); | |||
| return systemProperty != null ? systemProperty.substring(systemProperty.indexOf("V") + 1).trim() : ""; | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return systemProperty; | |||
| } | |||
| public static String getSystemProperty(String propName) { | |||
| String line; | |||
| BufferedReader input = null; | |||
| try { | |||
| Process p = Runtime.getRuntime().exec("getprop " + propName); | |||
| input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024); | |||
| line = input.readLine(); | |||
| input.close(); | |||
| } catch (IOException ex) { | |||
| return null; | |||
| } finally { | |||
| if (input != null) { | |||
| try { | |||
| input.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| return line; | |||
| } | |||
| public static String getPhoneInfo() { | |||
| return Build.MANUFACTURER +//手机厂商 | |||
| " " + Build.MODEL; //手机型号 | |||
| } | |||
| public static String getBrand() { | |||
| return Build.BRAND; | |||
| } | |||
| public static String getPhoneBrand() { | |||
| return Build.MANUFACTURER;//手机厂商 | |||
| } | |||
| /** | |||
| * 返回手机型号 | |||
| */ | |||
| public static String getPhoneModel() { | |||
| return Build.MODEL; | |||
| } | |||
| /** | |||
| * 返回手机系统版本 | |||
| */ | |||
| public static String getPhoneVersion() { | |||
| return "android " + Build.VERSION.RELEASE;//系统版本; | |||
| } | |||
| /** | |||
| * 读取手机电话号码 | |||
| * | |||
| * @param context context | |||
| * @return 手机号, 空代表读取失败 | |||
| */ | |||
| @SuppressLint({"MissingPermission", "HardwareIds"}) | |||
| public static String getPhoneNumber(Context context) { | |||
| String phoneNumber = ""; | |||
| try { | |||
| TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); | |||
| phoneNumber = telephonyManager.getLine1Number(); | |||
| if (phoneNumber.startsWith("+86")) { | |||
| phoneNumber = phoneNumber.substring(3); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| return phoneNumber; | |||
| } | |||
| return phoneNumber; | |||
| } | |||
| /** | |||
| * 检测应用是否安装 | |||
| * | |||
| * @param context Context | |||
| * @param packagename 包名 | |||
| * @return boolean | |||
| */ | |||
| public static boolean checkMapAppsIsExist(Context context, String packagename) { | |||
| PackageInfo packageInfo; | |||
| try { | |||
| packageInfo = context.getPackageManager().getPackageInfo(packagename, 0); | |||
| } catch (Exception e) { | |||
| packageInfo = null; | |||
| e.printStackTrace(); | |||
| } | |||
| return packageInfo != null; | |||
| } | |||
| /** | |||
| * 安装apk | |||
| */ | |||
| public static void install(Context mContext, Uri uri) { | |||
| Intent install = new Intent(Intent.ACTION_VIEW); | |||
| install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||
| if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | |||
| install.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | |||
| } | |||
| install.setDataAndType(uri, "application/vnd.android.package-archive"); | |||
| mContext.startActivity(install); | |||
| } | |||
| /** | |||
| * 获取进程名 | |||
| * | |||
| * @param context 上下文 | |||
| * @return 进程名 | |||
| */ | |||
| public static String getProcessName(Context context) { | |||
| ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); | |||
| List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); | |||
| if (runningApps == null) { | |||
| return null; | |||
| } | |||
| for (ActivityManager.RunningAppProcessInfo proInfo : runningApps) { | |||
| if (proInfo.pid == android.os.Process.myPid()) { | |||
| if (proInfo.processName != null) { | |||
| return proInfo.processName; | |||
| } | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * 用来判断服务是否运行. | |||
| * | |||
| * @param className 判断的服务名字 | |||
| * @return true 在运行 false 不在运行 | |||
| */ | |||
| public static boolean isServiceRunning(Context context, String className) { | |||
| boolean isRunning = false; | |||
| try { | |||
| ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); | |||
| List<ActivityManager.RunningServiceInfo> serviceList = activityManager.getRunningServices(2000); | |||
| if (!(serviceList.size() > 0)) { | |||
| return false; | |||
| } | |||
| for (int i = 0; i < serviceList.size(); i++) { | |||
| if (serviceList.get(i).service.getClassName().equals(className)) { | |||
| isRunning = true; | |||
| break; | |||
| } | |||
| } | |||
| } catch (SecurityException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| return isRunning; | |||
| } | |||
| public static int getSystemBattery(Context context) { | |||
| int level = 0; | |||
| Intent batteryInfoIntent = context.getApplicationContext().registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); | |||
| level = batteryInfoIntent.getIntExtra("level", 0); | |||
| int batterySum = batteryInfoIntent.getIntExtra("scale", 100); | |||
| int percentBattery = 100 * level / batterySum; | |||
| return percentBattery; | |||
| } | |||
| } | |||
| @@ -1,9 +1,16 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
| import android.content.Context; | |||
| import android.os.Handler; | |||
| import android.os.HandlerThread; | |||
| import android.text.TextUtils; | |||
| import android.util.Log; | |||
| import androidx.annotation.NonNull; | |||
| import com.google.gson.Gson; | |||
| import java.io.File; | |||
| import java.text.SimpleDateFormat; | |||
| import java.util.Date; | |||
| import java.util.Locale; | |||
| @@ -15,16 +22,51 @@ public class L { | |||
| /** | |||
| * 是否开启log日志 | |||
| */ | |||
| private static boolean isLog = true; | |||
| private static boolean isLog = false; | |||
| private static String TAG = "TagOther"; | |||
| private static MyDiskLogStrategy myDiskLogStrategy; | |||
| private static int MAX_BYTES = 2048 * 1024;//2M | |||
| /** | |||
| * 缓存行数量 | |||
| */ | |||
| private static int CACHE_NUMBER_LINES = 100;//list大小 | |||
| private static HandlerThread mHandlerThread; | |||
| private static Gson mGson; | |||
| private static long mId = 0; | |||
| /** | |||
| * 获取默认日志路径,不是以/ 结尾 | |||
| * | |||
| * @param context 上下文 | |||
| * @return {@link String} | |||
| */ | |||
| public static String getDefaultLogPath(Context context) { | |||
| if (myDiskLogStrategy!=null) { | |||
| myDiskLogStrategy.saveCache(); | |||
| } | |||
| return context.getFilesDir().getPath() + File.separatorChar + "logger"; | |||
| } | |||
| public static String getDefaultLogName() { | |||
| return "logs.txt"; | |||
| } | |||
| /** | |||
| * 日志初始化 | |||
| * 注意:路径只能是内置缓存路径,否则可能会导致写入失败 | |||
| * | |||
| * @param isShowLog 是否打印日志 | |||
| * @param diskPath 磁盘路径 | |||
| * @param fileName 文件名称 | |||
| */ | |||
| public static void init(boolean isShowLog) { | |||
| public static void init(String diskPath, String fileName, boolean isShowLog) { | |||
| isLog = isShowLog; | |||
| mGson = new Gson(); | |||
| mHandlerThread = new HandlerThread(TAG); | |||
| mHandlerThread.start(); | |||
| Handler mHandler = new MyDiskLogStrategy.WriteHandler(mHandlerThread.getLooper(), diskPath, fileName, MAX_BYTES,CACHE_NUMBER_LINES); | |||
| myDiskLogStrategy = new MyDiskLogStrategy(mHandler); | |||
| } | |||
| /** | |||
| @@ -37,7 +79,7 @@ public class L { | |||
| } | |||
| public static void v(String msg) { | |||
| v(TAG, msg); | |||
| v("", msg); | |||
| } | |||
| /** | |||
| @@ -47,11 +89,19 @@ public class L { | |||
| if (isLog) { | |||
| logContent(tag, msg, 1); | |||
| } | |||
| L.write(msg); | |||
| } | |||
| /** | |||
| * 错误日志 | |||
| */ | |||
| public static void eJson(String tag, String msg, Class c) { | |||
| e(tag, mGson.toJson(msg, c)); | |||
| } | |||
| public static void e(String msg) { | |||
| e(TAG, msg); | |||
| e("", msg); | |||
| } | |||
| /** | |||
| @@ -64,9 +114,12 @@ public class L { | |||
| } | |||
| public static void w(String msg) { | |||
| w(TAG, msg); | |||
| w("", msg); | |||
| } | |||
| public static void iJson(String msg, Class c) { | |||
| i("", mGson.toJson(msg, c)); | |||
| } | |||
| /** | |||
| * 信息日志 | |||
| @@ -77,9 +130,48 @@ public class L { | |||
| } | |||
| } | |||
| /** | |||
| * 信息日志 | |||
| */ | |||
| public static void iw(String msg) { | |||
| iw("", msg); | |||
| } | |||
| /** | |||
| * 信息日志 | |||
| */ | |||
| public static void iw(String tag, String msg) { | |||
| if (isLog) { | |||
| logContent(tag, msg, 0); | |||
| } | |||
| L.write(msg); | |||
| } | |||
| /** | |||
| * 信息日志 | |||
| */ | |||
| public static void iwJson(String tag, Object msg, Class c) { | |||
| if (isLog) { | |||
| logContent(tag, mGson.toJson(msg, c), 0); | |||
| } | |||
| L.writeJson(msg, c); | |||
| } | |||
| public static void write(String msg) { | |||
| logContent(msg); | |||
| } | |||
| public static void writeJson(Object msg, Class c) { | |||
| write(mGson.toJson(msg, c)); | |||
| } | |||
| public static void iNoCode(Object msg) { | |||
| String newMsg = "未识别的指令:" + msg; | |||
| i("", newMsg); | |||
| } | |||
| public static void i(String msg) { | |||
| i(TAG, msg); | |||
| i("", msg); | |||
| } | |||
| /** | |||
| @@ -92,12 +184,29 @@ public class L { | |||
| } | |||
| public static void d(String msg) { | |||
| d(TAG, msg); | |||
| d("", msg); | |||
| } | |||
| /** | |||
| * 退出写文件线程 | |||
| */ | |||
| public static void quit() { | |||
| if (mHandlerThread != null) | |||
| mHandlerThread.quit(); | |||
| } | |||
| private static void logContent(String msg) { | |||
| logContent("", msg, 0); | |||
| logContent("", msg, 0, true); | |||
| } | |||
| /** | |||
| * @param msg 内容 | |||
| * @param level 0=i;1=e;2=d;3=w; | |||
| */ | |||
| private static void logContent(String tag, String msg, int level) { | |||
| logContent(tag, msg, level, false); | |||
| } | |||
| @@ -105,65 +214,73 @@ public class L { | |||
| * @param tag tag | |||
| * @param msg 内容 | |||
| * @param level 0=i;1=e;2=d;3=w;其他=v; | |||
| * @param isW 是否写入文件 | |||
| */ | |||
| private static void logContent(String tag, String msg, int level) { | |||
| StackTraceElement[] trace = Thread.currentThread().getStackTrace(); | |||
| int methodCount = 1; | |||
| int stackOffset = getStackOffset(trace); | |||
| if (methodCount + stackOffset > trace.length) { | |||
| methodCount = trace.length - stackOffset - 1; | |||
| } | |||
| for (int i = methodCount; i > 0; i--) { | |||
| int stackIndex = i + stackOffset; | |||
| if (stackIndex >= trace.length) { | |||
| continue; | |||
| } | |||
| StackTraceElement element = trace[stackIndex]; | |||
| switch (level) { | |||
| case 0: | |||
| Log.i(tag, getLogContent(msg, element)); | |||
| break; | |||
| case 1: | |||
| Log.e(tag, getLogContent(msg, element)); | |||
| break; | |||
| case 2: | |||
| Log.d(tag, getLogContent(msg, element)); | |||
| break; | |||
| case 3: | |||
| Log.w(tag, getLogContent(msg, element)); | |||
| break; | |||
| default: | |||
| Log.v(tag, msg); | |||
| break; | |||
| private static void logContent(String tag, String msg, int level, boolean isW) { | |||
| try { | |||
| StackTraceElement[] trace = Thread.currentThread().getStackTrace(); | |||
| int methodCount = 1; | |||
| int stackOffset = getStackOffset(trace); | |||
| if (methodCount + stackOffset > trace.length) { | |||
| methodCount = trace.length - stackOffset - 1; | |||
| } | |||
| for (int i = methodCount; i > 0; i--) { | |||
| int stackIndex = i + stackOffset; | |||
| if (stackIndex >= trace.length) { | |||
| continue; | |||
| } | |||
| StackTraceElement element = trace[stackIndex]; | |||
| if (isW) { | |||
| if (myDiskLogStrategy != null) { | |||
| myDiskLogStrategy.log(getLogContent(msg, element)); | |||
| } | |||
| return; | |||
| } | |||
| if (TextUtils.isEmpty(tag)) { | |||
| tag = getTag(element); | |||
| } | |||
| switch (level) { | |||
| case 0: | |||
| Log.i(tag, getLogContent(msg, element)); | |||
| break; | |||
| case 1: | |||
| Log.e(tag, getLogContent(msg, element)); | |||
| break; | |||
| case 2: | |||
| Log.d(tag, getLogContent(msg, element)); | |||
| break; | |||
| case 3: | |||
| Log.w(tag, getLogContent(msg, element)); | |||
| break; | |||
| default: | |||
| Log.v(tag, msg); | |||
| break; | |||
| } | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| private static String getTag(StackTraceElement element) { | |||
| String tag = "Tag_" + getModuleName(element.getClassName()) + "_" + getSimpleClassName(element.getClassName()); | |||
| return tag; | |||
| } | |||
| private static String getLogContent(String msg, StackTraceElement element) { | |||
| StringBuilder builder = new StringBuilder(); | |||
| SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); | |||
| String time = sdf.format(new Date()); | |||
| builder.append("\n") | |||
| .append("-------------------------------------------------------\n") | |||
| .append("|") | |||
| .append(time) | |||
| .append("\n") | |||
| .append("|") | |||
| .append(getSimpleClassName(element.getClassName())) | |||
| .append(".") | |||
| .append(element.getMethodName()) | |||
| .append(" ") | |||
| .append(" (") | |||
| .append(element.getFileName()) | |||
| .append(":") | |||
| .append(element.getLineNumber()) | |||
| .append(")") | |||
| .append("\n") | |||
| .append("||==>") | |||
| .append(msg) | |||
| .append("\n") | |||
| builder.append("-------------------------------------------------------\n") | |||
| .append("|").append(" ID:").append(mId++).append("\n") | |||
| .append("|").append(time).append("\n") | |||
| .append("|").append(getSimpleClassName(element.getClassName())).append(".").append(element.getMethodName()).append(" ").append(" (").append(element.getFileName()).append(":") | |||
| .append(element.getLineNumber()).append(")").append("\n") | |||
| .append("||==>").append(msg).append("\n") | |||
| .append("-------------------------------------------------------\n"); | |||
| return builder.toString(); | |||
| } | |||
| @@ -186,4 +303,13 @@ public class L { | |||
| return name.substring(lastIndex + 1); | |||
| } | |||
| private static String getModuleName(@NonNull String name) { | |||
| String[] split = name.split("\\."); | |||
| String moduleName = ""; | |||
| if (split.length > 2) { | |||
| moduleName = split[2]; | |||
| } | |||
| return moduleName; | |||
| } | |||
| } | |||
| @@ -0,0 +1,171 @@ | |||
| package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||
| import android.os.Handler; | |||
| import android.os.Looper; | |||
| import android.os.Message; | |||
| import androidx.annotation.NonNull; | |||
| import java.io.File; | |||
| import java.io.FileOutputStream; | |||
| import java.io.FileWriter; | |||
| import java.io.IOException; | |||
| import java.io.OutputStreamWriter; | |||
| import java.io.RandomAccessFile; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| /** | |||
| * Abstract class that takes care of background threading the file log operation on Android. | |||
| * implementing classes are free to directly perform I/O operations there. | |||
| * <p> | |||
| * Writes all logs to the disk with CSV format. | |||
| */ | |||
| public class MyDiskLogStrategy { | |||
| @NonNull | |||
| private final Handler handler; | |||
| public MyDiskLogStrategy(@NonNull Handler handler) { | |||
| this.handler = checkNotNull(handler); | |||
| } | |||
| public void log(@NonNull String message) { | |||
| checkNotNull(message); | |||
| handler.sendMessage(handler.obtainMessage(1, message)); | |||
| } | |||
| /** | |||
| * 保存缓存 | |||
| */ | |||
| public void saveCache() { | |||
| //通知直接将缓存数据写入保存 | |||
| handler.sendMessage(handler.obtainMessage(2, "saveCache")); | |||
| } | |||
| static class WriteHandler extends Handler { | |||
| @NonNull | |||
| private final String folder; | |||
| private final int maxFileSize; | |||
| private final String fileName; | |||
| private volatile List<String> mList; | |||
| private final int mListMax; | |||
| WriteHandler(@NonNull Looper looper, @NonNull String folder, String fileName, int maxFileSize,int listMax) { | |||
| super(checkNotNull(looper)); | |||
| this.folder = checkNotNull(folder); | |||
| this.maxFileSize = maxFileSize; | |||
| this.fileName = fileName; | |||
| mList=new ArrayList<>(); | |||
| mListMax=listMax; | |||
| } | |||
| @SuppressWarnings("checkstyle:emptyblock") | |||
| @Override | |||
| public void handleMessage(@NonNull Message msg) { | |||
| if (msg.what==1) { | |||
| //普通的保存数据,先判断缓存 | |||
| String content = (String) msg.obj; | |||
| mList.add(content); | |||
| if (mList.size()<mListMax){ | |||
| return; | |||
| } | |||
| } | |||
| FileWriter fileWriter = null; | |||
| File logFile = getLogFile(folder, fileName); | |||
| try { | |||
| fileWriter = new FileWriter(logFile, true); | |||
| // fileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logFile, true), StandardCharsets.UTF_8)); | |||
| writeLog(fileWriter, mList); | |||
| // writeLog(fileWriter, content); | |||
| fileWriter.flush(); | |||
| fileWriter.close(); | |||
| } catch (IOException e) { | |||
| if (fileWriter != null) { | |||
| try { | |||
| fileWriter.flush(); | |||
| fileWriter.close(); | |||
| } catch (IOException e1) { /* fail silently */ } | |||
| } | |||
| } | |||
| } | |||
| private void writeLog(@NonNull OutputStreamWriter fileWriter, List<String> list) throws IOException { | |||
| if (list!=null) { | |||
| StringBuilder newStr= new StringBuilder(); | |||
| for (String s : list) { | |||
| newStr.append(s); | |||
| } | |||
| writeLog(fileWriter,newStr.toString()); | |||
| list.clear(); | |||
| } | |||
| } | |||
| /** | |||
| * This is always called on a single background thread. | |||
| * Implementing classes must ONLY write to the fileWriter and nothing more. | |||
| * The abstract class takes care of everything else including close the stream and catching IOException | |||
| * | |||
| * @param fileWriter an instance of FileWriter already initialised to the correct file | |||
| */ | |||
| private void writeLog(@NonNull OutputStreamWriter fileWriter, @NonNull String content) throws IOException { | |||
| checkNotNull(fileWriter); | |||
| checkNotNull(content); | |||
| fileWriter.append(content); | |||
| } | |||
| private File getLogFile(@NonNull String folderName, @NonNull String fileName) { | |||
| checkNotNull(folderName); | |||
| checkNotNull(fileName); | |||
| File folder = new File(folderName); | |||
| if (!folder.exists()) { | |||
| //TODO: What if folder is not created, what happens then? | |||
| folder.mkdirs(); | |||
| } | |||
| File newFile; | |||
| newFile = new File(folder, fileName); | |||
| if (newFile.exists()) { | |||
| long length=newFile.length(); | |||
| if (length > maxFileSize) { | |||
| try { | |||
| byte[] fileByte=new byte[maxFileSize>>1]; | |||
| RandomAccessFile randomAccessFileIn=new RandomAccessFile(newFile,"rw"); | |||
| randomAccessFileIn.seek((length-fileByte.length)); | |||
| randomAccessFileIn.read(fileByte); | |||
| randomAccessFileIn.close(); | |||
| FileOutputStream fileOutputStream=new FileOutputStream(newFile); | |||
| fileOutputStream.write(fileByte); | |||
| fileOutputStream.flush(); | |||
| fileOutputStream.close(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } else { | |||
| try { | |||
| newFile.createNewFile(); | |||
| } catch (IOException e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| return newFile; | |||
| } | |||
| } | |||
| public static <T> T checkNotNull(T obj) { | |||
| if (obj == null) { | |||
| throw new NullPointerException(); | |||
| } | |||
| return obj; | |||
| } | |||
| } | |||
| @@ -0,0 +1,5 @@ | |||
| <vector android:height="24dp" android:tint="#FFFFFF" | |||
| android:viewportHeight="24" android:viewportWidth="24" | |||
| android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> | |||
| <path android:fillColor="@android:color/white" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/> | |||
| </vector> | |||
| @@ -0,0 +1,12 @@ | |||
| <vector xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:width="48dp" | |||
| android:height="48dp" | |||
| android:viewportWidth="1024" | |||
| android:viewportHeight="1024"> | |||
| <path | |||
| android:pathData="M512,981.3C253.9,981.3 42.7,770.1 42.7,512S253.9,42.7 512,42.7s469.3,211.2 469.3,469.3 -211.2,469.3 -469.3,469.3zM512,136.5c-206.5,0 -375.5,169 -375.5,375.5S305.5,887.5 512,887.5s375.5,-169 375.5,-375.5S718.5,136.5 512,136.5z" | |||
| android:fillColor="#ffffff"/> | |||
| <path | |||
| android:pathData="M512,796.7a46.1,46.1 0,0 1,-46.9 -46.9V480.6A46.1,46.1 0,0 1,512 433.8a46.1,46.1 0,0 1,46.9 46.9v269.1a46.1,46.1 0,0 1,-46.9 46.9zM512,364.9a46.1,46.1 0,0 1,-46.9 -46.9v-43.8A46.1,46.1 0,0 1,512 227.3a46.1,46.1 0,0 1,46.9 46.9v43.8A47,47 0,0 1,512 364.9z" | |||
| android:fillColor="#ffffff"/> | |||
| </vector> | |||
| @@ -65,7 +65,7 @@ | |||
| android:id="@+id/btnVersion" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="读版本" /> | |||
| android:text="读版本(BM)" /> | |||
| <Button | |||
| android:id="@+id/btnBattery" | |||
| @@ -1,70 +0,0 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:orientation="vertical" android:layout_width="match_parent" | |||
| android:layout_height="match_parent"> | |||
| <RadioGroup | |||
| android:id="@+id/unit" | |||
| android:layout_below="@+id/edit_Userid" | |||
| android:layout_width="match_parent" | |||
| android:orientation="horizontal" | |||
| android:layout_height="wrap_content"> | |||
| <RadioButton | |||
| android:id="@+id/kg" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="kg"/> | |||
| <RadioButton | |||
| android:id="@+id/jin" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="斤"/> | |||
| <RadioButton | |||
| android:id="@+id/st_lb" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="st:lb"/> | |||
| <RadioButton | |||
| android:id="@+id/lb" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="lb"/> | |||
| </RadioGroup> | |||
| <RadioGroup | |||
| android:id="@+id/temp_unit" | |||
| android:layout_below="@+id/edit_Userid" | |||
| android:layout_width="match_parent" | |||
| android:orientation="horizontal" | |||
| android:layout_height="wrap_content"> | |||
| <RadioButton | |||
| android:id="@+id/c" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="℃"/> | |||
| <RadioButton | |||
| android:id="@+id/f" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_weight="1" | |||
| android:text="℉"/> | |||
| </RadioGroup> | |||
| <Button | |||
| android:id="@+id/support_unit" | |||
| android:text="查询支持单位" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| /> | |||
| <ListView | |||
| android:id="@+id/log_list" | |||
| android:layout_marginTop="20dp" | |||
| android:layout_below="@id/unit" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent"> | |||
| </ListView> | |||
| </LinearLayout> | |||
| @@ -5,505 +5,9 @@ | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <LinearLayout | |||
| <androidx.recyclerview.widget.RecyclerView | |||
| android:id="@+id/rv_list" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <TextView | |||
| android:id="@+id/tv_app_version" | |||
| android:layout_width="0dp" | |||
| android:layout_weight="1" | |||
| android:layout_height="wrap_content" | |||
| android:padding="10dp" | |||
| android:text="@string/version" /> | |||
| <Button | |||
| android:id="@+id/btn_about" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="关于我们" | |||
| /> | |||
| </LinearLayout> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="vertical" | |||
| android:padding="5dp"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_clear_shake_hands" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:visibility="gone" | |||
| android:text="不握手不加密" /> | |||
| <Button | |||
| android:id="@+id/btn_rope_skipping_set_mode" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="跳绳设置模式" /> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_scale_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播体重秤"/> | |||
| <Button | |||
| android:id="@+id/btn_meat_probe" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="食物探针"/> | |||
| <Button | |||
| android:id="@+id/btn_meat_probe_charger" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="探针充电盒" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_sphy" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BLE血压计" /> | |||
| <Button | |||
| android:id="@+id/btn_sphy_wifi_ble" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="wifi血压计" /> | |||
| <Button | |||
| android:id="@+id/btn_tempgun" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="额温枪" /> | |||
| <Button | |||
| android:id="@+id/btn_temp" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="体温计" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_height" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="身高仪" /> | |||
| <Button | |||
| android:id="@+id/btn_lock" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:visibility="gone" | |||
| android:text="电子锁" /> | |||
| <Button | |||
| android:id="@+id/btn_ad_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="艾迪体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_smart_mask" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="口罩" /> | |||
| <Button | |||
| android:id="@+id/btn_baby" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="婴儿秤" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_baby_body_fat" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="婴儿体脂两用秤" /> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_scale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播秤" /> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_blood_oxygen" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血氧仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_wifi_ble_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="WiFi+Ble体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Ble体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_wifi_ble_tooth" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="牙刷(wifi+ble)" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_ble" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Ble通用设置" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_test" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BleTest" | |||
| /> | |||
| <Button | |||
| android:id="@+id/btnConnectTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BleConnectTest" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_public_ble_network" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BLE通用配网" /> | |||
| <Button | |||
| android:id="@+id/wifi_config" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="WIFI设备(配置wifi)" | |||
| android:visibility="gone" | |||
| /> | |||
| <Button | |||
| android:id="@+id/eight_scale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="八极秤" /> | |||
| <Button | |||
| android:id="@+id/glucometer" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血糖仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_ota" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="OTA通用" /> | |||
| <Button | |||
| android:id="@+id/btn_transmission" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="透传" /> | |||
| <Button | |||
| android:id="@+id/btn_bld" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="百利达" | |||
| android:visibility="gone" /> | |||
| <Button | |||
| android:id="@+id/btn_bleBo" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血氧(连接)" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_coffeeScale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="咖啡秤" /> | |||
| <Button | |||
| android:id="@+id/btn_scooter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="电滑板" /> | |||
| <Button | |||
| android:id="@+id/btn_shareCharger" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="共享充电器" /> | |||
| <Button | |||
| android:id="@+id/btn_share_socket" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="共享插座" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_height" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播身高仪" /> | |||
| <Button | |||
| android:id="@+id/btn_hbfs" | |||
| android:text="身高体脂秤" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content"/> | |||
| <Button | |||
| android:id="@+id/btn_find" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="寻物器" /> | |||
| <Button | |||
| android:id="@+id/btn_4g_bs" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="4G血糖仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_food_temp" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="食品温度计" /> | |||
| <Button | |||
| android:id="@+id/btn_temp_humidity" | |||
| android:text="温湿度计" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content"/> | |||
| <Button | |||
| android:id="@+id/btn_share_condom" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="共享套套机" /> | |||
| <Button | |||
| android:id="@+id/btn_rope_skip" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="跳绳" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_nutrition" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播营养秤" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_nutrition" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="蓝牙营养秤" /> | |||
| <Button | |||
| android:id="@+id/btn_toothbrush_test" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="牙刷测试" /> | |||
| <Button | |||
| android:id="@+id/btn_leaone_broadcast" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="LeaOne测试" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_fascia_gun" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="筋膜枪" /> | |||
| <Button | |||
| android:id="@+id/btn_blood_pressure_tc" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血压计透传" /> | |||
| <Button | |||
| android:id="@+id/btn_body_scale_4g" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="4G体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_scooter_cm02" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="电滑板Cm02" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_temp_instrument" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="测温仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_mqtt_air_detector" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="MQTT空气检测仪" /> | |||
| <Button | |||
| android:id="@+id/btn_air_detector" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="空气检测仪" /> | |||
| <Button | |||
| android:id="@+id/btn_mqtt" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Mqtt工具" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_wifi_ble_noise_meter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="wifi+ble噪音计" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_noise_meter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="ble噪音计" /> | |||
| <Button | |||
| android:id="@+id/btn_weight_scale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="体重秤"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_barometric_temp_humidity" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="气压温湿度计" /> | |||
| </LinearLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| android:layout_height="match_parent" /> | |||
| </LinearLayout> | |||
| @@ -0,0 +1,509 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <TextView | |||
| android:id="@+id/tv_app_version" | |||
| android:layout_width="0dp" | |||
| android:layout_weight="1" | |||
| android:layout_height="wrap_content" | |||
| android:padding="10dp" | |||
| android:text="@string/version" /> | |||
| <Button | |||
| android:id="@+id/btn_about" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="关于我们" | |||
| /> | |||
| </LinearLayout> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:orientation="vertical" | |||
| android:padding="5dp"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_clear_shake_hands" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:visibility="gone" | |||
| android:text="不握手不加密" /> | |||
| <Button | |||
| android:id="@+id/btn_rope_skipping_set_mode" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="跳绳设置模式" /> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_scale_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播体重秤"/> | |||
| <Button | |||
| android:id="@+id/btn_meat_probe" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="食物探针"/> | |||
| <Button | |||
| android:id="@+id/btn_meat_probe_charger" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="探针充电盒" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_sphy" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BLE血压计" /> | |||
| <Button | |||
| android:id="@+id/btn_sphy_wifi_ble" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="wifi血压计" /> | |||
| <Button | |||
| android:id="@+id/btn_tempgun" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="额温枪" /> | |||
| <Button | |||
| android:id="@+id/btn_temp" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="体温计" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_height" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="身高仪" /> | |||
| <Button | |||
| android:id="@+id/btn_lock" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:visibility="gone" | |||
| android:text="电子锁" /> | |||
| <Button | |||
| android:id="@+id/btn_ad_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="艾迪体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_smart_mask" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="口罩" /> | |||
| <Button | |||
| android:id="@+id/btn_baby" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="婴儿秤" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_baby_body_fat" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="婴儿体脂两用秤" /> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_scale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播秤" /> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_blood_oxygen" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血氧仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_wifi_ble_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="WiFi+Ble体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_weight" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Ble体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_wifi_ble_tooth" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="牙刷(wifi+ble)" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_ble" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Ble通用设置" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_test" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BleTest" | |||
| /> | |||
| <Button | |||
| android:id="@+id/btnConnectTest" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BleConnectTest" | |||
| /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_public_ble_network" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="BLE通用配网" /> | |||
| <Button | |||
| android:id="@+id/wifi_config" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="WIFI设备(配置wifi)" | |||
| android:visibility="gone" | |||
| /> | |||
| <Button | |||
| android:id="@+id/eight_scale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="八极秤" /> | |||
| <Button | |||
| android:id="@+id/glucometer" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血糖仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_ota" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="OTA通用" /> | |||
| <Button | |||
| android:id="@+id/btn_transmission" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="透传" /> | |||
| <Button | |||
| android:id="@+id/btn_bld" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="百利达" | |||
| android:visibility="gone" /> | |||
| <Button | |||
| android:id="@+id/btn_bleBo" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血氧(连接)" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_coffeeScale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="咖啡秤" /> | |||
| <Button | |||
| android:id="@+id/btn_scooter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="电滑板" /> | |||
| <Button | |||
| android:id="@+id/btn_shareCharger" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="共享充电器" /> | |||
| <Button | |||
| android:id="@+id/btn_share_socket" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="共享插座" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_height" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播身高仪" /> | |||
| <Button | |||
| android:id="@+id/btn_hbfs" | |||
| android:text="身高体脂秤" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content"/> | |||
| <Button | |||
| android:id="@+id/btn_find" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="寻物器" /> | |||
| <Button | |||
| android:id="@+id/btn_4g_bs" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="4G血糖仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_food_temp" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="食品温度计" /> | |||
| <Button | |||
| android:id="@+id/btn_temp_humidity" | |||
| android:text="温湿度计" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content"/> | |||
| <Button | |||
| android:id="@+id/btn_share_condom" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="共享套套机" /> | |||
| <Button | |||
| android:id="@+id/btn_rope_skip" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="跳绳" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_broadcast_nutrition" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="广播营养秤" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_nutrition" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="蓝牙营养秤" /> | |||
| <Button | |||
| android:id="@+id/btn_toothbrush_test" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="牙刷测试" /> | |||
| <Button | |||
| android:id="@+id/btn_leaone_broadcast" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="LeaOne测试" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_fascia_gun" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="筋膜枪" /> | |||
| <Button | |||
| android:id="@+id/btn_blood_pressure_tc" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="血压计透传" /> | |||
| <Button | |||
| android:id="@+id/btn_body_scale_4g" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="4G体脂秤" /> | |||
| <Button | |||
| android:id="@+id/btn_scooter_cm02" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="电滑板Cm02" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_temp_instrument" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="测温仪" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_mqtt_air_detector" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="MQTT空气检测仪" /> | |||
| <Button | |||
| android:id="@+id/btn_air_detector" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="空气检测仪" /> | |||
| <Button | |||
| android:id="@+id/btn_mqtt" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="Mqtt工具" /> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_wifi_ble_noise_meter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="wifi+ble噪音计" /> | |||
| <Button | |||
| android:id="@+id/btn_ble_noise_meter" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="ble噪音计" /> | |||
| <Button | |||
| android:id="@+id/btn_weight_scale" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="体重秤"/> | |||
| </LinearLayout> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content"> | |||
| <Button | |||
| android:id="@+id/btn_barometric_temp_humidity" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="气压温湿度计" /> | |||
| </LinearLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| </LinearLayout> | |||
| @@ -6,7 +6,7 @@ | |||
| android:layout_height="match_parent" | |||
| android:gravity="center_horizontal" | |||
| android:orientation="vertical" | |||
| tools:context=".MainActivity"> | |||
| tools:context=".home.MainActivity"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| @@ -6,7 +6,7 @@ | |||
| android:layout_height="match_parent" | |||
| android:gravity="center_horizontal" | |||
| android:orientation="vertical" | |||
| tools:context=".MainActivity"> | |||
| tools:context=".home.MainActivity"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| @@ -1,65 +0,0 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <RelativeLayout | |||
| xmlns:android="http://schemas.android.com/apk/res/android" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:orientation="vertical"> | |||
| <Button | |||
| android:id="@+id/default_try_out" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginTop="5dp" | |||
| android:text="试用" /> | |||
| <Button | |||
| android:id="@+id/default_mode" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_below="@+id/sn" | |||
| android:layout_toEndOf="@id/default_try_out" | |||
| android:layout_marginStart="9dp" | |||
| android:layout_marginTop="5dp" | |||
| android:text="默认档位" /> | |||
| <EditText | |||
| android:id="@+id/select_gears_et" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_alignTop="@id/default_mode" | |||
| android:layout_toEndOf="@id/default_mode" | |||
| android:hint="时长(s),档位,档位级别" | |||
| android:textSize="14dp" /> | |||
| <Button | |||
| android:id="@+id/support_unit" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_below="@+id/default_mode" | |||
| android:layout_marginTop="5dp" | |||
| android:text="获取支持档位" /> | |||
| <Button | |||
| android:id="@+id/default_time_mode" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_toEndOf="@id/support_unit" | |||
| android:layout_below="@+id/default_mode" | |||
| android:layout_marginTop="5dp" | |||
| android:text="获取时长和档位" /> | |||
| <ListView | |||
| android:id="@+id/log_list" | |||
| android:layout_marginTop="10dp" | |||
| android:layout_below="@id/default_time_mode" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent"> | |||
| </ListView> | |||
| </RelativeLayout> | |||
| @@ -185,7 +185,7 @@ | |||
| android:inputType="text" | |||
| android:maxLines="1" | |||
| android:hint="IP or Url" | |||
| android:text="47.113.114.70" /> | |||
| android:text="ailink.iot.aicare.net.cn" /> | |||
| <EditText | |||
| android:id="@+id/et_port" | |||
| @@ -196,7 +196,7 @@ | |||
| android:inputType="number" | |||
| android:maxLines="1" | |||
| android:hint="port" | |||
| android:text="8092" /> | |||
| android:text="80" /> | |||
| <EditText | |||
| android:id="@+id/et_path" | |||
| @@ -206,8 +206,8 @@ | |||
| android:layout_marginEnd="10dp" | |||
| android:inputType="text" | |||
| android:maxLines="1" | |||
| android:hint="path" | |||
| android:text="/index/" /> | |||
| android:hint="ps:/index/" | |||
| android:text="" /> | |||
| <LinearLayout | |||
| @@ -0,0 +1,128 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="match_parent" | |||
| android:focusable="true" | |||
| android:focusableInTouchMode="true" | |||
| android:orientation="vertical"> | |||
| <ScrollView | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="1"> | |||
| <LinearLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginTop="10dp" | |||
| android:orientation="vertical"> | |||
| <androidx.constraintlayout.widget.ConstraintLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginStart="10dp" | |||
| android:layout_marginEnd="10dp"> | |||
| <TextView | |||
| android:id="@+id/tv_wifi_title" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="WIFI:" | |||
| app:layout_constraintBottom_toBottomOf="parent" | |||
| app:layout_constraintStart_toStartOf="parent" | |||
| app:layout_constraintTop_toTopOf="parent" /> | |||
| <TextView | |||
| android:id="@+id/tv_wifi_ssid" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="" | |||
| app:layout_constraintBottom_toBottomOf="parent" | |||
| app:layout_constraintStart_toEndOf="@id/tv_wifi_title" | |||
| app:layout_constraintTop_toTopOf="parent" /> | |||
| <TextView | |||
| android:id="@+id/tv_wifi_status" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="" | |||
| app:layout_constraintBottom_toBottomOf="parent" | |||
| app:layout_constraintStart_toEndOf="@id/tv_wifi_title" | |||
| app:layout_constraintTop_toTopOf="parent" /> | |||
| <Button | |||
| android:id="@+id/btn_wifi" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="配网" | |||
| app:layout_constraintEnd_toStartOf="@id/btn_read_wifi_status" | |||
| app:layout_constraintTop_toTopOf="parent" /> | |||
| <Button | |||
| android:id="@+id/btn_read_wifi_status" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="读状态" | |||
| app:layout_constraintEnd_toEndOf="parent" | |||
| app:layout_constraintTop_toTopOf="parent" /> | |||
| </androidx.constraintlayout.widget.ConstraintLayout> | |||
| <androidx.constraintlayout.widget.ConstraintLayout | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginStart="10dp" | |||
| android:layout_marginEnd="10dp"> | |||
| <Button | |||
| android:id="@+id/btn_start_ota" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:text="重新连接WIFI" | |||
| app:layout_constraintStart_toStartOf="parent" | |||
| app:layout_constraintTop_toTopOf="parent" /> | |||
| <TextView | |||
| android:id="@+id/tv_wifi_info" | |||
| android:layout_width="0dp" | |||
| android:layout_height="match_parent" | |||
| app:layout_constraintStart_toEndOf="@id/btn_start_ota" | |||
| app:layout_constraintEnd_toEndOf="parent" | |||
| app:layout_constraintTop_toTopOf="parent" | |||
| android:layout_marginStart="10dp" | |||
| android:text="SSID:\nPWD:" | |||
| /> | |||
| </androidx.constraintlayout.widget.ConstraintLayout> | |||
| </LinearLayout> | |||
| </ScrollView> | |||
| <Button | |||
| android:id="@+id/clear" | |||
| android:layout_width="wrap_content" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginStart="10dp" | |||
| android:text="清空" /> | |||
| <ListView | |||
| android:id="@+id/listview" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="0dp" | |||
| android:layout_weight="2" | |||
| android:padding="10dp" | |||
| android:stackFromBottom="true" | |||
| android:transcriptMode="alwaysScroll"> | |||
| </ListView> | |||
| </LinearLayout> | |||
| @@ -0,0 +1,25 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto" | |||
| xmlns:tools="http://schemas.android.com/tools" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:layout_marginStart="16dp" | |||
| android:layout_marginEnd="16dp" | |||
| android:layout_marginBottom="10dp" | |||
| app:cardBackgroundColor="@color/white" | |||
| app:cardCornerRadius="8dp" | |||
| android:foreground="?attr/selectableItemBackground" | |||
| app:cardElevation="0dp" | |||
| app:contentPadding="12dp"> | |||
| <TextView | |||
| android:id="@+id/tv_content" | |||
| android:layout_width="match_parent" | |||
| android:layout_height="wrap_content" | |||
| android:gravity="center" | |||
| android:textColor="@color/black" | |||
| android:textSize="18dp" | |||
| tools:text="item" /> | |||
| </androidx.cardview.widget.CardView> | |||
| @@ -0,0 +1,11 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto"> | |||
| <item | |||
| android:id="@+id/toolbar_right_menu" | |||
| android:icon="@drawable/ic_info" | |||
| android:title="@string/about_us" | |||
| app:showAsAction="always" /> | |||
| </menu> | |||
| @@ -0,0 +1,11 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <menu xmlns:android="http://schemas.android.com/apk/res/android" | |||
| xmlns:app="http://schemas.android.com/apk/res-auto"> | |||
| <item | |||
| android:id="@+id/toolbar_right_menu" | |||
| android:icon="@drawable/ic_baseline_share_24" | |||
| android:title="@string/share" | |||
| app:showAsAction="always" /> | |||
| </menu> | |||
| @@ -118,4 +118,64 @@ | |||
| <string name="connecting_wifi">正在连接wifi...</string> | |||
| <string name="cancel">取消</string> | |||
| <string name="select_wifi">选择WIFI</string> | |||
| <string name="item_ble_general_settings">Ble通用设置</string> | |||
| <string name="item_ble_universal_distribution_network">BLE通用配网</string> | |||
| <string name="item_ble_test">Ble test</string> | |||
| <string name="item_ble_connect_test">Ble connect test</string> | |||
| <string name="item_ota">OTA通用</string> | |||
| <string name="item_penetrate">透传</string> | |||
| <string name="item_body_fat_scale_broadcast">广播秤</string> | |||
| <string name="item_body_fat_scale_ble">Ble体脂秤</string> | |||
| <string name="item_body_fat_scale_4g">4G体脂秤</string> | |||
| <string name="item_body_fat_scale_wifi_ble">WiFi+Ble体脂秤</string> | |||
| <string name="item_body_fat_scale_eight">八极秤</string> | |||
| <string name="item_body_fat_scale_aidi">艾迪体脂秤</string> | |||
| <string name="item_baby_scale">婴儿秤</string> | |||
| <string name="item_baby_body_fat_scale">婴儿体脂两用秤</string> | |||
| <string name="item_weight_scale_ble">Ble体重秤</string> | |||
| <string name="item_weight_scale_broadcast">广播体重秤</string> | |||
| <string name="item_nutritional_scale_ble">蓝牙营养秤</string> | |||
| <string name="item_nutritional_scale_broadcast">广播营养秤</string> | |||
| <string name="item_coffee_scale">咖啡秤</string> | |||
| <string name="item_height_body_fat_scale">身高体脂秤</string> | |||
| <string name="item_height_measuring_ble">身高仪</string> | |||
| <string name="item_height_measuring_broadcast">广播身高仪</string> | |||
| <string name="item_sphygmometer_ble">BLE血压计</string> | |||
| <string name="item_sphygmometer_wifi">wifi血压计</string> | |||
| <string name="item_sphygmometer_penetrate">血压计透传</string> | |||
| <string name="item_blood_glucose_meter_ble">血糖仪</string> | |||
| <string name="item_blood_glucose_meter_4g">4G血糖仪</string> | |||
| <string name="item_oximeter_broadcast">血氧仪(广播)</string> | |||
| <string name="item_oximeter_ble">血氧(连接)</string> | |||
| <string name="item_infrared_thermometer">额温枪</string> | |||
| <string name="item_thermometer">体温计</string> | |||
| <string name="item_auto_thermometer">测温仪</string> | |||
| <string name="item_food_thermometer">食品温度计</string> | |||
| <string name="item_meat_probe">食物探针</string> | |||
| <string name="item_probe_charging_box">探针充电盒</string> | |||
| <string name="item_toothbrush_wifi_ble">牙刷(wifi+ble)</string> | |||
| <string name="item_toothbrush_test">牙刷测试</string> | |||
| <string name="item_smart_mask">口罩</string> | |||
| <string name="item_fascia_gun">筋膜枪</string> | |||
| <string name="item_rope_skipping">跳绳</string> | |||
| <string name="item_rope_skipping_set_mode">跳绳设置模式</string> | |||
| <string name="item_hygrothermograph">温湿度计</string> | |||
| <string name="item_barothermohygrograph">气压温湿度计</string> | |||
| <string name="item_noise_meter_ble">ble噪音计</string> | |||
| <string name="item_noise_meter_wifi_ble">wifi+ble噪音计</string> | |||
| <string name="item_air_Detector">空气检测仪</string> | |||
| <string name="item_scooter">电滑板</string> | |||
| <string name="item_scooter_cm02">电滑板Cm02</string> | |||
| <string name="item_shared_charger">共享充电器</string> | |||
| <string name="item_shared_socket">共享插座</string> | |||
| <string name="item_condom">共享套套机</string> | |||
| <string name="item_finder">寻物器</string> | |||
| <string name="item_leaone">LeaOne测试</string> | |||
| <string name="item_no_handshake_encryption">不握手不加密</string> | |||
| <string name="item_electronic_locks">电子锁</string> | |||
| <string name="item_wifi_config">WIFI设备(配置wifi)</string> | |||
| <string name="about_us">关于我们</string> | |||
| <string name="share">分享</string> | |||
| <string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string> | |||
| </resources> | |||
| @@ -122,4 +122,63 @@ | |||
| <string name="cancel">Cancel</string> | |||
| <string name="select_wifi">Select WIFI</string> | |||
| <string name="item_ble_general_settings">Ble general settings</string> | |||
| <string name="item_ble_universal_distribution_network">Ble distribution network</string> | |||
| <string name="item_ble_test">Ble test</string> | |||
| <string name="item_ble_connect_test">Ble connect test</string> | |||
| <string name="item_ota">OTA</string> | |||
| <string name="item_penetrate">Penetrate</string> | |||
| <string name="item_body_fat_scale_broadcast">Body fat scale (Broadcast)</string> | |||
| <string name="item_body_fat_scale_ble">Body fat scale (Ble)</string> | |||
| <string name="item_body_fat_scale_4g">Body fat scale (4G)</string> | |||
| <string name="item_body_fat_scale_wifi_ble">Body fat scale (WiFi+Ble)</string> | |||
| <string name="item_body_fat_scale_eight">Eight-electrode body fat scale</string> | |||
| <string name="item_body_fat_scale_aidi">Body fat scale (Aidi)</string> | |||
| <string name="item_baby_scale">Baby scale</string> | |||
| <string name="item_baby_body_fat_scale">Baby body fat scale</string> | |||
| <string name="item_weight_scale_ble">Weight scale (Ble)</string> | |||
| <string name="item_weight_scale_broadcast">Weight scale (Broadcast)</string> | |||
| <string name="item_nutritional_scale_ble">Nutrition scale (Ble)</string> | |||
| <string name="item_nutritional_scale_broadcast">Nutrition scale (Broadcast)</string> | |||
| <string name="item_coffee_scale">Coffee scale</string> | |||
| <string name="item_height_body_fat_scale">Height body fat scale</string> | |||
| <string name="item_height_measuring_ble">Height meter (Ble)</string> | |||
| <string name="item_height_measuring_broadcast">Height meter (Broadcast)</string> | |||
| <string name="item_sphygmometer_ble">Sphygmometer (Ble)</string> | |||
| <string name="item_sphygmometer_wifi">Sphygmometer (Wifi)</string> | |||
| <string name="item_sphygmometer_penetrate">Sphygmometer (Penetrate)</string> | |||
| <string name="item_blood_glucose_meter_ble">Blood pressure monitor (Ble)</string> | |||
| <string name="item_blood_glucose_meter_4g">Blood pressure monitor (4G)</string> | |||
| <string name="item_oximeter_broadcast">Oximeter (Broadcast)</string> | |||
| <string name="item_oximeter_ble">Oximeter (Ble)</string> | |||
| <string name="item_infrared_thermometer">Forehead thermometer</string> | |||
| <string name="item_thermometer">Thermometer</string> | |||
| <string name="item_auto_thermometer">Infrared thermometer</string> | |||
| <string name="item_food_thermometer">Food thermometer</string> | |||
| <string name="item_meat_probe">Meat probe</string> | |||
| <string name="item_probe_charging_box">Probe charging box</string> | |||
| <string name="item_toothbrush_wifi_ble">Toothbrush (wifi+ble)</string> | |||
| <string name="item_toothbrush_test">Toothbrush test</string> | |||
| <string name="item_smart_mask">Mask</string> | |||
| <string name="item_fascia_gun">Fascia gun</string> | |||
| <string name="item_rope_skipping">Skipping rope</string> | |||
| <string name="item_rope_skipping_set_mode">Skipping rope setting mode</string> | |||
| <string name="item_hygrothermograph">Hygrothermograph</string> | |||
| <string name="item_barothermohygrograph">Barothermohygrograph</string> | |||
| <string name="item_noise_meter_ble">Noise meter (ble)</string> | |||
| <string name="item_noise_meter_wifi_ble">Noise meter (WiFi+Ble)</string> | |||
| <string name="item_air_Detector">Air detector</string> | |||
| <string name="item_scooter">Scooter</string> | |||
| <string name="item_scooter_cm02">Scooter cm02</string> | |||
| <string name="item_shared_charger">Shared charger</string> | |||
| <string name="item_shared_socket">Shared socket</string> | |||
| <string name="item_condom">Shared condom</string> | |||
| <string name="item_finder">Item finder</string> | |||
| <string name="item_leaone">LeaOne test</string> | |||
| <string name="item_no_handshake_encryption">No handshake, no encryption</string> | |||
| <string name="item_electronic_locks">Electronic locks</string> | |||
| <string name="item_wifi_config">WIFI config</string> | |||
| <string name="about_us">About us</string> | |||
| <string name="share">Share</string> | |||
| <string name="wifi_ble_ota_tool">WIFI+BLE OTA工具</string> | |||
| </resources> | |||