@@ -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> |