apply plugin: 'com.android.application' | apply plugin: 'com.android.application' | ||||
apply plugin: 'com.jakewharton.butterknife' | |||||
android { | android { | ||||
compileSdkVersion 29 | compileSdkVersion 29 | ||||
buildToolsVersion "29.0.2" | buildToolsVersion "29.0.2" | ||||
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid" | ||||
minSdkVersion 19 | minSdkVersion 19 | ||||
targetSdkVersion 29 | targetSdkVersion 29 | ||||
versionCode 2 | |||||
versionName "1.3.0" | |||||
versionCode 3 | |||||
versionName "1.5.2" | |||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" | ||||
} | } | ||||
buildTypes { | buildTypes { | ||||
implementation 'androidx.appcompat:appcompat:1.1.0' | implementation 'androidx.appcompat:appcompat:1.1.0' | ||||
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' | ||||
testImplementation 'junit:junit:4.12' | testImplementation 'junit:junit:4.12' | ||||
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.4.5' | |||||
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.3.0' | |||||
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.5.1' | |||||
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.5.2' | |||||
implementation 'androidx.recyclerview:recyclerview:1.1.0' | |||||
implementation 'com.jakewharton:butterknife:10.2.0' | |||||
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0' | |||||
} | } |
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||||
<manifest package="aicare.net.cn.sdk.ailinksdkdemoandroid" | <manifest package="aicare.net.cn.sdk.ailinksdkdemoandroid" | ||||
xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
xmlns:android="http://schemas.android.com/apk/res/android" | |||||
xmlns:tools="http://schemas.android.com/tools"> | |||||
<!--兼容6.0以上的手机Ble--> | <!--兼容6.0以上的手机Ble--> | ||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION"/> | |||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/> | |||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" /> | |||||
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" /> | |||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> | |||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> | |||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> | |||||
<uses-permission android:name="android.permission.INTERNET" /> | |||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> | |||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> | |||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> | |||||
<uses-permission android:name="android.permission.BLUETOOTH"/> | |||||
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> | |||||
<!--OTA需要读写文件--> | |||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | |||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> | |||||
<uses-feature | <uses-feature | ||||
android:name="android.hardware.bluetooth_le" | android:name="android.hardware.bluetooth_le" | ||||
android:required="true"/> | android:required="true"/> | ||||
android:icon="@mipmap/ic_launcher" | android:icon="@mipmap/ic_launcher" | ||||
android:label="@string/app_name" | android:label="@string/app_name" | ||||
android:roundIcon="@mipmap/ic_launcher_round" | android:roundIcon="@mipmap/ic_launcher_round" | ||||
android:requestLegacyExternalStorage="true" | |||||
android:supportsRtl="true" | android:supportsRtl="true" | ||||
android:theme="@style/AppTheme"> | |||||
android:usesCleartextTraffic="true" | |||||
android:theme="@style/AppTheme" | |||||
tools:targetApi="q"> | |||||
<activity android:name=".MainActivity"> | <activity android:name=".MainActivity"> | ||||
<intent-filter> | <intent-filter> | ||||
<action android:name="android.intent.action.VIEW"/> | |||||
<action android:name="android.intent.action.MAIN"/> | |||||
<category android:name="android.intent.category.LAUNCHER"/> | |||||
<action android:name="android.intent.action.VIEW" /> | |||||
<action android:name="android.intent.action.MAIN" /> | |||||
<category android:name="android.intent.category.LAUNCHER" /> | |||||
</intent-filter> | </intent-filter> | ||||
</activity> | </activity> | ||||
<activity android:name=".ShowBleActivity"/> | |||||
<activity android:name=".BabyCmdActivity"/> | |||||
<activity android:name=".TempGunCmdActivity"/> | |||||
<activity android:name=".SphyCmdActivity"/> | |||||
<activity android:name=".TempCmdActivity"/> | |||||
<activity android:name=".HeightCmdActivity"/> | |||||
<activity android:name=".BleCmdActivityDataData"/> | |||||
<activity android:name=".ShowBleActivity" /> | |||||
<activity android:name=".BabyCmdActivity" /> | |||||
<activity android:name=".TempGunCmdActivity" /> | |||||
<activity android:name=".SphyCmdActivity" /> | |||||
<activity android:name=".TempCmdActivity" /> | |||||
<activity android:name=".HeightCmdActivity" /> | |||||
<activity android:name=".BleCmdActivity" /> | |||||
<activity android:name=".TestCmdActivity" /> | |||||
<activity android:name=".TpmsConnectCmdActivity" /> | <activity android:name=".TpmsConnectCmdActivity" /> | ||||
<activity android:name=".BloodGlucoseActivity" /> | |||||
<activity android:name=".ADWeightScaleCmdActivity"/> | |||||
<activity android:name=".ADWeightScaleUserActivity" | |||||
android:theme="@style/Theme.AppCompat.Light.NoActionBar" | |||||
/> | |||||
<activity android:name=".WeightScaleWifiBle" | |||||
android:theme="@style/Theme.AppCompat.Light.NoActionBar" | |||||
/> | |||||
<activity android:name=".ConnectBleTestActivity" /> | |||||
<activity android:name=".ADWeightScaleCmdActivity" /> | |||||
<activity android:name=".ADWeightScaleUserActivity" /> | |||||
<activity android:name=".WeightScaleWifiBle" /> | |||||
<activity android:name=".WeightScaleBle"/> | |||||
<activity android:name=".WifiConfigActivity"/> | |||||
<activity android:name=".EightBodyfatActivity"/> | |||||
<activity android:name=".TestOtaActivity"/> | |||||
<activity android:name=".BloodGlucoseActivity"/> | |||||
<activity android:name=".BabyBodyFatCmdActivity" /> | |||||
<activity android:name=".BroadcastScaleActivity" /> | |||||
<activity android:name=".TransmissionActivity"/> | |||||
<activity android:name=".BroadcastBloodOxygenActivity" /> | |||||
<activity android:name=".SmartMaskActivity" /> | |||||
<activity android:name=".ToothBrushWifiBleActivity" /> | |||||
<service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"/> | <service android:name="com.pingwang.bluetoothlib.server.ELinkBleServer"/> | ||||
</application> | </application> |
import android.widget.RadioGroup; | import android.widget.RadioGroup; | ||||
import android.widget.TextView; | import android.widget.TextView; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
import com.pingwang.bluetoothlib.config.CmdConfig; | import com.pingwang.bluetoothlib.config.CmdConfig; | ||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData; | import cn.net.aicare.modulelibrary.module.ADWeight.ADWeightScaleUserData; | ||||
/** | /** | ||||
* xing<br> | * xing<br> | ||||
* 2019/7/12<br> | * 2019/7/12<br> | ||||
@Override | @Override | ||||
public void getWeight(int weight, int decimal, int unit) { | public void getWeight(int weight, int decimal, int unit) { | ||||
String weightStr = BleDensityUtil.getInstance().holdNumber(weight, decimal); | |||||
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, decimal); | |||||
mList.add(TimeUtils.getTime() + "稳定体重=" + weightStr + ";小数位=" + decimal + ";单位=" + unit); | mList.add(TimeUtils.getTime() + "稳定体重=" + weightStr + ";小数位=" + decimal + ";单位=" + unit); | ||||
if (weightUnit != unit) { | if (weightUnit != unit) { | ||||
@Override | @Override | ||||
public void getWeightNow(int weight, int decimal, int unit) { | public void getWeightNow(int weight, int decimal, int unit) { | ||||
String weightStr = BleDensityUtil.getInstance().holdNumber(weight, decimal); | |||||
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, decimal); | |||||
mList.add(TimeUtils.getTime() + "实时体重=" + weightStr + ";小数位=" + decimal + ";单位=" + unit); | mList.add(TimeUtils.getTime() + "实时体重=" + weightStr + ";小数位=" + decimal + ";单位=" + unit); | ||||
//10.00,2,0 | //10.00,2,0 | ||||
if (weightUnit != unit) { | if (weightUnit != unit) { |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.app.Dialog; | |||||
import android.content.DialogInterface; | |||||
import android.content.IntentFilter; | |||||
import android.os.Bundle; | |||||
import android.view.KeyEvent; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.RadioGroup; | |||||
import android.widget.SeekBar; | |||||
import android.widget.TextView; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.fragment.app.DialogFragment; | |||||
import androidx.fragment.app.FragmentManager; | |||||
import java.net.IDN; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||||
public class AddUserDialog extends DialogFragment implements View.OnClickListener , SeekBar.OnSeekBarChangeListener, RadioGroup.OnCheckedChangeListener { | |||||
private boolean mCancelBlank; | |||||
private TextView id; | |||||
private SeekBar agesb, heightsb, weightsb, adcsb; | |||||
private RadioGroup sexRG, modeRG; | |||||
private User user; | |||||
private TextView tv_move_data_ok, tv_move_data_cancel; | |||||
private OnDialogListener mOnDialogListener; | |||||
public AddUserDialog( OnDialogListener onDialogListener) { | |||||
user=new User(); | |||||
user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
user.setAge(0); | |||||
user.setHeight(0); | |||||
user.setAdc(0); | |||||
user.setWeight(0); | |||||
mOnDialogListener = onDialogListener; | |||||
} | |||||
@NonNull | |||||
@Override | |||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||||
Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||||
dialogView.setCancelable(false);//设置是否可以关闭 | |||||
dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消 | |||||
dialogView.setOnKeyListener((dialog, keyCode, event) -> { | |||||
if (mCancelBlank) { | |||||
return false; | |||||
} else { | |||||
//返回不关闭 | |||||
return keyCode == KeyEvent.KEYCODE_BACK; | |||||
} | |||||
}); | |||||
return dialogView; | |||||
} | |||||
@Nullable | |||||
@Override | |||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | |||||
return inflater.inflate(R.layout.item_user_info, container); | |||||
} | |||||
@Override | |||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { | |||||
super.onViewCreated(view, savedInstanceState); | |||||
agesb = view.findViewById(R.id.agesb); | |||||
agesb.setOnSeekBarChangeListener(this); | |||||
id = view.findViewById(R.id.id); | |||||
tv_move_data_ok = view.findViewById(R.id.tv_move_data_ok); | |||||
tv_move_data_cancel = view.findViewById(R.id.tv_move_data_cancel); | |||||
tv_move_data_cancel.setOnClickListener(this); | |||||
tv_move_data_ok.setOnClickListener(this); | |||||
heightsb = view.findViewById(R.id.heightsb); | |||||
heightsb.setOnSeekBarChangeListener(this); | |||||
weightsb = view.findViewById(R.id.weightsb); | |||||
weightsb.setOnSeekBarChangeListener(this); | |||||
adcsb = view.findViewById(R.id.adcsb); | |||||
adcsb.setOnSeekBarChangeListener(this); | |||||
sexRG = view.findViewById(R.id.sexrg); | |||||
modeRG = view.findViewById(R.id.moderg); | |||||
sexRG.check(R.id.man); | |||||
modeRG.check(R.id.ordinary); | |||||
sexRG.setOnCheckedChangeListener(this); | |||||
modeRG.setOnCheckedChangeListener(this); | |||||
settext(); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (v.getId() == R.id.tv_move_data_ok) { | |||||
mOnDialogListener.tvSucceedListener(user); | |||||
dismiss(); | |||||
} else if (v.getId() == R.id.tv_move_data_cancel) { | |||||
dismiss(); | |||||
} | |||||
} | |||||
@Override | |||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||||
int id = seekBar.getId(); | |||||
if (id == R.id.weightsb) { | |||||
user.setWeight(progress); | |||||
} else if (id == R.id.adcsb) { | |||||
user.setAdc(progress); | |||||
} else if (id == R.id.heightsb) { | |||||
user.setHeight(progress); | |||||
} else if (id == R.id.agesb) { | |||||
user.setAge(progress); | |||||
} | |||||
settext(); | |||||
} | |||||
@Override | |||||
public void onStartTrackingTouch(SeekBar seekBar) { | |||||
} | |||||
@Override | |||||
public void onStopTrackingTouch(SeekBar seekBar) { | |||||
} | |||||
@Override | |||||
public void onCheckedChanged(RadioGroup group, int checkedId) { | |||||
if (checkedId == R.id.man) { | |||||
user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
} else if (checkedId == R.id.female) { | |||||
user.setSex(BodyFatDataUtil.SEX_FEMAN); | |||||
} else if (checkedId == R.id.ordinary) { | |||||
user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
} else if (checkedId == R.id.athlete) { | |||||
user.setModeType(BodyFatDataUtil.MODE_ATHLETE); | |||||
} else if (checkedId == R.id.pregnant) { | |||||
user.setModeType(BodyFatDataUtil.MODE_PREGNANT); | |||||
} | |||||
settext(); | |||||
} | |||||
private void settext() { | |||||
if (id != null) id.setText(user.toString()); | |||||
} | |||||
public interface OnDialogListener { | |||||
/** | |||||
* 取消的点击事件 | |||||
*/ | |||||
default void tvCancelListener() { | |||||
} | |||||
/** | |||||
* 成功的点击事件 | |||||
*/ | |||||
default void tvSucceedListener(User user) { | |||||
} | |||||
} | |||||
public void show(@NonNull FragmentManager manager) { | |||||
this.show(manager, "DialogFragment"); | |||||
} | |||||
@Override | |||||
public void onDismiss(@NonNull DialogInterface dialog) { | |||||
super.onDismiss(dialog); | |||||
mShow = false; | |||||
} | |||||
private boolean mShow=false; | |||||
@Override | |||||
public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||||
try { | |||||
if (!mShow) { | |||||
super.show(manager, tag); | |||||
mShow = true; | |||||
} | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
@Override | |||||
public void dismiss() { | |||||
try { | |||||
mShow = false; | |||||
super.dismiss(); | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.ListView; | |||||
import android.widget.RadioButton; | |||||
import android.widget.RadioGroup; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||||
import com.pingwang.bluetoothlib.listener.OnBleCompanyListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
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.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatBleConfig; | |||||
import cn.net.aicare.modulelibrary.module.babyBodyFat.BabyBodyFatDeviceData; | |||||
import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; | |||||
/** | |||||
* xing<br> | |||||
* 2020/08/10<br> | |||||
* 显示数据 | |||||
*/ | |||||
public class BabyBodyFatCmdActivity extends BleBaseActivity implements OnCallbackBle, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, BabyBodyFatDeviceData.onNotifyData, | |||||
View.OnClickListener, RadioGroup.OnCheckedChangeListener { | |||||
private static String TAG = BabyBodyFatCmdActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private Context mContext; | |||||
private BabyBodyFatDeviceData mDevice; | |||||
private String mAddress; | |||||
private BleSendCmdUtil mBleSendCmdUtil; | |||||
private int type; | |||||
private int weightUnit = 0; | |||||
private int heightUnit = 0; | |||||
private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin; | |||||
private RadioButton mRadioButtonCm, mRadioButtonInch, mRadioButtonFoot; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_baby_body_fat_cmd); | |||||
mContext = this; | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
type = getIntent().getIntExtra("type", -1); | |||||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||||
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); | |||||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||||
findViewById(R.id.clear).setOnClickListener(this); | |||||
findViewById(R.id.btnDis).setOnClickListener(this); | |||||
findViewById(R.id.btnConnect).setOnClickListener(this); | |||||
findViewById(R.id.btn_set_tare).setOnClickListener(this); | |||||
findViewById(R.id.btn_set_hold).setOnClickListener(this); | |||||
((RadioGroup) findViewById(R.id.radio_weight)).setOnCheckedChangeListener(this); | |||||
((RadioGroup) findViewById(R.id.radio_height)).setOnCheckedChangeListener(this); | |||||
mRadioButtonKg = findViewById(R.id.radio_weight_kg); | |||||
mRadioButtonJin = findViewById(R.id.radio_weight_jin); | |||||
mRadioButtonStLb = findViewById(R.id.radio_weight_st_lb); | |||||
mRadioButtonLb = findViewById(R.id.radio_weight_lb); | |||||
mRadioButtonOz = findViewById(R.id.radio_weight_oz); | |||||
mRadioButtonG = findViewById(R.id.radio_weight_g); | |||||
mRadioButtonLbLb = findViewById(R.id.radio_weight_lb_lb); | |||||
mRadioButtonCm = findViewById(R.id.radio_height_cm); | |||||
mRadioButtonInch = findViewById(R.id.radio_height_inch); | |||||
mRadioButtonFoot = findViewById(R.id.radio_height_foot); | |||||
} | |||||
@Override | |||||
public void onCheckedChanged(RadioGroup group, int checkedId) { | |||||
if (checkedId == -1) | |||||
return;//不是人为点击不触发 | |||||
switch (group.getCheckedRadioButtonId()) { | |||||
case R.id.radio_weight_kg: | |||||
weightUnit = BabyBleConfig.BABY_KG; | |||||
break; | |||||
case R.id.radio_weight_jin: | |||||
weightUnit = BabyBleConfig.BABY_FG; | |||||
break; | |||||
case R.id.radio_weight_lb: | |||||
weightUnit = BabyBleConfig.BABY_LB; | |||||
break; | |||||
case R.id.radio_weight_oz: | |||||
weightUnit = BabyBleConfig.BABY_OZ; | |||||
break; | |||||
case R.id.radio_weight_st_lb: | |||||
weightUnit = BabyBleConfig.BABY_ST; | |||||
break; | |||||
case R.id.radio_weight_g: | |||||
weightUnit = BabyBleConfig.BABY_G; | |||||
break; | |||||
case R.id.radio_weight_lb_lb: | |||||
weightUnit = BabyBleConfig.BABY_LB_LB; | |||||
break; | |||||
case R.id.radio_height_cm: | |||||
heightUnit = BabyBleConfig.BABY_CM; | |||||
break; | |||||
case R.id.radio_height_inch: | |||||
heightUnit = BabyBleConfig.BABY_INCH; | |||||
break; | |||||
case R.id.radio_height_foot: | |||||
heightUnit = BabyBleConfig.BABY_FEET; | |||||
break; | |||||
} | |||||
BleLog.i(TAG, "weightUnit:" + weightUnit + " ,||heightUnit:" + heightUnit); | |||||
mDevice.setUnit(weightUnit, heightUnit); | |||||
} | |||||
private void showWeightUnit(int unit) { | |||||
switch (unit) { | |||||
case BabyBleConfig.BABY_KG: | |||||
mRadioButtonKg.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_FG: | |||||
mRadioButtonJin.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_LB: | |||||
mRadioButtonLb.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_OZ: | |||||
mRadioButtonOz.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_ST: | |||||
mRadioButtonStLb.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_G: | |||||
mRadioButtonG.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_LB_LB: | |||||
mRadioButtonLbLb.setChecked(true); | |||||
break; | |||||
} | |||||
} | |||||
private void showHeightUnit(int unit) { | |||||
switch (unit) { | |||||
case BabyBleConfig.BABY_CM: | |||||
mRadioButtonCm.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_INCH: | |||||
mRadioButtonInch.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_FEET: | |||||
mRadioButtonFoot.setChecked(true); | |||||
break; | |||||
} | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
SendBleBean sendBleBean = new SendBleBean(); | |||||
switch (v.getId()) { | |||||
case R.id.btnVersion: | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
mDevice.sendData(sendBleBean); | |||||
break; | |||||
case R.id.clear: | |||||
if (mList != null) | |||||
mList.clear(); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
break; | |||||
case R.id.btnDis: | |||||
if (mDevice != null) { | |||||
mDevice.disconnect(); | |||||
} | |||||
break; | |||||
case R.id.btnConnect: | |||||
startScanBle(0); | |||||
break; | |||||
case R.id.btn_set_tare: | |||||
if (mDevice != null) { | |||||
mDevice.setTare(); | |||||
} | |||||
break; | |||||
case R.id.btn_set_hold: | |||||
if (mDevice != null) { | |||||
mDevice.setHold(); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.setOnCallback(this); | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
mDevice = BabyBodyFatDeviceData.getInstance(bleDevice); | |||||
mDevice.setOnNotifyData(this); | |||||
mDevice.setOnBleVersionListener(BabyBodyFatCmdActivity.this); | |||||
mDevice.setOnMcuParameterListener(BabyBodyFatCmdActivity.this); | |||||
mDevice.setOnCompanyListener(BabyBodyFatCmdActivity.this); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
if (mDevice != null) { | |||||
mDevice.disconnect(); | |||||
mDevice.clear(); | |||||
mDevice = null; | |||||
} | |||||
} | |||||
//-----------------状态------------------- | |||||
@Override | |||||
public void onScanning(BleValueBean data) { | |||||
if (data.getMac().equals(mAddress)) { | |||||
connectBle(mAddress); | |||||
mList.add(TimeUtils.getTime() + "开始连接"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
} | |||||
@Override | |||||
public void onConnecting(@NonNull String mac) { | |||||
//TODO 连接中 | |||||
BleLog.i(TAG, "连接中"); | |||||
mList.add(TimeUtils.getTime() + "连接中"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onDisConnected(@NonNull String mac, int code) { | |||||
//TODO 连接断开 | |||||
BleLog.i(TAG, "连接断开"); | |||||
mList.add(TimeUtils.getTime() + "连接断开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(@NonNull String mac) { | |||||
//TODO 连接成功(获取服务成功) | |||||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
mList.add(TimeUtils.getTime() + "连接成功"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
onServiceSuccess(); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
mList.add(TimeUtils.getTime() + "蓝牙打开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
mList.add(TimeUtils.getTime() + "蓝牙关闭"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
public void onData(byte[] hex, int type) { | |||||
String data = ""; | |||||
if (hex != null) | |||||
data = BleStrUtils.byte2HexStr(hex); | |||||
if (type == 100) { | |||||
mList.add(TimeUtils.getTime() + "send->" + data); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onWeight(int weight, int decimal, byte unit, boolean stableStatus) { | |||||
String unitStr = "kg"; | |||||
switch (unit) { | |||||
case BabyBodyFatBleConfig.BABY_KG: | |||||
unitStr = "kg"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_FG: | |||||
unitStr = "斤"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_LB: | |||||
unitStr = "lb:oz"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_OZ: | |||||
unitStr = "oz"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_ST: | |||||
unitStr = "st:lb"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_G: | |||||
unitStr = "g"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_LB_LB: | |||||
unitStr = "LB"; | |||||
break; | |||||
} | |||||
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, decimal); | |||||
if (stableStatus) { | |||||
mList.add(TimeUtils.getTime() + "稳定体重=" + weightStr + ";小数位=" + decimal + ";单位=" + unit + ";" + unitStr); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "实时体重=" + weightStr + ";小数位=" + decimal + ";单位=" + unit + ";" + unitStr); | |||||
} | |||||
if (weightUnit != unit) { | |||||
weightUnit = unit; | |||||
showWeightUnit(weightUnit); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onHeight(int height, int decimal, byte unit, boolean stableStatus) { | |||||
String heightStr = BleDensityUtil.getInstance().holdDecimals(height, decimal); | |||||
String unitStr = "cm"; | |||||
switch (unit) { | |||||
case BabyBodyFatBleConfig.BABY_CM: | |||||
unitStr = "cm"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_INCH: | |||||
unitStr = "inch"; | |||||
break; | |||||
case BabyBodyFatBleConfig.BABY_FEET: | |||||
unitStr = "foot"; | |||||
break; | |||||
} | |||||
if (stableStatus) { | |||||
mList.add(TimeUtils.getTime() + "稳定身高=" + heightStr + ";小数位=" + decimal + ";单位=" + unit + ";" + unitStr); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "实时身高=" + heightStr + ";小数位=" + decimal + ";单位=" + unit + ";" + unitStr); | |||||
} | |||||
if (heightUnit != unit) { | |||||
heightUnit = unit; | |||||
showHeightUnit(heightUnit); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onImpedanceTesting() { | |||||
BleLog.i(TAG, "测阻抗中"); | |||||
mList.add(TimeUtils.getTime() + "测阻抗中..."); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onImpedanceSuccess(boolean appAlgorithm,int adc, int algorithmId) { | |||||
BleLog.i(TAG, "测阻抗成功"); | |||||
mList.add(TimeUtils.getTime() + "测阻抗成功,阻抗值:" + adc + " ,算法ID:" + algorithmId+" ;"+(appAlgorithm?"使用app算法":"使用秤算法")); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onImpedanceFailure() { | |||||
BleLog.i(TAG, "测阻抗失败"); | |||||
mList.add(TimeUtils.getTime() + "测阻抗失败..."); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onMeasurementCompleted() { | |||||
mList.add(TimeUtils.getTime() + "测量完成"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void getTare(byte status) { | |||||
String data = ""; | |||||
switch (status) { | |||||
case 0: | |||||
data = "去皮成功"; | |||||
break; | |||||
case 1: | |||||
data = "去皮失败"; | |||||
break; | |||||
case 2: | |||||
data = "不支持"; | |||||
break; | |||||
} | |||||
mList.add(TimeUtils.getTime() + data); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void getHold(byte status) { | |||||
String data = ""; | |||||
switch (status) { | |||||
case 0: | |||||
data = "锁定成功"; | |||||
break; | |||||
case 1: | |||||
data = "锁定失败"; | |||||
break; | |||||
case 2: | |||||
data = "不支持"; | |||||
break; | |||||
} | |||||
mList.add(TimeUtils.getTime() + data); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void getUnit(byte status) { | |||||
String msg = ""; | |||||
switch (status) { | |||||
case CmdConfig.SETTING_SUCCESS: | |||||
msg = "设置单位成功"; | |||||
break; | |||||
case CmdConfig.SETTING_FAILURE: | |||||
msg = "设置单位失败"; | |||||
break; | |||||
case CmdConfig.SETTING_ERR: | |||||
msg = "设置单位错误"; | |||||
break; | |||||
} | |||||
mList.add(TimeUtils.getTime() + msg); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void getErr(byte status) { | |||||
String statusStr = ""; | |||||
if (status == 0) { | |||||
statusStr = "超重"; | |||||
} else if (status == 1) { | |||||
statusStr = "称重期间,重量不稳定"; | |||||
} else if (status == 2) { | |||||
statusStr = "称重失败"; | |||||
} | |||||
mList.add(TimeUtils.getTime() + "错误指令:" + status+" ;"+statusStr); | |||||
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"); | |||||
} | |||||
} |
import android.widget.RadioGroup; | import android.widget.RadioGroup; | ||||
import android.widget.Toast; | import android.widget.Toast; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | import com.pingwang.bluetoothlib.bean.SupportUnitBean; | ||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData; | import cn.net.aicare.modulelibrary.module.babyscale.BabyDeviceData; | ||||
/** | /** | ||||
* xing<br> | * xing<br> | ||||
* 2019/4/25<br> | * 2019/4/25<br> | ||||
@Override | @Override | ||||
public void getWeight(int weight, int decimal, byte unit) { | public void getWeight(int weight, int decimal, byte unit) { | ||||
String weightStr = BleDensityUtil.getInstance().holdNumber(weight, decimal); | |||||
String showStr="稳定体重:" + weightStr + "|小数:" + decimal + "|单位:" + unit; | |||||
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, decimal); | |||||
String showStr="稳定体重:" + weightStr + "|小数位:" + decimal + "|单位:" + unit; | |||||
mList.add(TimeUtils.getTime() + showStr); | mList.add(TimeUtils.getTime() + showStr); | ||||
if (weightUnit != unit) { | if (weightUnit != unit) { | ||||
weightUnit = unit; | weightUnit = unit; | ||||
@Override | @Override | ||||
public void getWeightNow(int weight, int decimal, byte unit) { | public void getWeightNow(int weight, int decimal, byte unit) { | ||||
String weightStr = BleDensityUtil.getInstance().holdNumber(weight, decimal); | |||||
mList.add(TimeUtils.getTime() + "实时体重:" + weightStr + "|小数:" + decimal + "|单位:" + unit);//10.00,2,0 | |||||
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, decimal); | |||||
mList.add(TimeUtils.getTime() + "实时体重:" + weightStr + "|单位:" + unit);//10.00,2,0 | |||||
if (weightUnit != unit) { | if (weightUnit != unit) { | ||||
weightUnit = unit; | weightUnit = unit; | ||||
showWeightUnit(weightUnit); | showWeightUnit(weightUnit); | ||||
@Override | @Override | ||||
public void getHeight(int height, int decimal, byte unit) { | public void getHeight(int height, int decimal, byte unit) { | ||||
String heightStr = BleDensityUtil.getInstance().holdNumber(height, decimal); | |||||
mList.add(TimeUtils.getTime() + "稳定身高:" + heightStr + "|小数:" + decimal + "|单位:" + unit); | |||||
String heightStr = BleDensityUtil.getInstance().holdDecimals(height, decimal); | |||||
mList.add(TimeUtils.getTime() + "稳定身高:" + heightStr + "|单位:" + unit); | |||||
if (heightUnit != unit) { | if (heightUnit != unit) { | ||||
heightUnit = unit; | heightUnit = unit; | ||||
showHeightUnit(heightUnit); | showHeightUnit(heightUnit); |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.view.WindowManager; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.EditText; | |||||
import android.widget.ListView; | |||||
import android.widget.Toast; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
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.OnBleErrListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleHandshakeListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleInfoListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleOtherDataListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleParameterListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleSettingListener; | |||||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | |||||
import com.pingwang.bluetoothlib.utils.BleDataUtils; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Locale; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
/** | |||||
* xing<br> | |||||
* 2019/4/25<br> | |||||
* 基础指令信息数据显示 | |||||
*/ | |||||
public class BleCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, OnBleVersionListener, OnMcuParameterListener, OnBleErrListener, OnBleInfoListener, | |||||
OnBleParameterListener, OnBleCompanyListener, OnBleSettingListener, OnBleHandshakeListener, View.OnClickListener, OnBleOtherDataListener { | |||||
private static String TAG = BleCmdActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private EditText etName, etMacType, etDid, etBroadcastTime, etMcuType, etSleepTime; | |||||
private Context mContext; | |||||
private String mAddress; | |||||
private BleSendCmdUtil mBleSendCmdUtil; | |||||
private BleDataUtils bleDataUtils; | |||||
private BleDevice mBleDevice; | |||||
private int type; | |||||
/** | |||||
* 是否暂停显示数据 | |||||
*/ | |||||
private boolean mPauseShowCmd=false; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_ble); | |||||
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); | |||||
mContext = this; | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
type = getIntent().getIntExtra("type", -1); | |||||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||||
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); | |||||
bleDataUtils = BleDataUtils.getInstance(); | |||||
findViewById(R.id.btnClear).setOnClickListener(this); | |||||
findViewById(R.id.btnPause).setOnClickListener(this); | |||||
findViewById(R.id.btnHandshake).setOnClickListener(this); | |||||
findViewById(R.id.btnVersion).setOnClickListener(this); | |||||
findViewById(R.id.btnBattery).setOnClickListener(this); | |||||
findViewById(R.id.btnTimeRead).setOnClickListener(this); | |||||
findViewById(R.id.btnTimeWrite).setOnClickListener(this); | |||||
findViewById(R.id.btnNameRead).setOnClickListener(this); | |||||
findViewById(R.id.btnMacRead).setOnClickListener(this); | |||||
findViewById(R.id.btnMacTypeRead).setOnClickListener(this); | |||||
findViewById(R.id.btnNameWrite).setOnClickListener(this); | |||||
findViewById(R.id.btnMacTypeWrite).setOnClickListener(this); | |||||
findViewById(R.id.btnDidWrite).setOnClickListener(this); | |||||
findViewById(R.id.btnDidRead).setOnClickListener(this); | |||||
findViewById(R.id.btnBroadcastTimeWrite).setOnClickListener(this); | |||||
findViewById(R.id.btnBroadcastTimeRead).setOnClickListener(this); | |||||
findViewById(R.id.btnBmRestart).setOnClickListener(this); | |||||
findViewById(R.id.btnBmReset).setOnClickListener(this); | |||||
findViewById(R.id.btnMcuType).setOnClickListener(this); | |||||
findViewById(R.id.btnUnits).setOnClickListener(this); | |||||
findViewById(R.id.btnSleepTimeWrite).setOnClickListener(this); | |||||
findViewById(R.id.btnSleepTimeRead).setOnClickListener(this); | |||||
findViewById(R.id.btn_start_ble).setOnClickListener(this); | |||||
etName = findViewById(R.id.etName); | |||||
etMacType = findViewById(R.id.etMacType); | |||||
etDid = findViewById(R.id.etDid); | |||||
etBroadcastTime = findViewById(R.id.etBroadcastTime); | |||||
etMcuType = findViewById(R.id.etMcuType); | |||||
etSleepTime = findViewById(R.id.etSleepTime); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
SendBleBean sendBleBean; | |||||
switch (v.getId()) { | |||||
case R.id.btnClear: | |||||
if (mList != null) | |||||
mList.clear(); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
break; | |||||
case R.id.btnPause: | |||||
mPauseShowCmd=!mPauseShowCmd; | |||||
break; | |||||
case R.id.btnHandshake: | |||||
if (mBleDevice != null) | |||||
mBleDevice.sendHandshake(); | |||||
break; | |||||
case R.id.btnVersion: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnBattery: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getMcuBatteryStatus()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnTimeRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getSysTime()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnTimeWrite: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setSysTime(bleDataUtils.getCurrentTime(), true)); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnNameRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBleName()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnMacRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBleMac()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnMacTypeRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBroadcastDataType()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnMacTypeWrite: | |||||
byte macType = Byte.valueOf(etMacType.getText().toString().trim()); | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setBroadcastDataType(macType)); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnNameWrite: | |||||
byte[] names = bleDataUtils.getBleName(etName.getText().toString().trim()); | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setBleName(names)); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnBroadcastTimeRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBleBroadcastTime()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnBroadcastTimeWrite: | |||||
int time = Integer.parseInt(etBroadcastTime.getText().toString().trim()); | |||||
byte[] broadcastTime = bleDataUtils.getBroadcastTime(time); | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setBleBroadcastTime(broadcastTime)); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnDidWrite: | |||||
String didStr = etDid.getText().toString().trim().toLowerCase(Locale.US); | |||||
if (didStr.contains(",")) { | |||||
String[] didStrS = didStr.split(","); | |||||
if (didStrS.length > 5) { | |||||
int cidS = Integer.parseInt(didStrS[0]); | |||||
int vidS = Integer.parseInt(didStrS[1]); | |||||
int pidS = Integer.parseInt(didStrS[2]); | |||||
int cid = Integer.parseInt(didStrS[3]); | |||||
int vid = Integer.parseInt(didStrS[4]); | |||||
int pid = Integer.parseInt(didStrS[5]); | |||||
byte[] did = bleDataUtils.getDid(cidS, vidS, pidS, cid, vid, pid); | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setDid(did)); | |||||
sendData(sendBleBean); | |||||
} | |||||
} | |||||
break; | |||||
case R.id.btnDidRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getDid()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnBmRestart: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setBleRestart()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnBmReset: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setBleReset()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnMcuType: | |||||
byte mode = (byte) Integer.parseInt(etMcuType.getText().toString().trim()); | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setPortI2cSpiMode(mode)); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btnUnits: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getSupportUnit()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
//写自动休眠 | |||||
case R.id.btnSleepTimeWrite: | |||||
String sleepStr = etSleepTime.getText().toString().trim().toLowerCase(Locale.US); | |||||
if (sleepStr.contains(",")) { | |||||
String[] didStrS = sleepStr.split(","); | |||||
if (didStrS.length > 3) { | |||||
int switchStatus = Integer.parseInt(didStrS[0]); | |||||
int toSleepTimeS = Integer.parseInt(didStrS[1]); | |||||
int sleepSwitchCmd = Integer.parseInt(didStrS[2]); | |||||
int broadcastTimeMS = Integer.parseInt(didStrS[3]); | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setNoConnectSleep(switchStatus, toSleepTimeS, sleepSwitchCmd, broadcastTimeMS)); | |||||
sendData(sendBleBean); | |||||
} | |||||
} | |||||
break; | |||||
case R.id.btnSleepTimeRead: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getNoConnectSleep()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
case R.id.btn_start_ble: | |||||
sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.setToWake()); | |||||
sendData(sendBleBean); | |||||
break; | |||||
} | |||||
} | |||||
private void sendData(SendBleBean sendBleBean) { | |||||
if (mBleDevice != null) { | |||||
mBleDevice.sendData(sendBleBean); | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
mList.add(TimeUtils.getTime() + "服务与界面建立连接成功"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
CallbackDisIm.getInstance().addListListener(this); | |||||
if (mBluetoothService != null) { | |||||
mBleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (mBleDevice == null) { | |||||
finish(); | |||||
BleLog.i(TAG, "mBleDevice==null"); | |||||
} | |||||
mBleDevice.setOnBleVersionListener(this); | |||||
// mBleDevice.setOnBleDeviceDataListener(this); | |||||
mBleDevice.setOnBleErrListener(this); | |||||
mBleDevice.setOnBleInfoListener(this); | |||||
mBleDevice.setOnMcuParameterListener(this); | |||||
mBleDevice.setOnBleSettingListener(this); | |||||
mBleDevice.setOnBleCompanyListener(this); | |||||
mBleDevice.setOnBleParameterListener(this); | |||||
mBleDevice.setOnBleHandshakeListener(this); | |||||
mBleDevice.setOnBleOtherDataListener(this); | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
mList.add(TimeUtils.getTime() + "服务与界面连接断开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
mHandler.postDelayed(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
finish(); | |||||
} | |||||
}, 3000); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
CallbackDisIm.getInstance().removeListener(this); | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
BleLog.i(TAG, "unbindService,断开连接"); | |||||
bleDevice.disconnect(); | |||||
} | |||||
} | |||||
//-----------------状态------------------- | |||||
@Override | |||||
public void onConnecting(@NonNull String mac) { | |||||
//TODO 连接中 | |||||
BleLog.i(TAG, "连接中"); | |||||
} | |||||
@Override | |||||
public void onDisConnected(@NonNull String mac, int code) { | |||||
//TODO 连接断开 | |||||
BleLog.i(TAG, "连接断开"); | |||||
if (mAddress.equals(mac)) { | |||||
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||||
finish(); | |||||
} | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(@NonNull String mac) { | |||||
//TODO 连接成功(获取服务成功) | |||||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
} | |||||
//--------------------------------- | |||||
@Override | |||||
public void onNotifyOtherData(byte[] data) { | |||||
if (mPauseShowCmd){ | |||||
return; | |||||
} | |||||
mList.add(TimeUtils.getTime() + "透传数据:" + BleStrUtils.byte2HexStr(data)); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onNotifyData(byte[] hex, int type) { | |||||
if (mPauseShowCmd){ | |||||
return; | |||||
} | |||||
String data = ""; | |||||
if (hex != null) | |||||
data = BleStrUtils.byte2HexStr(hex); | |||||
if (type == 100) { | |||||
mList.add(TimeUtils.getTime() + "send->" + data); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onHandshake(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 onSupportUnit(List<SupportUnitBean> list) { | |||||
StringBuilder unitStr = new StringBuilder(); | |||||
unitStr.append(TimeUtils.getTime()); | |||||
for (SupportUnitBean supportUnitBean : list) { | |||||
unitStr.append("单位类型:").append(supportUnitBean.getType()); | |||||
StringBuilder units = new StringBuilder(); | |||||
units.append("["); | |||||
for (Integer integer1 : supportUnitBean.getSupportUnit()) { | |||||
units.append(integer1).append(","); | |||||
} | |||||
units.append("]"); | |||||
unitStr.append("单位列表:").append(units); | |||||
unitStr.append("\n"); | |||||
} | |||||
mList.add(unitStr.toString()); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onMcuBatteryStatus(int status, int battery) { | |||||
mList.add(TimeUtils.getTime() + "电量:" + battery + "%" + "||状态:" + status); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onSysTime(int status, int[] times) { | |||||
String timeStr = times[0] + "-" + times[1] + "-" + times[2] + " " + times[3] + ":" + times[4] + ":" + times[5]; | |||||
mList.add(TimeUtils.getTime() + "时间:" + timeStr + "||是否有效:" + status); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onErr(int cmdType) { | |||||
mList.add(TimeUtils.getTime() + "错误:" + cmdType); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void OnSettingReturn(byte cmdType, byte cmdData) { | |||||
if (CmdConfig.SET_TO_SLEEP == cmdType && cmdData == CmdConfig.SETTING_SUCCESS) { | |||||
//进入睡眠 | |||||
} | |||||
mList.add(TimeUtils.getTime() + "设置指令:" + cmdType + "||结果:" + cmdData); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBleName(String name) { | |||||
mList.add(TimeUtils.getTime() + "名称:" + name); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBleMac(String mac) { | |||||
mList.add(TimeUtils.getTime() + "Mac:" + mac); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onNoConnectSleep(int sleepSwitch, int sleepTime, int sleepBroadcastSwitch, int sleepBroadcastTime) { | |||||
mList.add(TimeUtils.getTime() + "sleepSwitch:" + sleepSwitch + " ||sleepTime:" + sleepTime + " ||sleepBroadcastSwitch:" + sleepBroadcastSwitch + " ||sleepBroadcastTime:" + sleepBroadcastTime); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void OnDID(int cid, int vid, int pid) { | |||||
mList.add(TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBleBroadcastTime(int time) { | |||||
mList.add(TimeUtils.getTime() + "广播间隔:" + time); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onConnectTime(int time, int status, int timeOut) { | |||||
mList.add(TimeUtils.getTime() + "连接:time:" + time + "||status:" + status + "||timeOut:" + timeOut); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBlePower(int power) { | |||||
mList.add(TimeUtils.getTime() + "功率:" + power); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onPortRate(int rate) { | |||||
mList.add(TimeUtils.getTime() + "串口波特率:" + rate); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBroadcastDataType(int type) { | |||||
mList.add(TimeUtils.getTime() + "广播大小端:" + type); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onModuleUUID(int length, String serverUUID, String featureUUID1, String featureUUID2) { | |||||
mList.add(TimeUtils.getTime() + "UUID:length:" + length + "||serverUUID:" + serverUUID + "||featureUUID1:" + featureUUID1 + "||featureUUID2" + featureUUID2); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBleMode(int mode) { | |||||
mList.add(TimeUtils.getTime() + "模式:" + mode); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
BleLog.i(TAG, "onDestroy"); | |||||
} | |||||
} |
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; | import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseBleDeviceData; | ||||
import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; | import cn.net.aicare.modulelibrary.module.BloodGlucose.BloodGlucoseUtil; | ||||
public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackBle, BloodGlucoseBleDeviceData.BloodGlucoseCallback{ | |||||
public class BloodGlucoseActivity extends BleBaseActivity implements OnCallbackBle ,BloodGlucoseBleDeviceData.BloodGlucoseCallback{ | |||||
private Button support_unit, quest_status,showdata; | private Button support_unit, quest_status,showdata; | ||||
private RadioButton mmol, mg; | private RadioButton mmol, mg; |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
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.ListView; | |||||
import android.widget.TextView; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
import com.pingwang.bluetoothlib.config.BleConfig; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.UUID; | |||||
import androidx.annotation.Nullable; | |||||
import cn.net.aicare.modulelibrary.module.BloodOxygen.BroadcastBloodOxygenBleConfig; | |||||
import cn.net.aicare.modulelibrary.module.BloodOxygen.BroadcastBloodOxygenDeviceData; | |||||
/** | |||||
* xing<br> | |||||
* 2020/09/09<br> | |||||
* 广播血氧仪 | |||||
*/ | |||||
public class BroadcastBloodOxygenActivity extends BleBaseActivity implements OnCallbackDis, BroadcastBloodOxygenDeviceData.onNotifyData, OnScanFilterListener, View.OnClickListener { | |||||
private static String TAG = BroadcastBloodOxygenActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
private TextView tv_broadcast_blood_oxygen, tv_broadcast_mac; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private Context mContext; | |||||
private BroadcastBloodOxygenDeviceData mDevice; | |||||
private String mAddress = ""; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_broadcast_blood_oxygen); | |||||
mContext = this; | |||||
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); | |||||
findViewById(R.id.clear).setOnClickListener(this); | |||||
findViewById(R.id.open).setOnClickListener(this); | |||||
findViewById(R.id.stop).setOnClickListener(this); | |||||
tv_broadcast_blood_oxygen = findViewById(R.id.tv_broadcast_blood_oxygen); | |||||
tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
switch (v.getId()) { | |||||
case R.id.clear: | |||||
if (mList != null) | |||||
mList.clear(); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
break; | |||||
case R.id.open: | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.scanLeDevice(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||||
} | |||||
break; | |||||
case R.id.stop: | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.stopScan(); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
mDevice = BroadcastBloodOxygenDeviceData.getInstance(); | |||||
mDevice.setOnNotifyData(this); | |||||
mBluetoothService.setOnScanFilterListener(this); | |||||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST); | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
if (mDevice != null) { | |||||
mDevice.clear(); | |||||
mDevice = null; | |||||
} | |||||
} | |||||
//-----------------状态------------------- | |||||
@Override | |||||
public void bleOpen() { | |||||
mList.add(TimeUtils.getTime() + "蓝牙打开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
mList.add(TimeUtils.getTime() + "蓝牙关闭"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
public void getBloodOxygenData(int status, int bloodOxygen, int pulseRate, int plethysmogram, int power) { | |||||
String statusStr = "状态="; | |||||
switch (status) { | |||||
case BroadcastBloodOxygenBleConfig.START_TESTING: | |||||
statusStr += "开始测试"; | |||||
break; | |||||
case BroadcastBloodOxygenBleConfig.TESTING: | |||||
statusStr += "正在测试"; | |||||
break; | |||||
case BroadcastBloodOxygenBleConfig.STOP_TESTING: | |||||
statusStr += "测试完成"; | |||||
break; | |||||
} | |||||
String bloodOxygenStr = "--%"; | |||||
if (bloodOxygen != 0xFF) { | |||||
bloodOxygenStr = bloodOxygen + "%"; | |||||
} | |||||
String pulseRateStr = "--%"; | |||||
if (pulseRate != 0xFF) { | |||||
pulseRateStr = pulseRate + "%"; | |||||
} | |||||
String plethysmogramStr = BleDensityUtil.getInstance().holdDecimals(plethysmogram, 1); | |||||
String showData = TimeUtils.getTime(); | |||||
showData += statusStr; | |||||
showData += "\n血氧=" + bloodOxygenStr + ";脉率=" + pulseRateStr + ";PI=" + plethysmogramStr + ";电量=" + power + "%"; | |||||
tv_broadcast_blood_oxygen.setText(bloodOxygenStr); | |||||
mList.add(showData); | |||||
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 | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
BleLog.i(TAG, "onDestroy"); | |||||
} | |||||
@Override | |||||
public boolean onFilter(BleValueBean bleValueBean) { | |||||
return true; | |||||
} | |||||
@Override | |||||
public void onScanRecord(BleValueBean bleValueBean) { | |||||
if (TextUtils.isEmpty(mAddress) && bleValueBean.isBroadcastModule()) { | |||||
mAddress = bleValueBean.getMac(); | |||||
if (tv_broadcast_mac != null) { | |||||
tv_broadcast_mac.setText(mAddress); | |||||
} | |||||
} | |||||
//地址相同,并且是广播秤 | |||||
if (mAddress.equalsIgnoreCase(bleValueBean.getMac()) && bleValueBean.isBroadcastModule()) { | |||||
byte[] manufacturerData = bleValueBean.getManufacturerData(); | |||||
int cid = bleValueBean.getCid(); | |||||
int vid = bleValueBean.getVid(); | |||||
int pid = bleValueBean.getPid(); | |||||
if (mDevice != null) | |||||
mDevice.onNotifyData(manufacturerData, cid, vid, pid); | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
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.ListView; | |||||
import android.widget.RadioButton; | |||||
import android.widget.RadioGroup; | |||||
import android.widget.TextView; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
import com.pingwang.bluetoothlib.config.BleConfig; | |||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.UUID; | |||||
import androidx.annotation.Nullable; | |||||
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleBleConfig; | |||||
import cn.net.aicare.modulelibrary.module.BroadcastScale.BroadcastScaleDeviceData; | |||||
import cn.net.aicare.modulelibrary.module.babyscale.BabyBleConfig; | |||||
/** | |||||
* xing<br> | |||||
* 2020/08/10<br> | |||||
* 广播秤 | |||||
*/ | |||||
public class BroadcastScaleActivity extends BleBaseActivity implements OnCallbackDis, BroadcastScaleDeviceData.onNotifyData, OnScanFilterListener, View.OnClickListener, | |||||
RadioGroup.OnCheckedChangeListener { | |||||
private static String TAG = BroadcastScaleActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
private RadioButton mRadioButtonKg, mRadioButtonLb, mRadioButtonLbLb, mRadioButtonG, mRadioButtonOz, mRadioButtonStLb, mRadioButtonJin; | |||||
private TextView tv_broadcast_temp, tv_broadcast_mac; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private Context mContext; | |||||
private BroadcastScaleDeviceData mDevice; | |||||
private String mAddress = ""; | |||||
private BleSendCmdUtil mBleSendCmdUtil; | |||||
private int type = BroadcastScaleBleConfig.BROADCAST_SCALE; | |||||
private int mWeightUnit = 0; | |||||
private int mTemp; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_broadcast_scale); | |||||
mContext = this; | |||||
// mAddress = getIntent().getStringExtra("mac"); | |||||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||||
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); | |||||
findViewById(R.id.clear).setOnClickListener(this); | |||||
findViewById(R.id.open).setOnClickListener(this); | |||||
findViewById(R.id.stop).setOnClickListener(this); | |||||
((RadioGroup) findViewById(R.id.radio_weight)).setOnCheckedChangeListener(this); | |||||
tv_broadcast_temp = findViewById(R.id.tv_broadcast_temp); | |||||
mRadioButtonKg = findViewById(R.id.radio_weight_kg); | |||||
mRadioButtonJin = findViewById(R.id.radio_weight_jin); | |||||
mRadioButtonStLb = findViewById(R.id.radio_weight_st_lb); | |||||
mRadioButtonLb = findViewById(R.id.radio_weight_lb); | |||||
mRadioButtonOz = findViewById(R.id.radio_weight_oz); | |||||
mRadioButtonG = findViewById(R.id.radio_weight_g); | |||||
mRadioButtonLbLb = findViewById(R.id.radio_weight_lb_lb); | |||||
tv_broadcast_mac = findViewById(R.id.tv_broadcast_mac); | |||||
} | |||||
@Override | |||||
public void onCheckedChanged(RadioGroup group, int checkedId) { | |||||
if (checkedId == -1) | |||||
return;//不是人为点击不触发 | |||||
switch (group.getCheckedRadioButtonId()) { | |||||
case R.id.radio_weight_kg: | |||||
mWeightUnit = BabyBleConfig.BABY_KG; | |||||
break; | |||||
case R.id.radio_weight_jin: | |||||
mWeightUnit = BabyBleConfig.BABY_FG; | |||||
break; | |||||
case R.id.radio_weight_lb: | |||||
mWeightUnit = BabyBleConfig.BABY_LB; | |||||
break; | |||||
case R.id.radio_weight_oz: | |||||
mWeightUnit = BabyBleConfig.BABY_OZ; | |||||
break; | |||||
case R.id.radio_weight_st_lb: | |||||
mWeightUnit = BabyBleConfig.BABY_ST; | |||||
break; | |||||
case R.id.radio_weight_g: | |||||
mWeightUnit = BabyBleConfig.BABY_G; | |||||
break; | |||||
case R.id.radio_weight_lb_lb: | |||||
mWeightUnit = BabyBleConfig.BABY_LB_LB; | |||||
break; | |||||
} | |||||
BleLog.i(TAG, "weightUnit:" + mWeightUnit); | |||||
} | |||||
private void showWeightUnit(int unit) { | |||||
switch (unit) { | |||||
case BabyBleConfig.BABY_KG: | |||||
mRadioButtonKg.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_FG: | |||||
mRadioButtonJin.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_LB: | |||||
mRadioButtonLb.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_OZ: | |||||
mRadioButtonOz.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_ST: | |||||
mRadioButtonStLb.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_G: | |||||
mRadioButtonG.setChecked(true); | |||||
break; | |||||
case BabyBleConfig.BABY_LB_LB: | |||||
mRadioButtonLbLb.setChecked(true); | |||||
break; | |||||
} | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
switch (v.getId()) { | |||||
case R.id.clear: | |||||
if (mList != null) | |||||
mList.clear(); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
break; | |||||
case R.id.open: | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.scanLeDevice(0, UUID.fromString("0000F0A0-0000-1000-8000-00805F9B34FB")); | |||||
} | |||||
break; | |||||
case R.id.stop: | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.stopScan(); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
mDevice = BroadcastScaleDeviceData.getInstance(); | |||||
mDevice.setOnNotifyData(this); | |||||
mBluetoothService.setOnScanFilterListener(this); | |||||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_BROADCAST); | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
if (mDevice != null) { | |||||
mDevice.clear(); | |||||
mDevice = null; | |||||
} | |||||
} | |||||
//-----------------状态------------------- | |||||
@Override | |||||
public void bleOpen() { | |||||
mList.add(TimeUtils.getTime() + "蓝牙打开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
mList.add(TimeUtils.getTime() + "蓝牙关闭"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
public void onData(byte[] hex, int type) { | |||||
String data = ""; | |||||
if (hex != null) | |||||
data = BleStrUtils.byte2HexStr(hex); | |||||
if (type == 100) { | |||||
mList.add(TimeUtils.getTime() + "send->" + data); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void getWeightData(int status, int tempUnit, int weightUnit, int weightDecimal, int weightStatus, int weightNegative, int weight, int adc, int algorithmId, int tempNegative, int temp) { | |||||
String weightUnitStr = "kg"; | |||||
switch (weightUnit) { | |||||
case BroadcastScaleBleConfig.UNIT_KG: | |||||
weightUnitStr = "kg"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_FG: | |||||
weightUnitStr = "斤"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_LB: | |||||
weightUnitStr = "lb:oz"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_OZ: | |||||
weightUnitStr = "oz"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_ST: | |||||
weightUnitStr = "st:lb"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_G: | |||||
weightUnitStr = "g"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_LB_LB: | |||||
weightUnitStr = "LB"; | |||||
break; | |||||
} | |||||
String tempUnitStr = "℃";//℉ | |||||
switch (tempUnit) { | |||||
case BroadcastScaleBleConfig.UNIT_C: | |||||
tempUnitStr = "℃"; | |||||
break; | |||||
case BroadcastScaleBleConfig.UNIT_F: | |||||
tempUnitStr = "℉"; | |||||
break; | |||||
} | |||||
String statusStr = "状态="; | |||||
switch (status) { | |||||
case BroadcastScaleBleConfig.GET_WEIGHT_TESTING: | |||||
statusStr += "正在测量体重"; | |||||
break; | |||||
case BroadcastScaleBleConfig.GET_IMPEDANCE_TESTING: | |||||
statusStr += "测阻抗中"; | |||||
break; | |||||
case BroadcastScaleBleConfig.GET_IMPEDANCE_SUCCESS: | |||||
statusStr += "测阻抗成功"; | |||||
break; | |||||
case BroadcastScaleBleConfig.GET_IMPEDANCE_FAIL: | |||||
statusStr += "测阻抗失败"; | |||||
break; | |||||
case BroadcastScaleBleConfig.GET_TEST_FINISH: | |||||
statusStr += "测量完成"; | |||||
break; | |||||
} | |||||
String weightStr = BleDensityUtil.getInstance().holdDecimals(weight, 1); | |||||
if (weightNegative == 1) { | |||||
weightStr = "-" + weightStr; | |||||
} | |||||
String showData = TimeUtils.getTime(); | |||||
showData += statusStr; | |||||
if (weightStatus == 1) { | |||||
showData += "\n稳定体重=" + weightStr + ";小数位=" + weightDecimal + ";单位=" + weightUnit + ";" + weightUnitStr; | |||||
} else { | |||||
showData += "\n实时体重=" + weightStr + ";小数位=" + weightDecimal + ";单位=" + weightUnit + ";" + weightUnitStr; | |||||
} | |||||
showData += "\n阻抗=" + adc; | |||||
if (tempNegative == 1) { | |||||
showData += "\n温度=" + (-temp / 10F) + tempUnitStr; | |||||
} else { | |||||
showData += "\n温度=" + (temp / 10F) + tempUnitStr; | |||||
} | |||||
showData += "\n算法ID=" + algorithmId; | |||||
if (mWeightUnit != weightUnit) { | |||||
mWeightUnit = weightUnit; | |||||
showWeightUnit(mWeightUnit); | |||||
} | |||||
if (mTemp != temp) { | |||||
mTemp = temp; | |||||
tv_broadcast_temp.setText((mTemp / 10F) + tempUnitStr); | |||||
} | |||||
mList.add(showData); | |||||
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 | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
BleLog.i(TAG, "onDestroy"); | |||||
} | |||||
@Override | |||||
public boolean onFilter(BleValueBean bleValueBean) { | |||||
return true; | |||||
} | |||||
@Override | |||||
public void onScanRecord(BleValueBean bleValueBean) { | |||||
if (TextUtils.isEmpty(mAddress)&&bleValueBean.isBroadcastModule()) { | |||||
mAddress = bleValueBean.getMac(); | |||||
if (tv_broadcast_mac != null) { | |||||
tv_broadcast_mac.setText(mAddress); | |||||
} | |||||
} | |||||
//地址相同,并且是广播秤 | |||||
if (mAddress.equalsIgnoreCase(bleValueBean.getMac()) && bleValueBean.isBroadcastModule()) { | |||||
byte[] manufacturerData = bleValueBean.getManufacturerData(); | |||||
int cid = bleValueBean.getCid(); | |||||
int vid = bleValueBean.getVid(); | |||||
int pid = bleValueBean.getPid(); | |||||
if (mDevice != null) | |||||
mDevice.onNotifyData(manufacturerData, cid, vid, pid); | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.content.ComponentName; | |||||
import android.content.Context; | |||||
import android.content.Intent; | |||||
import android.content.ServiceConnection; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.IBinder; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.widget.AdapterView; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.Button; | |||||
import android.widget.ListView; | |||||
import android.widget.Toast; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
import com.pingwang.bluetoothlib.server.ELinkBleServer; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
/** | |||||
* xing<br> | |||||
* 2019/3/6<br> | |||||
* java类作用描述 | |||||
*/ | |||||
public class ConnectBleTestActivity extends AppCompatActivity implements OnCallbackBle { | |||||
private static String TAG = ConnectBleTestActivity.class.getName(); | |||||
private final int BIND_SERVER_OK = 1; | |||||
private final int BIND_SERVER_ERR = 2; | |||||
private final int REFRESH_LIST = 3; | |||||
private final int REFRESH_DATA = 4; | |||||
private List<String> mList; | |||||
private List<String> mListData; | |||||
private ArrayAdapter listAdapter; | |||||
private ArrayAdapter listDataAdapter; | |||||
private ELinkBleServer mBluetoothService; | |||||
/** | |||||
* 服务Intent | |||||
*/ | |||||
private Intent bindIntent; | |||||
private Context mContext; | |||||
private boolean mFilter = true; | |||||
private long mConnectTime = 0; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case BIND_SERVER_OK: | |||||
break; | |||||
case REFRESH_LIST: | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
case REFRESH_DATA: | |||||
listDataAdapter.notifyDataSetChanged(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_connect_ble_test); | |||||
Intent mUserService = new Intent(this.getApplicationContext(), ELinkBleServer.class); | |||||
//核心用户服务 | |||||
startService(mUserService); | |||||
mContext = this; | |||||
init(); | |||||
initData(); | |||||
} | |||||
private void initData() { | |||||
bindService(); | |||||
} | |||||
private void init() { | |||||
mList = new ArrayList<>(); | |||||
mListData = new ArrayList<>(); | |||||
ListView listView = findViewById(R.id.listview); | |||||
ListView listviewData = findViewById(R.id.listviewData); | |||||
Button btn = findViewById(R.id.btn); | |||||
Button btn1 = findViewById(R.id.btn1); | |||||
Button clear = findViewById(R.id.clear); | |||||
findViewById(R.id.clearData).setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
mListData.clear(); | |||||
listDataAdapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
final Button filter = findViewById(R.id.filter); | |||||
filter.setTag(true); | |||||
btn.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (mBluetoothService != null) { | |||||
BleLog.i(TAG, "搜索设备"); | |||||
mBluetoothService.scanLeDevice(30000); | |||||
mList.clear(); | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
} | |||||
}); | |||||
btn1.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.stopScan(); | |||||
mBluetoothService.disconnectAll(); | |||||
} | |||||
} | |||||
}); | |||||
clear.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (mBluetoothService != null) { | |||||
mList.clear(); | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
} | |||||
}); | |||||
filter.setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
boolean m = (Boolean) filter.getTag(); | |||||
filter.setTag(!m); | |||||
mFilter = !m; | |||||
filter.setText("过滤:" + mFilter); | |||||
} | |||||
}); | |||||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
listView.setAdapter(listAdapter); | |||||
listDataAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mListData); | |||||
listviewData.setAdapter(listDataAdapter); | |||||
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |||||
@Override | |||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |||||
String itemStr = mList.get(position); | |||||
String mac = itemStr.split("=")[0]; | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.stopScan(); | |||||
mBluetoothService.disconnectAll(); | |||||
mBluetoothService.connectDevice(mac); | |||||
mConnectTime = System.currentTimeMillis(); | |||||
showLoading(); | |||||
} | |||||
} | |||||
}); | |||||
findViewById(R.id.跳过).setOnClickListener(new View.OnClickListener() { | |||||
@Override | |||||
public void onClick(View v) { | |||||
Toast.makeText(mContext, "跳过", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
}); | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
private void bindService() { | |||||
BleLog.i(TAG, "绑定服务"); | |||||
if (bindIntent == null) { | |||||
bindIntent = new Intent(mContext, ELinkBleServer.class); | |||||
if (mFhrSCon != null) | |||||
this.bindService(bindIntent, mFhrSCon, Context.BIND_AUTO_CREATE); | |||||
} | |||||
} | |||||
private void unbindService() { | |||||
CallbackDisIm.getInstance().removeListener(this); | |||||
if (mFhrSCon != null) | |||||
this.unbindService(mFhrSCon); | |||||
bindIntent = null; | |||||
} | |||||
/** | |||||
* 服务连接与界面的连接 | |||||
*/ | |||||
private ServiceConnection mFhrSCon = new ServiceConnection() { | |||||
@Override | |||||
public void onServiceConnected(ComponentName name, IBinder service) { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
mBluetoothService = ((ELinkBleServer.BluetoothBinder) service).getService(); | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.setOnCallback(ConnectBleTestActivity.this); | |||||
mBluetoothService.setOnScanFilterListener(null); | |||||
mHandler.sendEmptyMessage(BIND_SERVER_OK); | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceDisconnected(ComponentName name) { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
}; | |||||
@Override | |||||
public void onStartScan() { | |||||
} | |||||
@Override | |||||
public void onScanning(@NonNull BleValueBean data) { | |||||
String mAddress = data.getMac(); | |||||
if (!mList.contains(mAddress + "=" + data.getName())) { | |||||
String data1 = BleStrUtils.byte2HexStr(data.getScanRecord()); | |||||
BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1); | |||||
mList.add(mAddress + "=" + data.getName()); | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
} | |||||
@Override | |||||
public void onConnecting(@NonNull String mac) { | |||||
} | |||||
@Override | |||||
public void onDisConnected(@NonNull String mac, int code) { | |||||
dismissLoading(); | |||||
Toast.makeText(mContext, "连接断开:" + code, Toast.LENGTH_SHORT).show(); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(@NonNull String mac) { | |||||
long time = System.currentTimeMillis() - mConnectTime; | |||||
dismissLoading(); | |||||
mListData.add(TimeUtils.getTime() + "连接成功获取服务成功:" + time); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
} | |||||
//--------------------------start Loading-------------------------- | |||||
private LoadingIosDialogFragment mDialogFragment; | |||||
/** | |||||
* 显示加载 | |||||
*/ | |||||
private void showLoading() { | |||||
if (mDialogFragment == null) | |||||
mDialogFragment = new LoadingIosDialogFragment(); | |||||
mDialogFragment.show(getSupportFragmentManager()); | |||||
} | |||||
/** | |||||
* 关闭加载 | |||||
*/ | |||||
private void dismissLoading() { | |||||
if (mDialogFragment != null) | |||||
mDialogFragment.dismiss(); | |||||
} | |||||
//--------------------------end Loading-------------------------- | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
unbindService(); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.os.Bundle; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.CompoundButton; | |||||
import android.widget.ListView; | |||||
import android.widget.RadioButton; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
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 androidx.annotation.Nullable; | |||||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyFatBleDeviceData; | |||||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyfatUtil; | |||||
public class EightBodyfatActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, EightBodyFatBleDeviceData.EightBodyFatCallback { | |||||
private List<String> loglist; | |||||
private ListView log_list; | |||||
private ArrayAdapter listAdapter; | |||||
private String mAddress; | |||||
private EightBodyFatBleDeviceData mEightBodyFatBleDeviceData; | |||||
private RadioButton kg, jing, stlb, lb, C, F; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_eight_body_fata); | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
init(); | |||||
loglist = new ArrayList<>(); | |||||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||||
log_list.setAdapter(listAdapter); | |||||
} | |||||
private void init() { | |||||
log_list = findViewById(R.id.log_list); | |||||
kg = findViewById(R.id.kg); | |||||
jing = findViewById(R.id.jin); | |||||
stlb = findViewById(R.id.st_lb); | |||||
lb = findViewById(R.id.lb); | |||||
C = findViewById(R.id.c); | |||||
F = findViewById(R.id.f); | |||||
findViewById(R.id.support_unit).setOnClickListener(this); | |||||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.setWeightUnit(EightBodyfatUtil.KG); | |||||
} | |||||
} | |||||
}); | |||||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.setWeightUnit(EightBodyfatUtil.JIN); | |||||
} | |||||
} | |||||
}); | |||||
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.setWeightUnit(EightBodyfatUtil.ST); | |||||
} | |||||
} | |||||
}); | |||||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.setWeightUnit(EightBodyfatUtil.LB); | |||||
} | |||||
} | |||||
}); | |||||
C.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.setTempUnit(EightBodyfatUtil.C); | |||||
} | |||||
} | |||||
}); | |||||
F.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.setTempUnit(EightBodyfatUtil.F); | |||||
} | |||||
} | |||||
}); | |||||
kg.setChecked(true); | |||||
C.setChecked(true); | |||||
} | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
loglist.add(0, "绑定服务成功"); | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.setOnCallback(this); | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
mEightBodyFatBleDeviceData = new EightBodyFatBleDeviceData(bleDevice); | |||||
mEightBodyFatBleDeviceData.setEightBodyFatCallback(this); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (v.getId() == R.id.support_unit) { | |||||
if (mEightBodyFatBleDeviceData != null) | |||||
mEightBodyFatBleDeviceData.getUnitList(); | |||||
} | |||||
} | |||||
@Override | |||||
public void onState(int type, int typeState, int result) { | |||||
switch (type) { | |||||
// case EightBodyfatUtil.WEIGHING: | |||||
// switch (typeState) { | |||||
// case EightBodyfatUtil.WEIGHT_REAL_TIME_WEIGH: | |||||
// loglist.add(0, "实时体重"); | |||||
// break; | |||||
// case EightBodyfatUtil.WEIGHT_STABILIZATION_WEIGHT: | |||||
// loglist.add(0, "稳定体重"); | |||||
// } | |||||
// break; | |||||
case EightBodyfatUtil.IMPEDANCE: | |||||
String adc = ""; | |||||
switch (typeState) { | |||||
case EightBodyfatUtil.IMPEDANCE_MEASUREMENT: | |||||
adc = "阻抗测量中"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_SUCCESS: | |||||
//阻抗测量成功 | |||||
adc = "阻抗测量成功"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_FAILED: | |||||
adc = "阻抗测量失败"; | |||||
//阻抗测量失败 | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_FINISH: | |||||
//阻抗测量完成 | |||||
adc = "阻抗测量完成"; | |||||
break; | |||||
} | |||||
switch (result) { | |||||
case EightBodyfatUtil.IMPEDANCE_FOOT: | |||||
adc = adc + "双脚阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_HAND: | |||||
adc = adc + "双手阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_BODY: | |||||
adc = adc + "躯干阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_L_HAND: | |||||
adc = adc + "左手阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_R_HAND: | |||||
adc = adc + "右手阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_L_FOOT: | |||||
adc = adc + "左脚阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_R_FOOT: | |||||
adc = adc + "右脚阻抗"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_L_BODY: | |||||
adc = adc + "左驱干"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_R_BODY: | |||||
adc = adc + "右躯干"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_R_HAND_L_FOOT: | |||||
adc = adc + "右手左脚"; | |||||
break; | |||||
case EightBodyfatUtil.IMPEDANCE_L_HAND_R_FOOT: | |||||
adc = adc + "左手右脚"; | |||||
break; | |||||
default: | |||||
} | |||||
loglist.add(0, adc); | |||||
break; | |||||
case EightBodyfatUtil.HEART_RATE: | |||||
switch (typeState) { | |||||
case EightBodyfatUtil.HEART_RATE_MEASUREMENT: | |||||
//心率测量完成 | |||||
loglist.add(0, "心率测量中"); | |||||
break; | |||||
case EightBodyfatUtil.HEART_RATE_SUCCESS: | |||||
loglist.add(0, "心率测量成功"); | |||||
//心率测量成功 | |||||
break; | |||||
case EightBodyfatUtil.HEART_RATE_FAILED: | |||||
loglist.add(0, "心率测量失败"); | |||||
//心率测量失败 | |||||
break; | |||||
} | |||||
break; | |||||
case EightBodyfatUtil.TEMP_MEASUREMENT: | |||||
loglist.add(0, "测量温度"); | |||||
break; | |||||
case EightBodyfatUtil.MEASUREMENT_END: | |||||
loglist.add(0, "测量完成"); | |||||
//测量完成 | |||||
break; | |||||
case EightBodyfatUtil.MUC_CALL_BACK_RESULT: | |||||
switch (typeState) { | |||||
case EightBodyfatUtil.APP_CMD_CALIBRATION: | |||||
//校验 | |||||
if (result == EightBodyfatUtil.SUCCESS) { | |||||
loglist.add(0, "校验成功"); | |||||
} else if (result == EightBodyfatUtil.FAILED) { | |||||
loglist.add(0, "校验失败"); | |||||
} else { | |||||
loglist.add(0, "校验中"); | |||||
} | |||||
break; | |||||
case EightBodyfatUtil.APP_CMD_TEMP_UNIT: | |||||
if (result == EightBodyfatUtil.SUCCESS) { | |||||
loglist.add(0, "切换温度成功"); | |||||
} else if (result == EightBodyfatUtil.FAILED) { | |||||
loglist.add(0, "切换温度失败"); | |||||
} else { | |||||
loglist.add(0, "切换温度中"); | |||||
} | |||||
//切换温度 | |||||
break; | |||||
case EightBodyfatUtil.APP_CMD_WEIGHT_UNIT: | |||||
if (result == EightBodyfatUtil.SUCCESS) { | |||||
loglist.add(0, "切换体重单位成功"); | |||||
} else if (result == EightBodyfatUtil.FAILED) { | |||||
loglist.add(0, "切换体重单位失败"); | |||||
} else { | |||||
loglist.add(0, "切换体重单位中"); | |||||
} | |||||
//切换温度 | |||||
break; | |||||
} | |||||
break; | |||||
case EightBodyfatUtil.ERROR_CODE: | |||||
loglist.add(0, "错误码" + typeState); | |||||
break; | |||||
} | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
@Override | |||||
public void onWeight(int state, float weight, int unit, int decimal) { | |||||
//测量状态 1实时体重 2稳定体重 | |||||
String stateStr = ""; | |||||
if (state == EightBodyfatUtil.WEIGHT_REAL_TIME_WEIGH) { | |||||
stateStr = "实时体重"; | |||||
} else if (state == EightBodyfatUtil.WEIGHT_STABILIZATION_WEIGHT) { | |||||
stateStr = "稳定体重"; | |||||
} | |||||
if (unit == EightBodyfatUtil.ST) { | |||||
loglist.add(0, "测量状态:" + state + stateStr + " 体重:" + EightBodyfatUtil.lbtostlb(weight) + " 体重单位:" + unit + " 小数点位" + decimal); | |||||
} else { | |||||
loglist.add(0, "测量状态:" + state + stateStr + " 体重:" + weight + " 体重单位:" + unit + " 小数点位" + decimal); | |||||
} | |||||
} | |||||
@Override | |||||
public void onImpedance(int adc, int part, int arithmetic) { | |||||
loglist.add(0, "阻抗:" + adc + " 部位: " + part + " 算法" + arithmetic); | |||||
} | |||||
@Override | |||||
public void onHeartRate(int heartRate) { | |||||
loglist.add(0, " 心率" + heartRate); | |||||
} | |||||
@Override | |||||
public void onTemp(int sign, float temp, int unit, int decimal) { | |||||
loglist.add(0, " 温度 正负" + sign + " 温度:" + temp + " 单位: " + unit + " 小数位" + decimal); | |||||
} | |||||
@Override | |||||
public void onVersion(String version) { | |||||
loglist.add(0, "当前版本:" + version); | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
@Override | |||||
public void onSupportUnit(List<SupportUnitBean> list) { | |||||
loglist.add(0, "支持单位:"); | |||||
for (SupportUnitBean supportUnitBean : list) { | |||||
loglist.add(0, supportUnitBean.toString()); | |||||
} | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
@Override | |||||
public void showData(String data) { | |||||
// loglist.add(0, data); | |||||
} | |||||
} |
import android.widget.EditText; | import android.widget.EditText; | ||||
import android.widget.ListView; | import android.widget.ListView; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
import com.pingwang.bluetoothlib.device.SendBleBean; | import com.pingwang.bluetoothlib.device.SendBleBean; | ||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | import cn.net.aicare.modulelibrary.module.height.HeightDeviceData; | ||||
/** | /** | ||||
* xing<br> | * xing<br> | ||||
* 2019/4/25<br> | * 2019/4/25<br> | ||||
* 显示数据 | * 显示数据 | ||||
*/ | */ | ||||
public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | public class HeightCmdActivity extends BleBaseActivity implements OnCallbackDis, | ||||
HeightDeviceData.onNotifyData, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||||
HeightDeviceData.onNotifyData, OnBleVersionListener , OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||||
private static String TAG = HeightCmdActivity.class.getName(); | private static String TAG = HeightCmdActivity.class.getName(); | ||||
private final int REFRESH_DATA = 3; | private final int REFRESH_DATA = 3; |
import android.widget.TextView; | import android.widget.TextView; | ||||
import com.pingwang.bluetoothlib.AILinkSDK; | import com.pingwang.bluetoothlib.AILinkSDK; | ||||
import com.pingwang.bluetoothlib.config.BleDeviceConfig; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||||
import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||
import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||
import androidx.core.app.ActivityCompat; | import androidx.core.app.ActivityCompat; | ||||
((TextView) findViewById(R.id.tv_app_version)).setText(version); | ((TextView) findViewById(R.id.tv_app_version)).setText(version); | ||||
init(); | init(); | ||||
initPermissions(); | initPermissions(); | ||||
SP.init(this); | |||||
} | } | ||||
private void init() { | private void init() { | ||||
Button btn_baby = findViewById(R.id.btn_baby); | Button btn_baby = findViewById(R.id.btn_baby); | ||||
Button btn_height = findViewById(R.id.btn_height); | Button btn_height = findViewById(R.id.btn_height); | ||||
Button btn_ble = findViewById(R.id.btn_ble); | Button btn_ble = findViewById(R.id.btn_ble); | ||||
findViewById(R.id.btn_ble_test).setOnClickListener(listener); | |||||
findViewById(R.id.btnConnectTest).setOnClickListener(listener); | |||||
findViewById(R.id.btn_ad_weight).setOnClickListener(listener); | findViewById(R.id.btn_ad_weight).setOnClickListener(listener); | ||||
findViewById(R.id.btn_bloodglucose).setOnClickListener(listener); | |||||
findViewById(R.id.btn_ble_weight).setOnClickListener(listener); | |||||
findViewById(R.id.btn_wifi_ble_tooth).setOnClickListener(listener); | |||||
findViewById(R.id.wifi_config).setOnClickListener(listener); | |||||
findViewById(R.id.eight_scale).setOnClickListener(listener); | |||||
findViewById(R.id.btn_ota).setOnClickListener(listener); | |||||
findViewById(R.id.btn_wristband).setOnClickListener(listener); | |||||
findViewById(R.id.glucometer).setOnClickListener(listener); | |||||
findViewById(R.id.btn_broadcast_scale).setOnClickListener(listener); | |||||
findViewById(R.id.btn_broadcast_blood_oxygen).setOnClickListener(listener); | |||||
findViewById(R.id.btn_smart_mask).setOnClickListener(listener); | |||||
findViewById(R.id.btn_transmission).setOnClickListener(listener); | |||||
btn_shpy.setOnClickListener(listener); | btn_shpy.setOnClickListener(listener); | ||||
btn_tempgun.setOnClickListener(listener); | btn_tempgun.setOnClickListener(listener); | ||||
btn_temp.setOnClickListener(listener); | btn_temp.setOnClickListener(listener); | ||||
btn_baby.setOnClickListener(listener); | btn_baby.setOnClickListener(listener); | ||||
btn_height.setOnClickListener(listener); | btn_height.setOnClickListener(listener); | ||||
btn_ble.setOnClickListener(listener); | btn_ble.setOnClickListener(listener); | ||||
findViewById(R.id.btn_wifi_ble_weight).setOnClickListener(listener); | findViewById(R.id.btn_wifi_ble_weight).setOnClickListener(listener); | ||||
findViewById(R.id.btn_baby_body_fat).setOnClickListener(listener); | |||||
} | } | ||||
private class MyListener implements View.OnClickListener { | private class MyListener implements View.OnClickListener { | ||||
case R.id.btn_height: | case R.id.btn_height: | ||||
type = BleDeviceConfig.HEIGHT_METER; | type = BleDeviceConfig.HEIGHT_METER; | ||||
break; | break; | ||||
case R.id.btn_ad_weight: | case R.id.btn_ad_weight: | ||||
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; | type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD; | ||||
break; | break; | ||||
case R.id.btn_wifi_ble_weight: | case R.id.btn_wifi_ble_weight: | ||||
type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE; | type = BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE; | ||||
break; | break; | ||||
case R.id.btn_bloodglucose: | |||||
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; | type = BleDeviceConfig.BLOOD_GLUCOSE; | ||||
break; | break; | ||||
case R.id.btn_baby_body_fat: | |||||
type = BleDeviceConfig.BABY_BODY_FAT; | |||||
break; | |||||
case R.id.btn_broadcast_scale: | |||||
Intent intentBroadcast = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastScaleActivity.class); | |||||
startActivity(intentBroadcast); | |||||
return; | |||||
case R.id.btn_broadcast_blood_oxygen: | |||||
Intent intentBloodOxygen = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BroadcastBloodOxygenActivity.class); | |||||
startActivity(intentBloodOxygen); | |||||
return; | |||||
case R.id.btn_smart_mask: | |||||
type = BleDeviceConfig.SMART_MASK; | |||||
break; | |||||
case R.id.btn_ble: | case R.id.btn_ble: | ||||
type = 0; | |||||
type = -1; | |||||
break; | break; | ||||
case R.id.btn_ble_test: | |||||
type = -2; | |||||
break; | |||||
case R.id.btn_ota: | |||||
type = -3; | |||||
break; | |||||
case R.id.btn_wristband: | |||||
type = 65536; | |||||
break; | |||||
case R.id.btn_transmission: | |||||
type=-4; | |||||
break; | |||||
case R.id.eight_scale: | |||||
type = BleDeviceConfig.EIGHT_BODY_FAT_SCALE; | |||||
break; | |||||
case R.id.btnConnectTest: | |||||
Intent intent = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ConnectBleTestActivity.class); | |||||
startActivity(intent); | |||||
return; | |||||
case R.id.wifi_config: | |||||
Intent intent1 = new Intent(MainActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.WifiConfigActivity.class); | |||||
startActivity(intent1); | |||||
return; | |||||
} | } | ||||
*/ | */ | ||||
private void initPermissions() { | private void initPermissions() { | ||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | ||||
// ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); | |||||
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); | |||||
ActivityCompat | |||||
.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_MULTICAST_STATE, Manifest.permission.ACCESS_WIFI_STATE, | |||||
Manifest.permission.CHANGE_WIFI_STATE}, 1); | |||||
} | } | ||||
} | } | ||||
@Override | @Override | ||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | |||||
@NonNull int[] grantResults) { | |||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { | |||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||||
if (requestCode != 1) { | if (requestCode != 1) { | ||||
return; | return; | ||||
} else { | } else { | ||||
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | ||||
//权限请求失败,但未选中“不再提示”选项 | //权限请求失败,但未选中“不再提示”选项 | ||||
new AlertDialog.Builder(this).setTitle("提示") | |||||
.setMessage("请求使用定位权限搜索蓝牙设备") | |||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//引导用户至设置页手动授权 | |||||
Intent intent = | |||||
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
Uri uri = Uri.fromParts("package", | |||||
getApplicationContext().getPackageName(), null); | |||||
intent.setData(uri); | |||||
startActivity(intent); | |||||
} | |||||
}) | |||||
.setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
if (dialog != null) { | |||||
dialog.cancel(); | |||||
} | |||||
} | |||||
}) | |||||
.show(); | |||||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//引导用户至设置页手动授权 | |||||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||||
intent.setData(uri); | |||||
startActivity(intent); | |||||
} | |||||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
if (dialog != null) { | |||||
dialog.cancel(); | |||||
} | |||||
} | |||||
}).show(); | |||||
} else { | } else { | ||||
//权限请求失败,选中“不再提示”选项 | //权限请求失败,选中“不再提示”选项 | ||||
// T.showShort(MainActivity.this, "获取权限失败"); | // T.showShort(MainActivity.this, "获取权限失败"); | ||||
new AlertDialog.Builder(this).setTitle("提示") | |||||
.setMessage("请求使用定位权限搜索蓝牙设备") | |||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//引导用户至设置页手动授权 | |||||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||||
intent.setData(uri); | |||||
startActivity(intent); | |||||
} | |||||
}) | |||||
.setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
if (dialog != null) { | |||||
dialog.cancel(); | |||||
} | |||||
} | |||||
}) | |||||
.show(); | |||||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备").setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//引导用户至设置页手动授权 | |||||
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); | |||||
intent.setData(uri); | |||||
startActivity(intent); | |||||
} | |||||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
if (dialog != null) { | |||||
dialog.cancel(); | |||||
} | |||||
} | |||||
}).show(); | |||||
} | } | ||||
} | } | ||||
private void startActivity(int tyep) { | private void startActivity(int tyep) { | ||||
Intent intent = new Intent(this, ShowBleActivity.class); | |||||
Intent intent = new Intent(this, aicare.net.cn.sdk.ailinksdkdemoandroid.ShowBleActivity.class); | |||||
intent.putExtra("type", tyep); | intent.putExtra("type", tyep); | ||||
startActivity(intent); | startActivity(intent); | ||||
} | } | ||||
super.onDestroy(); | super.onDestroy(); | ||||
BleLog.quit(); | BleLog.quit(); | ||||
} | } | ||||
} | } |
import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
import com.pingwang.bluetoothlib.config.BleConfig; | import com.pingwang.bluetoothlib.config.BleConfig; | ||||
import com.pingwang.bluetoothlib.config.BleDeviceConfig; | |||||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | import com.pingwang.bluetoothlib.listener.CallbackDisIm; | ||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.UUID; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment; | |||||
import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||
import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
import androidx.appcompat.app.AppCompatActivity; | import androidx.appcompat.app.AppCompatActivity; | ||||
//核心用户服务 | //核心用户服务 | ||||
startService(mUserService); | startService(mUserService); | ||||
mContext = this; | mContext = this; | ||||
mType = getIntent().getIntExtra("type", -1); | |||||
if (-1 == mType) { | |||||
mType = getIntent().getIntExtra("type", 0); | |||||
if (0 == mType) { | |||||
finish(); | finish(); | ||||
return; | return; | ||||
} | } | ||||
public void onClick(View v) { | public void onClick(View v) { | ||||
if (mBluetoothService != null) { | if (mBluetoothService != null) { | ||||
BleLog.i(TAG, "搜索设备"); | BleLog.i(TAG, "搜索设备"); | ||||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER); | |||||
if (mType == -3) { | |||||
mBluetoothService.scanLeDevice(0); | |||||
} else { | |||||
if (mFilter) | |||||
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB")); | |||||
else | |||||
mBluetoothService.scanLeDevice(0); | |||||
} | |||||
mList.clear(); | mList.clear(); | ||||
listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
} | } | ||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | ||||
String itemStr = mList.get(position); | String itemStr = mList.get(position); | ||||
String mac = itemStr.split("=")[0]; | String mac = itemStr.split("=")[0]; | ||||
if (mBluetoothService != null) { | |||||
mBluetoothService.stopScan(); | |||||
mBluetoothService.connectDevice(mac); | |||||
showLoading(); | |||||
if (BleDeviceConfig.TOOTHBRUSH_WIFI_BLE==mType){ | |||||
Intent intent=new Intent(); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ToothBrushWifiBleActivity.class); | |||||
intent.putExtra("type", mType); | |||||
intent.putExtra("mac", mac); | |||||
startActivity(intent); | |||||
finish(); | |||||
}else { | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.stopScan(); | |||||
mBluetoothService.connectDevice(mac); | |||||
showLoading(); | |||||
} | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
private void unbindService() { | private void unbindService() { | ||||
if (mBluetoothService != null) | |||||
mBluetoothService.stopForeground();//停止前台服务 | |||||
CallbackDisIm.getInstance().removeListener(this); | CallbackDisIm.getInstance().removeListener(this); | ||||
if (mFhrSCon != null) | |||||
if (mFhrSCon != null) { | |||||
BleLog.i(TAG, "解绑服务"); | |||||
this.unbindService(mFhrSCon); | this.unbindService(mFhrSCon); | ||||
} | |||||
bindIntent = null; | bindIntent = null; | ||||
} | } | ||||
if (mBluetoothService != null) { | if (mBluetoothService != null) { | ||||
mBluetoothService.setOnCallback(ShowBleActivity.this); | mBluetoothService.setOnCallback(ShowBleActivity.this); | ||||
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this); | mBluetoothService.setOnScanFilterListener(ShowBleActivity.this); | ||||
mBluetoothService.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class); | |||||
mBluetoothService.startForeground();//启动前台服务 | |||||
mHandler.sendEmptyMessage(BIND_SERVER_OK); | mHandler.sendEmptyMessage(BIND_SERVER_OK); | ||||
} | } | ||||
} | } | ||||
@Override | @Override | ||||
public void onScanning(@NonNull BleValueBean data) { | public void onScanning(@NonNull BleValueBean data) { | ||||
String mAddress = data.getMac(); | String mAddress = data.getMac(); | ||||
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); | |||||
if (!mList.contains(mAddress + "=" + data.getName())) { | if (!mList.contains(mAddress + "=" + data.getName())) { | ||||
String data1 = BleStrUtils.byte2HexStr(data.getScanRecord()); | String data1 = BleStrUtils.byte2HexStr(data.getScanRecord()); | ||||
BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1); | |||||
String data2 = BleStrUtils.byte2HexStr(data.getManufacturerData()); | |||||
BleLog.i(TAG, "设备地址+广播数据:" + mAddress + "||" + data1 + "||" + data2); | |||||
mList.add(mAddress + "=" + data.getName()); | mList.add(mAddress + "=" + data.getName()); | ||||
listAdapter.notifyDataSetChanged(); | listAdapter.notifyDataSetChanged(); | ||||
} | } | ||||
} | } | ||||
@Override | @Override | ||||
public void onConnecting(@NonNull String mac) { | public void onConnecting(@NonNull String mac) { | ||||
int type = mType;//默认婴儿秤 | int type = mType;//默认婴儿秤 | ||||
switch (type) { | switch (type) { | ||||
case BleDeviceConfig.BABY_SCALE: | case BleDeviceConfig.BABY_SCALE: | ||||
intent.setClass(ShowBleActivity.this, BabyCmdActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BabyCmdActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.INFRARED_THERMOMETER: | case BleDeviceConfig.INFRARED_THERMOMETER: | ||||
intent.setClass(ShowBleActivity.this, TempGunCmdActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TempGunCmdActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.BLOOD_PRESSURE: | case BleDeviceConfig.BLOOD_PRESSURE: | ||||
intent.setClass(ShowBleActivity.this, SphyCmdActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.SphyCmdActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.THERMOMETER: | case BleDeviceConfig.THERMOMETER: | ||||
intent.setClass(ShowBleActivity.this, TempCmdActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TempCmdActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.HEIGHT_METER: | case BleDeviceConfig.HEIGHT_METER: | ||||
intent.setClass(ShowBleActivity.this, HeightCmdActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.HeightCmdActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE: | case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE: | ||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleBle.class); | |||||
break; | break; | ||||
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD: | case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_AD: | ||||
intent.setClass(ShowBleActivity.this, ADWeightScaleCmdActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ADWeightScaleCmdActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE: | case BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE: | ||||
intent.setClass(ShowBleActivity.this,WeightScaleWifiBle.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.WeightScaleWifiBle.class); | |||||
break; | |||||
case BleDeviceConfig.TOOTHBRUSH_WIFI_BLE: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.ToothBrushWifiBleActivity.class); | |||||
break; | |||||
case BleDeviceConfig.EIGHT_BODY_FAT_SCALE: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.EightBodyfatActivity.class); | |||||
break; | break; | ||||
case BleDeviceConfig.BLOOD_GLUCOSE: | case BleDeviceConfig.BLOOD_GLUCOSE: | ||||
intent.setClass(ShowBleActivity.this,BloodGlucoseActivity.class); | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BloodGlucoseActivity.class); | |||||
break; | break; | ||||
case 0: | |||||
intent.setClass(ShowBleActivity.this, BleCmdActivityDataData.class); | |||||
case BleDeviceConfig.BABY_BODY_FAT: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BabyBodyFatCmdActivity.class); | |||||
break; | |||||
case BleDeviceConfig.SMART_MASK: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.SmartMaskActivity.class); | |||||
break; | |||||
case -1: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.BleCmdActivity.class); | |||||
break; | |||||
case -2: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TestCmdActivity.class); | |||||
break; | |||||
case -3: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TestOtaActivity.class); | |||||
break; | |||||
case -4: | |||||
intent.setClass(ShowBleActivity.this, aicare.net.cn.sdk.ailinksdkdemoandroid.TransmissionActivity.class); | |||||
break; | break; | ||||
} | } | ||||
intent.putExtra("type", type); | intent.putExtra("type", type); | ||||
intent.putExtra("mac", mac); | intent.putExtra("mac", mac); | ||||
startActivity(intent); | startActivity(intent); | ||||
@Override | @Override | ||||
public boolean onFilter(BleValueBean bleValueBean) { | public boolean onFilter(BleValueBean bleValueBean) { | ||||
byte[] CID = bleValueBean.getCID(); | |||||
int cid = ((CID[0] & 0xff) << 8) + (CID[1]); | |||||
int cid = bleValueBean.getCid(); | |||||
BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType); | BleLog.i(TAG, "绑定设备广播类型:" + cid + "||添加的类型:" + mType); | ||||
if (mType == 0 || mType == 100) | |||||
if (mType < 0 || mType > 0xFF) | |||||
return true; | return true; | ||||
else | else | ||||
return mType == cid; | return mType == cid; | ||||
// byte[] CID = new byte[2]; | |||||
// CID[0] = 0x0a; | |||||
// CID[1] = 0x45; | |||||
// byte[] data = bleValueBean.getScanRecord(); | |||||
// byte[] datas=new byte[13]; | |||||
// BleLog.i(TAG, "原始数据1:"+BleStrUtils.byte2HexStr(data)); | |||||
// System.arraycopy(data,9,datas,0,datas.length); | |||||
// byte size=0; | |||||
// for (int i = 1; i < datas.length-2; i++) { | |||||
// size+=datas[i]; | |||||
// } | |||||
// | |||||
// BleLog.i(TAG, "校验和:"+BleStrUtils.getHexString((size&0xff)).toUpperCase()); | |||||
// BleLog.i(TAG, "原始数据2:"+BleStrUtils.byte2HexStr(datas).toUpperCase()); | |||||
// byte[] dataEncrypt=new byte[datas.length-4]; | |||||
// System.arraycopy(datas,2,dataEncrypt,0,dataEncrypt.length); | |||||
// byte[] newData = AiLinkBleCheckUtil.mcuEncrypt(CID, dataEncrypt, bleValueBean.getMac()); | |||||
// BleLog.i(TAG,"解密:"+BleStrUtils.byte2HexStr(newData).toUpperCase()); | |||||
// return false; | |||||
} | } | ||||
@Override | @Override |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.Button; | |||||
import android.widget.ListView; | |||||
import android.widget.Toast; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | |||||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||||
import com.pingwang.bluetoothlib.listener.OnBleVersionListener; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
import com.pingwang.bluetoothlib.listener.OnScanFilterListener; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import butterknife.BindView; | |||||
import butterknife.ButterKnife; | |||||
import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskBleConfig; | |||||
import cn.net.aicare.modulelibrary.module.SmartMask.SmartMaskDeviceData; | |||||
/** | |||||
* xing<br> | |||||
* 2020/09/15<br> | |||||
* 智能口罩 | |||||
*/ | |||||
public class SmartMaskActivity extends BleBaseActivity implements OnCallbackDis, SmartMaskDeviceData.onNotifyData, OnBleVersionListener, OnScanFilterListener, View.OnClickListener { | |||||
private static String TAG = SmartMaskActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
@BindView(R.id.clear) | |||||
Button mClear; | |||||
@BindView(R.id.set_status) | |||||
Button mSetStatus; | |||||
@BindView(R.id.set_filter) | |||||
Button mSetFilter; | |||||
@BindView(R.id.set_fan) | |||||
Button mSetFan; | |||||
@BindView(R.id.listview) | |||||
ListView mListview; | |||||
@BindView(R.id.get_version) | |||||
Button mGetVersion; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private Context mContext; | |||||
private SmartMaskDeviceData mDevice; | |||||
private String mAddress = ""; | |||||
private BleSendCmdUtil mBleSendCmdUtil; | |||||
private int type = SmartMaskBleConfig.SMART_MASK; | |||||
private int mFanStatus = 0; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_smart_mask); | |||||
ButterKnife.bind(this); | |||||
mContext = this; | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
type = getIntent().getIntExtra("type", -1); | |||||
mBleSendCmdUtil = BleSendCmdUtil.getInstance(); | |||||
init(); | |||||
} | |||||
private void init() { | |||||
mList = new ArrayList<>(); | |||||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
mListview.setAdapter(listAdapter); | |||||
mClear.setOnClickListener(this); | |||||
mSetStatus.setOnClickListener(this); | |||||
mSetFilter.setOnClickListener(this); | |||||
mSetFan.setOnClickListener(this); | |||||
mGetVersion.setOnClickListener(this); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
switch (v.getId()) { | |||||
case R.id.clear: | |||||
if (mList != null) | |||||
mList.clear(); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
break; | |||||
case R.id.get_version: | |||||
if (mDevice != null) { | |||||
SendBleBean sendBleBean = new SendBleBean(); | |||||
sendBleBean.setHex(mBleSendCmdUtil.getBleVersion()); | |||||
mDevice.sendData(sendBleBean); | |||||
} | |||||
break; | |||||
case R.id.set_status: | |||||
if (mDevice != null) { | |||||
mDevice.setStatus(); | |||||
} | |||||
break; | |||||
case R.id.set_filter: | |||||
if (mDevice != null) { | |||||
mDevice.setReplaceFilter(); | |||||
} | |||||
break; | |||||
case R.id.set_fan: | |||||
if (mDevice != null) { | |||||
if (mFanStatus < 2) { | |||||
mFanStatus++; | |||||
} else if (mFanStatus == 2) { | |||||
mFanStatus = 0; | |||||
} | |||||
mDevice.setFanStatus(mFanStatus); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
mDevice = SmartMaskDeviceData.getInstance(bleDevice); | |||||
mDevice.setOnNotifyData(this); | |||||
mDevice.setOnBleVersionListener(this); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
if (mDevice != null) { | |||||
mDevice.disconnect(); | |||||
mDevice.clear(); | |||||
mDevice = null; | |||||
} | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
public void onData(byte[] hex, int type) { | |||||
String data = ""; | |||||
if (hex != null) | |||||
data = BleStrUtils.byte2HexStr(hex); | |||||
if (type == 100) { | |||||
mList.add(TimeUtils.getTime() + "send->" + data); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onConnecting(@NonNull String mac) { | |||||
//TODO 连接中 | |||||
BleLog.i(TAG, "连接中"); | |||||
} | |||||
@Override | |||||
public void onDisConnected(@NonNull String mac, int code) { | |||||
//TODO 连接断开 | |||||
BleLog.i(TAG, "连接断开"); | |||||
finish(); | |||||
Toast.makeText(mContext, "连接断开", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(@NonNull String mac) { | |||||
//TODO 连接成功(获取服务成功) | |||||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
public void onStatus(int airIndex, int fanStatus, int power, int powerStatus, int batteryRemaining, int breathRate, int breathState, int filterDuration) { | |||||
String data = "口罩状态:"; | |||||
String fanStatusStr = "风扇状态:"; | |||||
switch (fanStatus) { | |||||
case 0: | |||||
fanStatusStr += "关闭"; | |||||
break; | |||||
case 1: | |||||
fanStatusStr += "1 档"; | |||||
break; | |||||
case 2: | |||||
fanStatusStr += "2 档"; | |||||
break; | |||||
} | |||||
String powerStatusStr = "电池状态:"; | |||||
switch (powerStatus) { | |||||
case 0: | |||||
powerStatusStr += "充电"; | |||||
break; | |||||
case 1: | |||||
powerStatusStr += "非充电"; | |||||
break; | |||||
} | |||||
String breathStateStr = "呼吸状态:"; | |||||
switch (breathState) { | |||||
case 1: | |||||
breathStateStr += "呼气"; | |||||
break; | |||||
case 2: | |||||
breathStateStr += "吸气"; | |||||
break; | |||||
} | |||||
data += "空气指数:" + airIndex + ";" + fanStatusStr + "\n"; | |||||
data += "电量:" + power + "%;" + powerStatusStr + "\n"; | |||||
data += "呼吸频率:" + breathRate + "次/min;" + breathStateStr + "\n"; | |||||
data += "电池续航:" + batteryRemaining + "min;滤网的总工作时长:" + filterDuration; | |||||
mList.add(TimeUtils.getTime() + data); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onFilter(int status) { | |||||
String data = "更换滤网:"; | |||||
switch (status) { | |||||
case 0: | |||||
data += "成功"; | |||||
break; | |||||
case 1: | |||||
data += "失败"; | |||||
break; | |||||
} | |||||
mList.add(TimeUtils.getTime() + data); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onFan(int status) { | |||||
String data = ""; | |||||
switch (status) { | |||||
case 0: | |||||
data = "关闭风扇"; | |||||
break; | |||||
case 1: | |||||
data = "1 档风扇"; | |||||
break; | |||||
case 2: | |||||
data = "2 档风扇"; | |||||
break; | |||||
} | |||||
mList.add(TimeUtils.getTime() + data); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onBmVersion(String version) { | |||||
mList.add(TimeUtils.getTime() + "版本号:" + version); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
BleLog.i(TAG, "onDestroy"); | |||||
} | |||||
} |
import android.widget.EditText; | import android.widget.EditText; | ||||
import android.widget.ListView; | import android.widget.ListView; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.config.CmdConfig; | import com.pingwang.bluetoothlib.config.CmdConfig; | ||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||
import androidx.annotation.Nullable; | import androidx.annotation.Nullable; | ||||
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyBleConfig; | |||||
import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyDeviceData; | import cn.net.aicare.modulelibrary.module.sphygmomanometer.SphyDeviceData; | ||||
btn_set_unit.setOnClickListener(new View.OnClickListener() { | btn_set_unit.setOnClickListener(new View.OnClickListener() { | ||||
@Override | @Override | ||||
public void onClick(View v) { | public void onClick(View v) { | ||||
if (unit == 0) { | |||||
mBleDevice.setUnit((byte) 1); | |||||
unit = 1; | |||||
if (unit == SphyBleConfig.SPHY_UNIT_MMHG) { | |||||
unit = SphyBleConfig.SPHY_UNIT_KPA; | |||||
mBleDevice.setUnit(unit); | |||||
} else { | } else { | ||||
mBleDevice.setUnit((byte) 0); | |||||
unit = 0; | |||||
unit = SphyBleConfig.SPHY_UNIT_MMHG; | |||||
mBleDevice.setUnit(unit); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
@Override | @Override | ||||
public void onDisConnected(@NonNull String mac, int code) { | public void onDisConnected(@NonNull String mac, int code) { | ||||
//TODO 连接断开 | //TODO 连接断开 | ||||
if (mAddress.equals(mac)) | |||||
if (mAddress.equals(mac)){ | |||||
BleLog.i(TAG, "连接断开"); | BleLog.i(TAG, "连接断开"); | ||||
finish(); | |||||
} | |||||
} | } | ||||
@Override | @Override | ||||
@Override | @Override | ||||
public void bleClose() { | public void bleClose() { | ||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | BleLog.i(TAG, "蓝牙未开启,可请求开启"); | ||||
finish(); | |||||
} | } | ||||
import android.widget.EditText; | import android.widget.EditText; | ||||
import android.widget.ListView; | import android.widget.ListView; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
import com.pingwang.bluetoothlib.device.SendBleBean; | import com.pingwang.bluetoothlib.device.SendBleBean; | ||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; |
import android.widget.ListView; | import android.widget.ListView; | ||||
import android.widget.Toast; | import android.widget.Toast; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
import com.pingwang.bluetoothlib.device.SendBleBean; | import com.pingwang.bluetoothlib.device.SendBleBean; | ||||
import com.pingwang.bluetoothlib.utils.BleDensityUtil; | import com.pingwang.bluetoothlib.utils.BleDensityUtil; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData; | import cn.net.aicare.modulelibrary.module.foreheadgun.TempGunDeviceData; | ||||
/** | /** | ||||
* xing<br> | * xing<br> | ||||
* 2019/4/25<br> | * 2019/4/25<br> | ||||
* 显示数据 | * 显示数据 | ||||
*/ | */ | ||||
public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleVersionListener, TempGunDeviceData.onNotifyData , OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener { | |||||
public class TempGunCmdActivity extends BleBaseActivity implements OnCallbackDis, | |||||
OnBleVersionListener, TempGunDeviceData.onNotifyData , OnBleCompanyListener, OnMcuParameterListener, View.OnClickListener { | |||||
private static String TAG = TempGunCmdActivity.class.getName(); | private static String TAG = TempGunCmdActivity.class.getName(); | ||||
private final int REFRESH_DATA = 3; | private final int REFRESH_DATA = 3; |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.content.Context; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.Button; | |||||
import android.widget.EditText; | |||||
import android.widget.ListView; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.config.BleConfig; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.device.SendDataBean; | |||||
import com.pingwang.bluetoothlib.listener.CallbackDisIm; | |||||
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackDis; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
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 androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
/** | |||||
* xing<br> | |||||
* 2019/4/25<br> | |||||
* 显示数据 | |||||
*/ | |||||
public class TestCmdActivity extends BleBaseActivity implements OnCallbackDis, OnBleDeviceDataListener, | |||||
View.OnClickListener { | |||||
private static String TAG = TestCmdActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
private final int SEND_DATA = 4; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private Context mContext; | |||||
private EditText et_cmd, et_uuid, et_uuid_server, et_time, et_notify; | |||||
private BleDevice bleDevice; | |||||
private String mAddress; | |||||
private int sendTime = 1000; | |||||
private UUID sendUuid = null; | |||||
private UUID sendUuidServer = null; | |||||
private String uuidEnd = "-0000-1000-8000-00805F9B34FB"; | |||||
private String sendCmd; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
case SEND_DATA: | |||||
if (sendUuid != null && sendUuidServer != null) { | |||||
SendDataBean sendDataBean = new SendDataBean(sendCmd.getBytes(), sendUuid | |||||
, BleConfig.WRITE_DATA, sendUuidServer); | |||||
bleDevice.sendData(sendDataBean); | |||||
mHandler.sendEmptyMessageDelayed(SEND_DATA, sendTime); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_test_cmd); | |||||
mContext = this; | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
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); | |||||
findViewById(R.id.clear).setOnClickListener(this); | |||||
findViewById(R.id.btn1).setOnClickListener(this); | |||||
findViewById(R.id.btn_uuid).setOnClickListener(this); | |||||
findViewById(R.id.btn_time).setOnClickListener(this); | |||||
findViewById(R.id.btn_stop).setOnClickListener(this); | |||||
findViewById(R.id.btn_notify).setOnClickListener(this); | |||||
findViewById(R.id.btn_notify_status).setOnClickListener(this); | |||||
findViewById(R.id.btn_uuid_server).setOnClickListener(this); | |||||
et_cmd = findViewById(R.id.et_cmd); | |||||
et_uuid = findViewById(R.id.et_uuid); | |||||
et_time = findViewById(R.id.et_time); | |||||
et_notify = findViewById(R.id.et_notify); | |||||
et_uuid_server = findViewById(R.id.et_uuid_server); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
switch (v.getId()) { | |||||
case R.id.btn1: | |||||
sendCmd = et_cmd.getText().toString().trim(); | |||||
mHandler.removeMessages(SEND_DATA); | |||||
mHandler.sendEmptyMessage(SEND_DATA); | |||||
break; | |||||
case R.id.btn_stop: | |||||
mHandler.removeMessages(SEND_DATA); | |||||
break; | |||||
case R.id.clear: | |||||
if (mList != null) | |||||
mList.clear(); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
break; | |||||
case R.id.btn_uuid: | |||||
String uuid = et_uuid.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
if (uuid.length() == 8) { | |||||
uuid += uuidEnd; | |||||
} | |||||
sendUuid = UUID.fromString(uuid); | |||||
break; | |||||
case R.id.btn_uuid_server: | |||||
String uuidServer = | |||||
et_uuid_server.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
if (uuidServer.length() == 8) { | |||||
uuidServer += uuidEnd; | |||||
} | |||||
sendUuidServer = UUID.fromString(uuidServer); | |||||
break; | |||||
case R.id.btn_time: | |||||
String time = et_time.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
sendTime = Integer.valueOf(time); | |||||
break; | |||||
case R.id.btn_notify: | |||||
String notify = et_notify.getText().toString().trim().toUpperCase(Locale.ENGLISH); | |||||
if (notify.length() == 8) { | |||||
notify += uuidEnd; | |||||
} | |||||
readNotify(notify, mNotify); | |||||
break; | |||||
case R.id.btn_notify_status: | |||||
mNotify = !mNotify; | |||||
((Button) v).setText("" + mNotify); | |||||
break; | |||||
} | |||||
} | |||||
private boolean mNotify = true; | |||||
/** | |||||
* 设置通知 | |||||
*/ | |||||
private void readNotify(String notify, boolean notifyOpen) { | |||||
UUID UUID_NOTIFY = UUID.fromString(notify); | |||||
if (bleDevice != null && sendUuidServer != null) { | |||||
// bleDevice.setNotify(notifyOpen); | |||||
bleDevice.setOpenNotify(UUID_NOTIFY,sendUuidServer); | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
CallbackDisIm.getInstance().addListListener(this); | |||||
if (bleDevice != null) { | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
CallbackDisIm.getInstance().removeListener(this); | |||||
if (bleDevice != null) { | |||||
bleDevice.disconnect(); | |||||
bleDevice = null; | |||||
} | |||||
} | |||||
//-----------------状态------------------- | |||||
@Override | |||||
public void onConnecting(@NonNull String mac) { | |||||
//TODO 连接中 | |||||
BleLog.i(TAG, "连接中"); | |||||
} | |||||
@Override | |||||
public void onDisConnected(@NonNull String mac, int code) { | |||||
//TODO 连接断开 | |||||
BleLog.i(TAG, "连接断开"); | |||||
mList.add(TimeUtils.getTime() + "连接断开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
finish(); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(@NonNull String mac) { | |||||
//TODO 连接成功(获取服务成功) | |||||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
public void onNotifyData(byte[] hex, int type) { | |||||
String data = ""; | |||||
if (hex != null) | |||||
data = BleStrUtils.byte2HexStr(hex); | |||||
if (type == 100) { | |||||
mList.add(TimeUtils.getTime() + "send->" + data); | |||||
} else { | |||||
mList.add(TimeUtils.getTime() + "notify->" + data); | |||||
} | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
if (mHandler != null) { | |||||
mHandler.removeCallbacksAndMessages(null); | |||||
} | |||||
BleLog.i(TAG, "onDestroy"); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.Manifest; | |||||
import android.app.AlertDialog; | |||||
import android.content.Context; | |||||
import android.content.DialogInterface; | |||||
import android.content.Intent; | |||||
import android.content.pm.PackageManager; | |||||
import android.net.Uri; | |||||
import android.os.Build; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.provider.Settings; | |||||
import android.text.TextUtils; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.ListView; | |||||
import android.widget.TextView; | |||||
import android.widget.Toast; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.listener.OnBleDeviceDataListener; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
import com.pingwang.bluetoothlib.listener.OnDialogOTAListener; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.DialogStringImageAdapter; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.ShowListDialogFragment; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.FileUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.SP; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.core.app.ActivityCompat; | |||||
/** | |||||
* xing<br> | |||||
* 2019/4/25<br> | |||||
* 显示数据 | |||||
*/ | |||||
public class TestOtaActivity extends BleBaseActivity implements OnCallbackBle, | |||||
OnBleDeviceDataListener, View.OnClickListener, OnDialogOTAListener, ShowListDialogFragment.onDialogListener { | |||||
private static String TAG = TestOtaActivity.class.getName(); | |||||
private final int REFRESH_DATA = 3; | |||||
private final int SEND_DATA = 4; | |||||
private TextView mTvVersion; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private Context mContext; | |||||
private BleDevice mBleDevice; | |||||
private String mAddress; | |||||
private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mDialogList; | |||||
private String mOTAFileName; | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case REFRESH_DATA: | |||||
if (listAdapter != null) | |||||
listAdapter.notifyDataSetChanged(); | |||||
break; | |||||
case SEND_DATA: | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_test_ota); | |||||
mContext = this; | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
initPermissions(); | |||||
init(); | |||||
FileUtils.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); | |||||
findViewById(R.id.btn_ota_connect).setOnClickListener(this); | |||||
findViewById(R.id.btn_ota_dis).setOnClickListener(this); | |||||
findViewById(R.id.btn_ota_file).setOnClickListener(this); | |||||
findViewById(R.id.btn_ota_start).setOnClickListener(this); | |||||
mTvVersion=findViewById(R.id.tv_version); | |||||
mOTAFileName = SP.getInstance().getOtaFileName(); | |||||
if (mOTAFileName.isEmpty()) | |||||
mTvVersion.setText("xxxxxxxx"); | |||||
else | |||||
mTvVersion.setText(mOTAFileName); | |||||
mDialogList=new ArrayList<>(); | |||||
} | |||||
@Override | |||||
public void onItemListener(int position) { | |||||
if (mDialogList.size() > position) { | |||||
DialogStringImageAdapter.DialogStringImageBean dialogStringImageBean = mDialogList | |||||
.get(position); | |||||
String name = dialogStringImageBean.getName(); | |||||
mOTAFileName = name; | |||||
SP.getInstance().putOtaFileName(name); | |||||
mTvVersion.setText(mOTAFileName); | |||||
} | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
switch (v.getId()) { | |||||
case R.id.btn_ota_connect: | |||||
if (mBleDevice==null&&!TextUtils.isEmpty(mAddress)){ | |||||
connectBle(mAddress); | |||||
} | |||||
break; | |||||
case R.id.btn_ota_dis: | |||||
if (mBleDevice!=null){ | |||||
mBleDevice.disconnect(); | |||||
mBleDevice=null; | |||||
} | |||||
break; | |||||
case R.id.btn_ota_file: | |||||
mDialogList.clear(); | |||||
ArrayList<String> list = FileUtils.list(); | |||||
for (String s : list) { | |||||
mDialogList.add(new DialogStringImageAdapter.DialogStringImageBean(s, 0)); | |||||
} | |||||
ShowListDialogFragment.newInstance().setTitle("").setCancel("",0).setCancelBlank(true) | |||||
.setBackground(true).setBottom(false).setList(mDialogList).setOnDialogListener(this) | |||||
.show(getSupportFragmentManager()); | |||||
break; | |||||
case R.id.btn_ota_start: | |||||
if (mOTAFileName.isEmpty()) { | |||||
Toast.makeText(mContext, "请先选择文件", Toast.LENGTH_SHORT).show(); | |||||
return; | |||||
} | |||||
String byFileName = FileUtils.getByFileName()+mOTAFileName; | |||||
mList.add(TimeUtils.getTime() + "OTA已开始,请耐心等待"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
mBleDevice.setOnDialogOTAListener(this); | |||||
mBleDevice.startDialogOta(byFileName); | |||||
break; | |||||
} | |||||
} | |||||
/** | |||||
* 初始化请求权限 | |||||
*/ | |||||
private void initPermissions() { | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
ActivityCompat | |||||
.requestPermissions(this, | |||||
new String[]{Manifest.permission.ACCESS_FINE_LOCATION, | |||||
Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); | |||||
} | |||||
} | |||||
@Override | |||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | |||||
@NonNull int[] grantResults) { | |||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||||
if (requestCode != 1) { | |||||
return; | |||||
} | |||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||||
} else { | |||||
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) { | |||||
//权限请求失败,但未选中“不再提示”选项 | |||||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备") | |||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//引导用户至设置页手动授权 | |||||
Intent intent = | |||||
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
Uri uri = Uri.fromParts("package", getApplicationContext() | |||||
.getPackageName(), null); | |||||
intent.setData(uri); | |||||
startActivity(intent); | |||||
} | |||||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
if (dialog != null) { | |||||
dialog.cancel(); | |||||
} | |||||
} | |||||
}).show(); | |||||
} else { | |||||
//权限请求失败,选中“不再提示”选项 | |||||
// T.showShort(MainActivity.this, "获取权限失败"); | |||||
new AlertDialog.Builder(this).setTitle("提示").setMessage("请求使用定位权限搜索蓝牙设备") | |||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//引导用户至设置页手动授权 | |||||
Intent intent = | |||||
new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | |||||
Uri uri = Uri.fromParts("package", getApplicationContext() | |||||
.getPackageName(), null); | |||||
intent.setData(uri); | |||||
startActivity(intent); | |||||
} | |||||
}).setNegativeButton("取消", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
if (dialog != null) { | |||||
dialog.cancel(); | |||||
} | |||||
} | |||||
}).show(); | |||||
} | |||||
} | |||||
} | |||||
//---------------------------------服务--------------------------------------------------- | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
mBleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
mBluetoothService.setOnCallback(this); | |||||
if (mBleDevice != null) { | |||||
mBleDevice.setOnDialogOTAListener(this); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
BleLog.i(TAG, "服务与界面连接断开"); | |||||
//与服务断开连接 | |||||
mBluetoothService = null; | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
if (mBleDevice != null) { | |||||
mBleDevice.disconnect(); | |||||
mBleDevice = null; | |||||
} | |||||
} | |||||
//-----------------状态------------------- | |||||
@Override | |||||
public void onConnecting(@NonNull String mac) { | |||||
//TODO 连接中 | |||||
BleLog.i(TAG, "连接中"); | |||||
mList.add(TimeUtils.getTime() + "连接中"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onDisConnected(@NonNull String mac, int code) { | |||||
//TODO 连接断开 | |||||
BleLog.i(TAG, "连接断开"); | |||||
mList.add(TimeUtils.getTime() + "连接断开"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(@NonNull String mac) { | |||||
//TODO 连接成功(获取服务成功) | |||||
BleLog.i(TAG, "连接成功(获取服务成功)"); | |||||
mList.add(TimeUtils.getTime() + "连接成功"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
onServiceSuccess(); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
BleLog.i(TAG, "蓝牙未开启,可请求开启"); | |||||
} | |||||
//-----------------通知------------------- | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
if (mHandler != null) { | |||||
mHandler.removeCallbacksAndMessages(null); | |||||
} | |||||
BleLog.i(TAG, "onDestroy"); | |||||
} | |||||
@Override | |||||
public void onOtaSuccess() { | |||||
mList.add(TimeUtils.getTime() + "OTA成功"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
@Override | |||||
public void onOtaFailure(int cmd ,String err) { | |||||
mList.add(TimeUtils.getTime() + "OTA失败:" + err); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
if (mBleDevice != null) { | |||||
mBleDevice.disconnect(); | |||||
} | |||||
} | |||||
private int progressOld; | |||||
@Override | |||||
public void onOtaProgress(float progress) { | |||||
int progressInt = (int) progress; | |||||
if (progressOld != progressInt) { | |||||
progressOld = progressInt; | |||||
mList.add(TimeUtils.getTime() + "OTA进度:" + progressInt + "%"); | |||||
mHandler.sendEmptyMessage(REFRESH_DATA); | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.EditText; | |||||
import android.widget.ListView; | |||||
import android.widget.Toast; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
import com.pingwang.bluetoothlib.utils.BleLog; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import java.lang.ref.WeakReference; | |||||
import java.util.ArrayList; | |||||
import java.util.Arrays; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import androidx.annotation.Nullable; | |||||
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushBleCmd; | |||||
import cn.net.aicare.modulelibrary.module.ToothBrush.ToothBrushWiFiBleUtilsData; | |||||
public class ToothBrushWifiBleActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, ToothBrushWiFiBleUtilsData.BleToothBrushWiFiCallback, ToothBrushWiFiBleUtilsData.BleToothBrushCallback { | |||||
private String TAG = ToothBrushWifiBleActivity.class.getName(); | |||||
private String mAddress; | |||||
private List<String> mList; | |||||
private ArrayAdapter listAdapter; | |||||
private ToothBrushWiFiBleUtilsData mToothBrushWiFiBleUtilsData; | |||||
private MHandler mMHandler; | |||||
private EditText mEditText, select_gears_et; | |||||
private String dataPaw; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_tooth_brush_wifi_ble); | |||||
findViewById(R.id.wifistatus).setOnClickListener(this); | |||||
findViewById(R.id.sn).setOnClickListener(this); | |||||
findViewById(R.id.scan_wifi).setOnClickListener(this); | |||||
findViewById(R.id.connect_wifi).setOnClickListener(this); | |||||
findViewById(R.id.disconnect).setOnClickListener(this); | |||||
findViewById(R.id.setedname).setOnClickListener(this); | |||||
findViewById(R.id.support_unit).setOnClickListener(this); | |||||
findViewById(R.id.default_try_out).setOnClickListener(this); | |||||
findViewById(R.id.default_time_mode).setOnClickListener(this); | |||||
findViewById(R.id.default_mode).setOnClickListener(this); | |||||
mEditText = findViewById(R.id.select_wifi_et); | |||||
select_gears_et = findViewById(R.id.select_gears_et); | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
mList = new ArrayList<>(); | |||||
ListView listView = findViewById(R.id.log_list); | |||||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mList); | |||||
listView.setAdapter(listAdapter); | |||||
WeakReference weakReference = new WeakReference(new MHandler()); | |||||
mMHandler = (MHandler) weakReference.get(); | |||||
} | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
//与服务建立连接 | |||||
mList.add(0, "服务与界面建立连接成功"); | |||||
// mList.add(0, "搜索设备"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
mBluetoothService.setOnCallback(this); | |||||
mBluetoothService.scanLeDevice(30 * 1000); | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
} | |||||
@Override | |||||
public void onStartScan() { | |||||
} | |||||
@Override | |||||
public void onScanning(BleValueBean data) { | |||||
BleLog.i(TAG, "MAC=" + mAddress + "||CID=" + data.getCid() + "||VID=" + data.getVid() + "||PID=" + data.getPid()); | |||||
if (data.getMac().equalsIgnoreCase(mAddress)) { | |||||
mBluetoothService.connectDevice(data.getMac()); | |||||
} | |||||
} | |||||
@Override | |||||
public void onScanTimeOut() { | |||||
} | |||||
@Override | |||||
public void onConnecting(String mac) { | |||||
} | |||||
@Override | |||||
public void onDisConnected(String mac, int code) { | |||||
mList.add(0, "蓝牙已断开"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(String mac) { | |||||
mList.add(0, "蓝牙已连接"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
mBluetoothService.setOnCallback(this); | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
ToothBrushWiFiBleUtilsData.init(bleDevice, this, this); | |||||
mToothBrushWiFiBleUtilsData = ToothBrushWiFiBleUtilsData.getInstance(); | |||||
mMHandler.sendEmptyMessageDelayed(ToRequestToken, 600); | |||||
mMHandler.sendEmptyMessageDelayed(GETBATTERY, 800); | |||||
} | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
} | |||||
@Override | |||||
public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) { | |||||
BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus); | |||||
mList.add(0, "蓝牙状态:" + blestatus + " wifi状态:" + wifistatus + " 工作状态:" + workstatus); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void OnWifiScanStatus(int Status) { | |||||
mList.add(0, "扫描wifi状态: " + Status); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
private HashMap<Integer, String> mHashMap = new HashMap(); | |||||
@Override | |||||
public void OnWifiListName(int no, String name) { | |||||
mHashMap.put(no, name); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
private HashMap<Integer, String> wifimacMap = new HashMap(); | |||||
@Override | |||||
public void OnWifiListInfo(int no, String mac, int db, int type, int wifistatus) { | |||||
wifimacMap.put(no, mac); | |||||
mList.add(0, "WIFI序号: " + no + " WIFI名称:" + mHashMap.get(no) + " WIFImac: " + mac + " db: " + db + " type: " + type + " wifistata" + wifistatus); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void OnWifiCurrentConnect(String name) { | |||||
mList.add(0, "当前连接wifi名称: " + name); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void OnWifiScanFinish(int wifiNum) { | |||||
mList.add(0, "扫描结束 扫描的wifi个数 " + wifiNum); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
private boolean issetMac = false; | |||||
/** | |||||
* @param type {@link CmdConfig#SET_WIFI_MAC} | |||||
* @param status {@link ToothBrushBleCmd#STATUS_SUCCESS} | |||||
*/ | |||||
@Override | |||||
public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) { | |||||
if (type == CmdConfig.SET_WIFI_MAC) { | |||||
mList.add(0, "获取到设置的mac地址状态 " + status); | |||||
if (status == ToothBrushBleCmd.STATUS_SUCCESS) { | |||||
issetMac = true; | |||||
setPaw(dataPaw); | |||||
} | |||||
} | |||||
if (type == CmdConfig.SET_WIFI_PWD) { | |||||
mList.add(0, "获取到设置的密码状态 " + status); | |||||
if (status == ToothBrushBleCmd.STATUS_SUCCESS && issetMac) { | |||||
mMHandler.sendEmptyMessage(ConnectWifi); | |||||
} | |||||
} | |||||
if (type == CmdConfig.DISORCONNECTWIFI) { | |||||
mList.add(0, "发起连接 " + status); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
} | |||||
@Override | |||||
public void getSelectWifiMac(String mac) { | |||||
mList.add(0, "获取到设置的wifi的mac地址 " + mac); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void getSelectWifiPaw(String paw) { | |||||
mList.add(0, "获取到设置的wifi的密码 " + paw); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void getDid(long sn) { | |||||
mList.add(0, "sn: " + sn); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
int id = v.getId(); | |||||
if (mToothBrushWiFiBleUtilsData != null) | |||||
switch (id) { | |||||
case R.id.wifistatus: | |||||
mToothBrushWiFiBleUtilsData.queryBleStatus(); | |||||
break; | |||||
case R.id.sn: | |||||
mToothBrushWiFiBleUtilsData.getDevicedid(); | |||||
break; | |||||
case R.id.scan_wifi: | |||||
mToothBrushWiFiBleUtilsData.scanWifi(); | |||||
break; | |||||
case R.id.connect_wifi: | |||||
try { | |||||
int selectWifi = Integer.valueOf(mEditText.getText().toString().trim()); | |||||
if (mHashMap.get(selectWifi) != null && wifimacMap.get(selectWifi) != null) { | |||||
WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi), wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||||
@Override | |||||
public void tvCancelListener(View v) { | |||||
} | |||||
@Override | |||||
public void tvSucceedListener(View v, String data) { | |||||
if (data.equals("") || data.length() > 8) { | |||||
dataPaw = data.trim(); | |||||
mToothBrushWiFiBleUtilsData.setWifimac(wifimacMap.get(selectWifi)); | |||||
} else { | |||||
Toast.makeText(ToothBrushWifiBleActivity.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
} | |||||
@Override | |||||
public void etModifyName(EditText v) { | |||||
} | |||||
}).show(getSupportFragmentManager()); | |||||
} | |||||
} catch (NumberFormatException e) { | |||||
e.printStackTrace(); | |||||
mMHandler.sendEmptyMessage(ConnectWifi); | |||||
} | |||||
break; | |||||
case R.id.setedname: | |||||
mToothBrushWiFiBleUtilsData.getConnectWifiName(); | |||||
break; | |||||
case R.id.disconnect: | |||||
mToothBrushWiFiBleUtilsData.disconnectWifi(); | |||||
break; | |||||
case R.id.support_unit: | |||||
mToothBrushWiFiBleUtilsData.getSupportGears(); | |||||
break; | |||||
case R.id.default_mode: | |||||
String gear = select_gears_et.getText().toString().trim(); | |||||
if (!gear.isEmpty()) { | |||||
String[] gears = null; | |||||
if (gear.contains(",")) { | |||||
gears = gear.split(","); | |||||
} else if (gear.contains(",")) { | |||||
gears = gear.split(","); | |||||
} else { | |||||
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
if (gears != null) { | |||||
try { | |||||
mToothBrushWiFiBleUtilsData.setDefault(Integer.parseInt(gears[0]), Integer.parseInt(gears[1]), Integer.parseInt(gears[2])); | |||||
} catch (NumberFormatException e) { | |||||
e.printStackTrace(); | |||||
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
} | |||||
} | |||||
break; | |||||
case R.id.default_try_out: | |||||
String gear1 = select_gears_et.getText().toString().trim(); | |||||
if (!gear1.isEmpty()) { | |||||
String[] gears = null; | |||||
if (gear1.contains(",")) { | |||||
gears = gear1.split(","); | |||||
} else if (gear1.contains(",")) { | |||||
gears = gear1.split(","); | |||||
} else { | |||||
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
if (gears != null) { | |||||
try { | |||||
mToothBrushWiFiBleUtilsData.setTryOut(Integer.parseInt(gears[1]), Integer.parseInt(gears[2]),0,0); | |||||
} catch (NumberFormatException e) { | |||||
e.printStackTrace(); | |||||
Toast.makeText(this, "请输入时长,档位,档位级别(数字加符号)", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
} | |||||
} | |||||
break; | |||||
case R.id.default_time_mode: | |||||
mToothBrushWiFiBleUtilsData.getdefaultGearAndDuration(); | |||||
break; | |||||
} | |||||
} | |||||
private final int ToRefreUi = 300; | |||||
private final int ConnectWifi = 400; | |||||
private final int ToRequestToken = 500; | |||||
private final int GETBATTERY = 600; | |||||
@Override | |||||
public void onVersion(String version) { | |||||
mList.add(0, "版本号:" + version); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onGetSupportGears(List<Integer> staif, List<Integer> secondLevel) { | |||||
mList.add(0, "牙刷支持的一级档位:" + Arrays.toString(staif.toArray()) + " 二级档位:" + Arrays.toString(secondLevel.toArray())); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onGetBattery(int batteryStatus, int batteryQuantity) { | |||||
mList.add(0, "电池状态:" + batteryStatus + " 电量:" + batteryQuantity); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onGetDefaultGearAndDuration(int time, int gear, int gearFrom) { | |||||
mList.add(0, "获得到默认的刷牙档位和时长:" + time + " 档位:" + gear + " 档位级别" + gearFrom); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onGetTokenResult(int result) { | |||||
String s = ""; | |||||
if (result == ToothBrushBleCmd.NO_TOKEN) { | |||||
s = "没有"; | |||||
} else if (result == ToothBrushBleCmd.HAS_TOKEN) { | |||||
s = "已经授权"; | |||||
} else if (result == ToothBrushBleCmd.WITHOUT_TOKEN) { | |||||
s = "不需要授权"; | |||||
} else if (result == ToothBrushBleCmd.SUCCESSTOKEN) { | |||||
s = "授权成功"; | |||||
} | |||||
mList.add(0, "请求授权结果" + result + " " + s); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onGetManualParameter(int time, int hz, int duty) { | |||||
mList.add(0, " 获取手动档位的参数: 时长" + time + " 频率" + hz + " 占空比" + duty); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onSetDefaultModeAndManualModeResult(byte type, int result) { | |||||
String s = ""; | |||||
if (result == 0) { | |||||
s = "设置成功"; | |||||
} else if (result == 1) { | |||||
s = "设置失败"; | |||||
} else if (result == 2) { | |||||
s = "不支持设置"; | |||||
} | |||||
if (type == ToothBrushBleCmd.SET_TOOTHBRUSH_TIME_GEARS) { | |||||
mList.add(0, " 设置默认刷牙时长和工作档位: 结果" + result + " " + s); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} else { | |||||
mList.add(0, " 设置手动设置(自定义)档位: 结果" + result + " " + s); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
} | |||||
@Override | |||||
public void onTestFinish(int totalTime, int leftTime, int rightTime, int mode, int battery) { | |||||
mList.add(0, "刷牙完成: 总时长:" + totalTime + " 左时长:" + leftTime + " 右时长:" + rightTime + " 模式:" + mode + " 电量:" + battery); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onTryOutResult(int result) { | |||||
mList.add(0, "设置使用结果:" + result + " ( 0:设置成功 1:设置失败,原因未知 2:不支持设置)"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onTwoLevelModeDefault(int mode) { | |||||
mList.add(0, "获取二级档位默认值:" + mode); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onShowData(String data) { | |||||
} | |||||
private class MHandler extends Handler { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
super.handleMessage(msg); | |||||
switch (msg.what) { | |||||
case ToRefreUi: | |||||
if (listAdapter != null) { | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
break; | |||||
case ConnectWifi: | |||||
mToothBrushWiFiBleUtilsData.connectWifi(); | |||||
break; | |||||
case ToRequestToken: | |||||
mList.add(0, "请求授权"); | |||||
mToothBrushWiFiBleUtilsData.requestToken(System.currentTimeMillis()); | |||||
if (listAdapter != null) { | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
break; | |||||
case GETBATTERY: | |||||
mToothBrushWiFiBleUtilsData.getBattery(); | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* wifi密码一次只能传14个byte | |||||
* 如果密码长度超过14个byte 就需要分包传送 | |||||
* subpackage 为0 时,表示后面还有数据 | |||||
* subpackage 为1 时,表示数据小于或等于14个byte,后面没有数据 | |||||
* | |||||
* @param paw | |||||
*/ | |||||
private void setPaw(String paw) { | |||||
if (paw.isEmpty()) { | |||||
byte[] bytes = new byte[0]; | |||||
mToothBrushWiFiBleUtilsData.setWifiPwd(0, bytes); | |||||
} else { | |||||
byte[] password = BleStrUtils.stringToBytes(paw); | |||||
if (password != null) { | |||||
if (password.length < 14) | |||||
mToothBrushWiFiBleUtilsData.setWifiPwd(0, password); | |||||
else { | |||||
boolean isend = false; | |||||
int i = 0; | |||||
byte[] byte1 = password; | |||||
while (!isend) { | |||||
if (byte1.length > 14) { | |||||
byte[] bytes = new byte[14]; | |||||
System.arraycopy(password, i, bytes, 0, bytes.length); | |||||
mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes); | |||||
i = i + 14; | |||||
byte1 = Arrays.copyOf(password, password.length - i); | |||||
} else { | |||||
isend = true; | |||||
byte[] bytes = new byte[password.length - i]; | |||||
System.arraycopy(password, i, bytes, 0, bytes.length); | |||||
mToothBrushWiFiBleUtilsData.setWifiPwd(1, bytes); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
import android.widget.EditText; | import android.widget.EditText; | ||||
import android.widget.ListView; | import android.widget.ListView; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | import com.pingwang.bluetoothlib.device.BleSendCmdUtil; | ||||
import com.pingwang.bluetoothlib.device.SendBleBean; | import com.pingwang.bluetoothlib.device.SendBleBean; | ||||
import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | import com.pingwang.bluetoothlib.listener.OnMcuParameterListener; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData; | import cn.net.aicare.modulelibrary.module.tpms.TpmsDeviceData; | ||||
/** | /** | ||||
* xing<br> | * xing<br> | ||||
* 2019/9/2<br> | * 2019/9/2<br> | ||||
* 显示数据 | * 显示数据 | ||||
*/ | */ | ||||
public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbackDis, | public class TpmsConnectCmdActivity extends BleBaseActivity implements OnCallbackDis, | ||||
TpmsDeviceData.onNotifyData, TpmsDeviceData.onTpmsSetting, TpmsDeviceData.onTpmsInfo, OnBleVersionListener, OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||||
TpmsDeviceData.onNotifyData, TpmsDeviceData.onTpmsSetting, TpmsDeviceData.onTpmsInfo, OnBleVersionListener, | |||||
OnMcuParameterListener, OnBleCompanyListener, View.OnClickListener { | |||||
private static String TAG = TpmsConnectCmdActivity.class.getName(); | private static String TAG = TpmsConnectCmdActivity.class.getName(); | ||||
private final int REFRESH_DATA = 3; | private final int REFRESH_DATA = 3; |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Message; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.Button; | |||||
import android.widget.EditText; | |||||
import android.widget.ListView; | |||||
import androidx.annotation.Nullable; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.SupportUnitBean; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.TimeUtils; | |||||
import java.lang.ref.WeakReference; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import cn.net.aicare.modulelibrary.module.Transmission.TransmissionDeviceData; | |||||
public class TransmissionActivity extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, TransmissionDeviceData.MyBleCallback { | |||||
private EditText et, et_cid; | |||||
private Button send, bt_clear, bt_clear_log,bt_cid; | |||||
private ListView mListView; | |||||
private List<String> mlogList; | |||||
private final int ToRefreUi = 1; | |||||
private MHandler mMHandler; | |||||
private ArrayAdapter listAdapter; | |||||
private String mAddress; | |||||
private TransmissionDeviceData mTransmissionDeviceData; | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
mlogList.add(0, "服务与界面建立连接成功"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
// BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.setOnCallback(this); | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
mTransmissionDeviceData = new TransmissionDeviceData(bleDevice); | |||||
mTransmissionDeviceData.setMyBleCallback(this); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
} | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_transmission); | |||||
WeakReference weakReference = new WeakReference(new MHandler()); | |||||
mMHandler = (MHandler) weakReference.get(); | |||||
et = findViewById(R.id.et); | |||||
et_cid = findViewById(R.id.et_cid); | |||||
bt_cid = findViewById(R.id.bt_cid); | |||||
send = findViewById(R.id.send); | |||||
bt_clear = findViewById(R.id.bt_clear); | |||||
bt_clear_log = findViewById(R.id.bt_clear_log); | |||||
mListView = findViewById(R.id.listview); | |||||
send.setOnClickListener(this); | |||||
bt_clear.setOnClickListener(this); | |||||
bt_cid.setOnClickListener(this); | |||||
bt_clear_log.setOnClickListener(this); | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
mlogList = new ArrayList<>(); | |||||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||||
mListView.setAdapter(listAdapter); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
int id = v.getId(); | |||||
if (id == R.id.send) { | |||||
if (!et.getText().toString().isEmpty() && !et_cid.getText().toString().isEmpty()) { | |||||
String hex=et.getText().toString().toUpperCase().trim(); | |||||
byte[] hexStr = BleStrUtils.stringToByte(hex); | |||||
String cid = et_cid.getText().toString().toUpperCase().trim(); | |||||
int hexStrCid = Integer.parseInt(cid, 16); | |||||
if (mTransmissionDeviceData != null) { | |||||
mTransmissionDeviceData.setSendData(hexStrCid, hexStr); | |||||
} | |||||
} | |||||
} else if (id == R.id.bt_clear) { | |||||
et.setText(""); | |||||
} else if (id == R.id.bt_clear_log) { | |||||
mlogList.clear(); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
}else if (id==R.id.bt_cid){ | |||||
if (mTransmissionDeviceData != null) { | |||||
mTransmissionDeviceData.getCid(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onVersion(String version) { | |||||
} | |||||
@Override | |||||
public void showdata(String data) { | |||||
mlogList.add(0, "收 payload数据"+TimeUtils.getTime()+data); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onSupportUnit(List<SupportUnitBean> list) { | |||||
} | |||||
@Override | |||||
public void onCid(int cid, int vid, int pid) { | |||||
mlogList.add(0, "收"+TimeUtils.getTime() + "cid:" + cid + "||vid:" + vid + "||pid:" + pid); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void otherdata(String data) { | |||||
mlogList.add(0, "收 透传数据"+TimeUtils.getTime()+data); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void sendData(String data) { | |||||
mlogList.add(0, "发 "+TimeUtils.getTime()+data); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
private class MHandler extends Handler { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
super.handleMessage(msg); | |||||
switch (msg.what) { | |||||
case ToRefreUi: | |||||
if (listAdapter != null) { | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.content.Context; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.AdapterView; | |||||
import android.widget.SeekBar; | |||||
import android.widget.TextView; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||||
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> { | |||||
private List<User> mUser; | |||||
private Context mContext; | |||||
public UserAdapter(Context context, List<User> mUser) { | |||||
this.mContext = context; | |||||
this.mUser = mUser; | |||||
} | |||||
@NonNull | |||||
@Override | |||||
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||||
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_user_info,parent)); | |||||
} | |||||
@Override | |||||
public void onBindViewHolder(@NonNull ViewHolder holder, int position) { | |||||
} | |||||
@Override | |||||
public int getItemCount() { | |||||
return mUser.size(); | |||||
} | |||||
class ViewHolder extends RecyclerView.ViewHolder implements SeekBar.OnSeekBarChangeListener { | |||||
private TextView id; | |||||
private SeekBar agesb, heightsb, weightsb, adcsb; | |||||
public ViewHolder(@NonNull View itemView) { | |||||
super(itemView); | |||||
id = itemView.findViewById(R.id.id); | |||||
agesb = itemView.findViewById(R.id.adcsb); | |||||
agesb.setOnSeekBarChangeListener(this); | |||||
heightsb = itemView.findViewById(R.id.heightsb); | |||||
heightsb.setOnSeekBarChangeListener(this); | |||||
weightsb = itemView.findViewById(R.id.weightsb); | |||||
weightsb.setOnSeekBarChangeListener(this); | |||||
adcsb = itemView.findViewById(R.id.adcsb); | |||||
adcsb.setOnSeekBarChangeListener(this); | |||||
} | |||||
@Override | |||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||||
int id = seekBar.getId(); | |||||
User user = mUser.get(getLayoutPosition()); | |||||
if (id == R.id.weightsb) { | |||||
user.setWeight(progress); | |||||
} else if (id == R.id.adcsb) { | |||||
user.setAdc(progress); | |||||
} else if (id == R.id.heightsb) { | |||||
user.setHeight(progress); | |||||
} else if (id == R.id.age) { | |||||
user.setAge(progress); | |||||
} | |||||
} | |||||
@Override | |||||
public void onStartTrackingTouch(SeekBar seekBar) { | |||||
} | |||||
@Override | |||||
public void onStopTrackingTouch(SeekBar seekBar) { | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Message; | |||||
import android.util.Log; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.CompoundButton; | |||||
import android.widget.EditText; | |||||
import android.widget.ListView; | |||||
import android.widget.RadioButton; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | |||||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | |||||
import com.pingwang.bluetoothlib.device.SendBleBean; | |||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | |||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||||
import java.lang.ref.WeakReference; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import androidx.annotation.Nullable; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.AppHistoryRecordBean; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatBleUtilsData; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatDataUtil; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.BodyFatRecord; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.McuHistoryRecordBean; | |||||
import cn.net.aicare.modulelibrary.module.BodyFatScale.User; | |||||
public class WeightScaleBle extends BleBaseActivity implements View.OnClickListener, OnCallbackBle, BodyFatBleUtilsData.BleBodyFatCallback { | |||||
private String TAG = WeightScaleBle.class.getName(); | |||||
private String mAddress; | |||||
private List<String> mlogList; | |||||
private List<String> mUserlogList; | |||||
private ArrayAdapter listAdapter; | |||||
private ArrayAdapter userAdapter; | |||||
private BodyFatBleUtilsData bodyFatBleUtilsData; | |||||
private MHandler mMHandler; | |||||
private EditText mEditText; | |||||
private RadioButton kg, jing, stlb, lb; | |||||
private List<User> mUsers; | |||||
private User selectUser; | |||||
private int weighunit = BodyFatDataUtil.KG; | |||||
private ListView loglistView; | |||||
private ListView userlistView; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_weight_scale_ble); | |||||
initView(); | |||||
setUnitinit(); | |||||
initdata(); | |||||
} | |||||
private void initView(){ | |||||
findViewById(R.id.history).setOnClickListener(this); | |||||
findViewById(R.id.userlist).setOnClickListener(this); | |||||
findViewById(R.id.user).setOnClickListener(this); | |||||
findViewById(R.id.adduser).setOnClickListener(this); | |||||
findViewById(R.id.syntime).setOnClickListener(this); | |||||
kg = findViewById(R.id.kg); | |||||
jing = findViewById(R.id.jin); | |||||
stlb = findViewById(R.id.st_lb); | |||||
lb = findViewById(R.id.lb); | |||||
mEditText = findViewById(R.id.edit_Userid); | |||||
kg.setChecked(true); | |||||
loglistView = findViewById(R.id.log_list); | |||||
userlistView = findViewById(R.id.user_list); | |||||
} | |||||
private void initdata(){ | |||||
mAddress = getIntent().getStringExtra("mac"); | |||||
WeakReference weakReference = new WeakReference(new MHandler()); | |||||
mMHandler = (MHandler) weakReference.get(); | |||||
mlogList = new ArrayList<>(); | |||||
listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mlogList); | |||||
loglistView.setAdapter(listAdapter); | |||||
User defaultUser=getdefault(); | |||||
selectUser = defaultUser; | |||||
mUsers = new ArrayList<>(); | |||||
mUsers.add(defaultUser); | |||||
mUserlogList = new ArrayList<>(); | |||||
mUserlogList.add(defaultUser.toString()); | |||||
userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUserlogList); | |||||
userlistView.setAdapter(userAdapter); | |||||
} | |||||
private User getdefault(){ | |||||
User user = new User(); | |||||
user.setModeType(BodyFatDataUtil.MODE_ORDINARY); | |||||
user.setSex(BodyFatDataUtil.SEX_MAN); | |||||
user.setAge(18); | |||||
user.setHeight(170); | |||||
user.setAdc(560); | |||||
user.setWeight(50); | |||||
user.setId(1); | |||||
return user; | |||||
} | |||||
private void setUnitinit() { | |||||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
weighunit = BodyFatDataUtil.KG; | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.KG, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
} | |||||
} | |||||
}); | |||||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
weighunit = BodyFatDataUtil.JIN; | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.JIN, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
} | |||||
} | |||||
}); | |||||
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
weighunit = BodyFatDataUtil.ST; | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.ST, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
} | |||||
} | |||||
}); | |||||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
weighunit = BodyFatDataUtil.LB; | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.LB, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
public void onServiceSuccess() { | |||||
mlogList.add(0, "服务与界面建立连接成功"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
// BleLog.i(TAG, "服务与界面建立连接成功"); | |||||
//与服务建立连接 | |||||
if (mBluetoothService != null) { | |||||
mBluetoothService.setOnCallback(this); | |||||
BleDevice bleDevice = mBluetoothService.getBleDevice(mAddress); | |||||
if (bleDevice != null) { | |||||
BodyFatBleUtilsData.init(bleDevice, this, null); | |||||
bodyFatBleUtilsData = BodyFatBleUtilsData.getInstance(); | |||||
if (bodyFatBleUtilsData != null) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(weighunit, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().synSysTime()); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onServiceErr() { | |||||
mlogList.add(0, "服务与界面建立连接出错"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void unbindServices() { | |||||
mlogList.add(0, "服务与界面建立断开连接成功"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onStartScan() { | |||||
mlogList.add(0, "开始扫描"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onScanning(BleValueBean data) { | |||||
mlogList.add(0, "扫描中"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onScanTimeOut() { | |||||
mlogList.add(0, "扫描超时"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onConnecting(String mac) { | |||||
mlogList.add(0, "正在连接" + mac); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onDisConnected(String mac, int code) { | |||||
mlogList.add(0, "断开连接" + mac); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onServicesDiscovered(String mac) { | |||||
mlogList.add(0, "发现蓝牙服务" + mac); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void bleOpen() { | |||||
mlogList.add(0, "蓝牙打开"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void bleClose() { | |||||
mlogList.add(0, "蓝牙关闭"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onWeightData(int status, float weight, int weightUnit, int decimals) { | |||||
mlogList.add(0, "体重数据类型:" + status + " 体重: " + weight + " 单位:" + weightUnit + " 小数点位: " + decimals); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onStatus(int status) { | |||||
switch (status) { | |||||
case BodyFatDataUtil.WEIGHT_TESTING: | |||||
mlogList.add(0, "测量状态:" + status + " 测量实时体重"); | |||||
break; | |||||
case BodyFatDataUtil.WEIGHT_RESULT: | |||||
mlogList.add(0, "测量状态:" + status + " 稳定体重"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_TESTING: | |||||
mlogList.add(0, "测量状态:" + status + " 阻抗测量中"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_SUCCESS: | |||||
case BodyFatDataUtil.IMPEDANCE_SUCCESS_DATA: | |||||
mlogList.add(0, "测量状态:" + status + " 阻抗测量成功"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_FAIL: | |||||
mlogList.add(0, "测量状态:" + status + " 阻抗测量失败"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_TESTING: | |||||
mlogList.add(0, "测量状态:" + status + " 心率测量中"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_SUCCESS: | |||||
mlogList.add(0, "测量状态:" + status + " 心率测量成功"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_FAIL: | |||||
mlogList.add(0, "测量状态:" + status + " 心率测量失败"); | |||||
break; | |||||
case BodyFatDataUtil.TEST_FINISH: | |||||
mlogList.add(0, "测量状态:" + status + " 测量完成"); | |||||
break; | |||||
case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||||
mlogList.add(0, "测量状态:" + status + "请求用户信息"); | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfo(selectUser, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE)); | |||||
break; | |||||
default: | |||||
mlogList.add(0, "测量状态:" + status); | |||||
} | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onAdc(int adc, int algorithmic) { | |||||
mlogList.add(0, "阻抗:" + adc + " 算法位:" + algorithmic); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onHeartRate(int heartrate) { | |||||
mlogList.add(0, "心率:" + heartrate); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onBodyFat(BodyFatRecord bodyFatRecord) { | |||||
mlogList.add(0, "体脂数:" + bodyFatRecord.toString()); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onError(int code) { | |||||
mlogList.add(0, "历史记录Mcu:" + code); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onHistoryMcu(McuHistoryRecordBean mcuHistoryRecordBean) { | |||||
mlogList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString()); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onHistoryApp(AppHistoryRecordBean appHistoryRecordBean) { | |||||
mlogList.add(0, "历史记录app:" + appHistoryRecordBean.toString()); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onVersion(String version) { | |||||
mlogList.add(0, "版本号:" + version); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onMcuBatteryStatus(int status, int battery) { | |||||
mlogList.add(0, "电量状态" + status + " 电量:" + battery); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onSysTime(int status, int[] times) { | |||||
mlogList.add(0, "时间状态" + status); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void requestSynTime() { | |||||
mlogList.add(0, "同步时间"); | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().synTime()); | |||||
} | |||||
@Override | |||||
public void setTimeCallback(int type, int status) { | |||||
String msg = ""; | |||||
if (type == CmdConfig.SET_SYS_TIME) { | |||||
msg = "设置系统当前时间:"; | |||||
} else if (type == CmdConfig.SET_DEVICE_TIME) { | |||||
msg = "同步时间"; | |||||
} | |||||
if (status == BodyFatDataUtil.STATUS_SUCCESS) { | |||||
msg = msg + status + " 成功"; | |||||
} else if (status == BodyFatDataUtil.STATUS_FAIL) { | |||||
msg = msg + status + " 失败"; | |||||
} else if (status == BodyFatDataUtil.STATUS_NOSUPORT) { | |||||
msg = msg + status + " 不支持"; | |||||
} | |||||
mlogList.add(0, msg); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void requestSynHistoryCallback(int status) { | |||||
if (status == 0) { | |||||
mlogList.add(0, "请求历史记录:" + status + " 无历史记录"); | |||||
} else if (status == 1) { | |||||
mlogList.add(0, "请求历史记录:" + status + " 开始发送历史记录"); | |||||
} else { | |||||
mlogList.add(0, "请求历史记录:" + status + " 发送历史记录结束"); | |||||
} | |||||
} | |||||
@Override | |||||
public void updateUserCallback(int status) { | |||||
if (status == 0) { | |||||
mlogList.add(0, "更新用户或列表回调" + status + " 更新列表成功"); | |||||
} else if (status == 1) { | |||||
mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户成功"); | |||||
} else if (status == 2) { | |||||
mlogList.add(0, "更新用户或列表回调" + status + " 更新列表失败"); | |||||
} else { | |||||
mlogList.add(0, "更新用户或列表回调" + status + " 更新个人用户失败"); | |||||
} | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
/** | |||||
* @param status {@link#Bod} | |||||
*/ | |||||
@Override | |||||
public void setUnitCallback(int status) { | |||||
if (status == 0) { | |||||
mlogList.add(0, "下发单位回调" + status + " 成功"); | |||||
} else if (status == 1) { | |||||
mlogList.add(0, "下发单位回调" + status + " 失败"); | |||||
} else { | |||||
mlogList.add(0, "下发单位回调" + status + " 不支持"); | |||||
} | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void requestUserData(int status) { | |||||
if (status == 0x01) { | |||||
mlogList.add(0, "下发用户信息 " + status); | |||||
} else if (status == 0x03) { | |||||
mlogList.add(0, "下发用户信息成功 " + status); | |||||
} else { | |||||
mlogList.add(0, "下发用户信息失败 " + status); | |||||
} | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
int id = v.getId(); | |||||
switch (id) { | |||||
case R.id.history: | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().requestSynHistory()); | |||||
break; | |||||
case R.id.user: | |||||
if (!mEditText.getText().toString().trim().isEmpty()) { | |||||
int userid = Integer.parseInt(mEditText.getText().toString().trim()); | |||||
if (mUsers.size() >= userid) { | |||||
selectUser = mUsers.get(userid - 1); | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updataPresentUser(selectUser)); | |||||
} | |||||
} | |||||
break; | |||||
case R.id.userlist: | |||||
for (User mUser : mUsers) { | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setUserInfoList(mUser)); | |||||
} | |||||
if (bodyFatBleUtilsData != null) | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().updateUsersComplete()); | |||||
break; | |||||
case R.id.adduser: | |||||
AddUserDialog addUserDialog = new AddUserDialog(new AddUserDialog.OnDialogListener() { | |||||
@Override | |||||
public void tvSucceedListener(User user) { | |||||
user.setId(mUsers.size() + 1); | |||||
mUsers.add(user); | |||||
mUserlogList.add(user.toString()); | |||||
userAdapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
addUserDialog.show(getSupportFragmentManager()); | |||||
break; | |||||
case R.id.syntime: | |||||
if (bodyFatBleUtilsData != null) { | |||||
SendBleBean sendBleBean = BodyFatDataUtil.getInstance().synSysTime(); | |||||
Log.e("time", BleStrUtils.byte2HexStr(sendBleBean.getHex())); | |||||
bodyFatBleUtilsData.sendData(sendBleBean); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
private final int ToRefreUi = 300; | |||||
private class MHandler extends Handler { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
super.handleMessage(msg); | |||||
switch (msg.what) { | |||||
case ToRefreUi: | |||||
if (listAdapter != null) { | |||||
listAdapter.notifyDataSetChanged(); | |||||
} | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
} |
import android.widget.RadioButton; | import android.widget.RadioButton; | ||||
import android.widget.Toast; | import android.widget.Toast; | ||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import com.pingwang.bluetoothlib.bean.BleValueBean; | import com.pingwang.bluetoothlib.bean.BleValueBean; | ||||
import com.pingwang.bluetoothlib.config.BleDeviceConfig; | |||||
import com.pingwang.bluetoothlib.config.CmdConfig; | |||||
import com.pingwang.bluetoothlib.device.BleDevice; | import com.pingwang.bluetoothlib.device.BleDevice; | ||||
import com.pingwang.bluetoothlib.listener.OnCallbackBle; | import com.pingwang.bluetoothlib.listener.OnCallbackBle; | ||||
import com.pingwang.bluetoothlib.utils.BleLog; | import com.pingwang.bluetoothlib.utils.BleLog; | ||||
import com.pingwang.bluetoothlib.utils.BleStrUtils; | import com.pingwang.bluetoothlib.utils.BleStrUtils; | ||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig; | |||||
import java.lang.ref.WeakReference; | import java.lang.ref.WeakReference; | ||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
private BodyFatBleUtilsData bodyFatBleUtilsData; | private BodyFatBleUtilsData bodyFatBleUtilsData; | ||||
private MHandler mMHandler; | private MHandler mMHandler; | ||||
private EditText mEditText; | private EditText mEditText; | ||||
private RadioButton kg,jing,stlb,lb; | |||||
private RadioButton kg, jing, stlb, lb; | |||||
@Override | @Override | ||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | protected void onCreate(@Nullable Bundle savedInstanceState) { | ||||
super.onCreate(savedInstanceState); | super.onCreate(savedInstanceState); | ||||
findViewById(R.id.setedpaw).setOnClickListener(this); | findViewById(R.id.setedpaw).setOnClickListener(this); | ||||
findViewById(R.id.setedmac).setOnClickListener(this); | findViewById(R.id.setedmac).setOnClickListener(this); | ||||
mEditText = findViewById(R.id.select_wifi_et); | mEditText = findViewById(R.id.select_wifi_et); | ||||
kg=findViewById(R.id.kg); | |||||
jing=findViewById(R.id.jin); | |||||
stlb=findViewById(R.id.st_lb); | |||||
lb=findViewById(R.id.lb); | |||||
kg = findViewById(R.id.kg); | |||||
jing = findViewById(R.id.jin); | |||||
stlb = findViewById(R.id.st_lb); | |||||
lb = findViewById(R.id.lb); | |||||
kg.setChecked(true); | kg.setChecked(true); | ||||
mAddress = getIntent().getStringExtra("mac"); | mAddress = getIntent().getStringExtra("mac"); | ||||
mList = new ArrayList<>(); | mList = new ArrayList<>(); | ||||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
@Override | @Override | ||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
if (isChecked){ | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil | |||||
.getInstance().setWeightUnit(0, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
if (isChecked) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.KG, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | @Override | ||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
if (isChecked){ | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil | |||||
.getInstance().setWeightUnit(1, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
if (isChecked) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.JIN, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||
@Override | @Override | ||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
if (isChecked){ | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil | |||||
.getInstance().setWeightUnit(4, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
if (isChecked) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.ST, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | @Override | ||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | ||||
if (isChecked){ | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil | |||||
.getInstance().setWeightUnit(6, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
if (isChecked) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWeightUnit(BodyFatDataUtil.LB, BleDeviceConfig.WEIGHT_BODY_FAT_SCALE_WIFI_BLE)); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
@Override | @Override | ||||
public void onStatus(int status) { | public void onStatus(int status) { | ||||
switch (status){ | |||||
case BodyFatDataUtil.WEIGHT_TESTING: | |||||
mList.add(0, "测量状态:" + status+" 测量实时体重"); | |||||
break; | |||||
case BodyFatDataUtil.WEIGHT_RESULT: | |||||
mList.add(0, "测量状态:" + status+" 稳定体重"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_TESTING: | |||||
mList.add(0, "测量状态:" + status+" 阻抗测量中"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_SUCCESS_DATA: | |||||
case BodyFatDataUtil.IMPEDANCE_SUCCESS: | |||||
mList.add(0, "测量状态:" + status+" 阻抗测量成功"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_FAIL: | |||||
mList.add(0, "测量状态:" + status+" 阻抗测量失败"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_TESTING: | |||||
mList.add(0, "测量状态:" + status+" 心率测量中"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_SUCCESS: | |||||
mList.add(0, "测量状态:" + status+" 心率测量成功"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_FAIL: | |||||
mList.add(0, "测量状态:" + status+" 心率测量失败"); | |||||
break; | |||||
case BodyFatDataUtil.TEST_FINISH: | |||||
mList.add(0, "测量状态:" + status+" 测量完成"); | |||||
break; | |||||
case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||||
mList.add(0,"测量状态:" + status+"请求用户信息"); | |||||
break; | |||||
default: | |||||
mList.add(0, "测量状态:" + status); | |||||
} | |||||
switch (status) { | |||||
case BodyFatDataUtil.WEIGHT_TESTING: | |||||
mList.add(0, "测量状态:" + status + " 测量实时体重"); | |||||
break; | |||||
case BodyFatDataUtil.WEIGHT_RESULT: | |||||
mList.add(0, "测量状态:" + status + " 稳定体重"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_TESTING: | |||||
mList.add(0, "测量状态:" + status + " 阻抗测量中"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_SUCCESS_DATA: | |||||
case BodyFatDataUtil.IMPEDANCE_SUCCESS: | |||||
mList.add(0, "测量状态:" + status + " 阻抗测量成功"); | |||||
break; | |||||
case BodyFatDataUtil.IMPEDANCE_FAIL: | |||||
mList.add(0, "测量状态:" + status + " 阻抗测量失败"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_TESTING: | |||||
mList.add(0, "测量状态:" + status + " 心率测量中"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_SUCCESS: | |||||
mList.add(0, "测量状态:" + status + " 心率测量成功"); | |||||
break; | |||||
case BodyFatDataUtil.HEART_FAIL: | |||||
mList.add(0, "测量状态:" + status + " 心率测量失败"); | |||||
break; | |||||
case BodyFatDataUtil.TEST_FINISH: | |||||
mList.add(0, "测量状态:" + status + " 测量完成"); | |||||
break; | |||||
case BodyFatDataUtil.MUC_REQUEST_USER_INFO: | |||||
mList.add(0, "测量状态:" + status + "请求用户信息"); | |||||
break; | |||||
default: | |||||
mList.add(0, "测量状态:" + status); | |||||
} | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void onBodyFat(BodyFatRecord bodyFatRecord) { | public void onBodyFat(BodyFatRecord bodyFatRecord) { | ||||
mList.add(0, "体脂数:" + bodyFatRecord.toString()); | |||||
mList.add(0, "体脂数据:" + bodyFatRecord.toString()); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void onError(int code) { | public void onError(int code) { | ||||
mList.add(0, "历史记录Mcu:" + code); | mList.add(0, "历史记录Mcu:" + code); | ||||
public void onHistoryMcu(McuHistoryRecordBean mcuHistoryRecordBean) { | public void onHistoryMcu(McuHistoryRecordBean mcuHistoryRecordBean) { | ||||
mList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString()); | mList.add(0, "历史记录Mcu:" + mcuHistoryRecordBean.toString()); | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
// mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | } | ||||
@Override | @Override | ||||
public void onHistoryApp(AppHistoryRecordBean appHistoryRecordBean) { | public void onHistoryApp(AppHistoryRecordBean appHistoryRecordBean) { | ||||
mList.add(0, "历史记录app:" + appHistoryRecordBean.toString()); | mList.add(0, "历史记录app:" + appHistoryRecordBean.toString()); | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | } | ||||
@Override | @Override | ||||
@Override | @Override | ||||
public void onMcuBatteryStatus(int status, int battery) { | public void onMcuBatteryStatus(int status, int battery) { | ||||
mList.add(0,"电量状态"+status+" 电量:"+battery); | |||||
mList.add(0, "电量状态" + status + " 电量:" + battery); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void onSysTime(int status, int[] times) { | public void onSysTime(int status, int[] times) { | ||||
mList.add(0,"时间状态"+status); | |||||
mList.add(0, "时间状态" + status); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void requestSynTime() { | public void requestSynTime() { | ||||
mList.add(0,"请求同步时间"); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
mList.add(0,"同步时间"); | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().synTime()); | |||||
} | } | ||||
@Override | @Override | ||||
public void setTimeCallback(int type, int status) { | |||||
mList.add(0,"设置时间回调"); | |||||
public void setTimeCallback(int type,int status) { | |||||
String msg = ""; | |||||
if (type == CmdConfig.SET_SYS_TIME) { | |||||
msg = "设置系统当前时间:"; | |||||
} else if (type == CmdConfig.SET_DEVICE_TIME) { | |||||
msg = "同步时间"; | |||||
} | |||||
if (status == BodyFatDataUtil.STATUS_SUCCESS) { | |||||
msg = msg + status + " 成功"; | |||||
} else if (status == BodyFatDataUtil.STATUS_FAIL) { | |||||
msg = msg + status + " 失败"; | |||||
} else if (status == BodyFatDataUtil.STATUS_NOSUPORT) { | |||||
msg = msg + status + " 不支持"; | |||||
} | |||||
mList.add(0, msg); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void requestSynHistoryCallback(int status) { | public void requestSynHistoryCallback(int status) { | ||||
if (status==0) { | |||||
mList.add(0, "" + status+" 无历史记录"); | |||||
}else if (status==1){ | |||||
mList.add(0, "请求历史记录" + status+" 开始发送历史记录"); | |||||
}else { | |||||
mList.add(0, "请求历史记录" + status+" 发送历史记录结束"); | |||||
if (status == 0) { | |||||
mList.add(0, "" + status + " 无历史记录"); | |||||
} else if (status == 1) { | |||||
mList.add(0, "请求历史记录" + status + " 开始发送历史记录"); | |||||
} else { | |||||
mList.add(0, "请求历史记录" + status + " 发送历史记录结束"); | |||||
} | } | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | |||||
} | } | ||||
@Override | @Override | ||||
public void updateUserCallback(int status) { | public void updateUserCallback(int status) { | ||||
if (status==0) { | |||||
mList.add(0, "更新用户或列表回调" + status+" 更新列表成功"); | |||||
}else if (status==1){ | |||||
mList.add(0, "更新用户或列表回调" + status+" 更新个人用户成功"); | |||||
}else if (status==2){ | |||||
mList.add(0, "更新用户或列表回调" + status+" 更新列表失败"); | |||||
}else { | |||||
mList.add(0, "更新用户或列表回调" + status+" 更新个人用户失败"); | |||||
if (status == 0) { | |||||
mList.add(0, "更新用户或列表回调" + status + " 更新列表成功"); | |||||
} else if (status == 1) { | |||||
mList.add(0, "更新用户或列表回调" + status + " 更新个人用户成功"); | |||||
} else if (status == 2) { | |||||
mList.add(0, "更新用户或列表回调" + status + " 更新列表失败"); | |||||
} else { | |||||
mList.add(0, "更新用户或列表回调" + status + " 更新个人用户失败"); | |||||
} | } | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void setUnitCallback(int status) { | public void setUnitCallback(int status) { | ||||
if (status==0) { | |||||
if (status == 0) { | |||||
mList.add(0, "下发单位回调" + status + " 成功"); | mList.add(0, "下发单位回调" + status + " 成功"); | ||||
}else if (status==1){ | |||||
} else if (status == 1) { | |||||
mList.add(0, "下发单位回调" + status + " 失败"); | mList.add(0, "下发单位回调" + status + " 失败"); | ||||
}else { | |||||
} else { | |||||
mList.add(0, "下发单位回调" + status + " 不支持"); | mList.add(0, "下发单位回调" + status + " 不支持"); | ||||
} | } | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
@Override | @Override | ||||
public void requestUserData(int status) { | public void requestUserData(int status) { | ||||
if (status==0x01){ | |||||
mList.add(0,"下发用户信息 "+status); | |||||
}else if (status==0x03){ | |||||
mList.add(0,"下发用户信息成功 "+status); | |||||
}else { | |||||
mList.add(0,"下发用户信息失败 "+status); | |||||
if (status == 0x01) { | |||||
mList.add(0, "下发用户信息 " + status); | |||||
} else if (status == 0x03) { | |||||
mList.add(0, "下发用户信息成功 " + status); | |||||
} else { | |||||
mList.add(0, "下发用户信息失败 " + status); | |||||
} | } | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) { | public void OnBleAndWifiStatus(int blestatus, int wifistatus, int workstatus) { | ||||
BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus); | BleLog.e(TAG, "蓝牙状态:" + blestatus + " wifi状态:" + " 工作状态:" + workstatus); | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
private boolean issetMac=false; | |||||
private boolean issetMac = false; | |||||
/** | |||||
* | |||||
* @param type | |||||
* @param status {@link BodyFatDataUtil#STATUS_SUCCESS} | |||||
* | |||||
*/ | |||||
@Override | @Override | ||||
public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) { | public void OnSetWifiNameOrPwdOrConnectCallback(int type, int status) { | ||||
if (type== BodyFatDataUtil.SET_WIFI_MAC){ | |||||
mList.add(0, "获取到设置的mac地址状态 " +status); | |||||
if (status== BodyFatDataUtil.STATUS_SUCCESS)issetMac=true; | |||||
// bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().getSelectWifiMac()); | |||||
if (type == BodyFatDataUtil.SET_WIFI_MAC) { | |||||
mList.add(0, "获取到设置的mac地址状态 " + status); | |||||
if (status == BodyFatDataUtil.STATUS_SUCCESS){ | |||||
issetMac = true; | |||||
}else { | |||||
} | |||||
} | } | ||||
if (type== BodyFatDataUtil.SET_WIFI_PAW){ | |||||
mList.add(0, "获取到设置的密码状态 " +status); | |||||
// bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().getSelectWifiPwd()); | |||||
if (issetMac)mMHandler.sendEmptyMessage(ConnectWifi); | |||||
if (type == BodyFatDataUtil.SET_WIFI_PAW) { | |||||
mList.add(0, "获取到设置的密码状态 " + status); | |||||
if (status == BodyFatDataUtil.STATUS_SUCCESS && issetMac) { | |||||
mMHandler.sendEmptyMessage(ConnectWifi); | |||||
} | |||||
} | } | ||||
if (type== BodyFatDataUtil.DIS_OR_CON_WIFI){ | |||||
mList.add(0, "发起连接 " +status); | |||||
if (type == BodyFatDataUtil.DIS_OR_CON_WIFI) { | |||||
mList.add(0, "发起连接 " + status); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void getDid(long did) { | |||||
mList.add(0, "did: " + did); | |||||
public void getDid(long sn) { | |||||
mList.add(0, "sn: " + sn); | |||||
mMHandler.sendEmptyMessage(ToRefreUi); | mMHandler.sendEmptyMessage(ToRefreUi); | ||||
} | } | ||||
@Override | @Override | ||||
public void onClick(View v) { | public void onClick(View v) { | ||||
int id = v.getId(); | int id = v.getId(); | ||||
case R.id.connect_wifi: | case R.id.connect_wifi: | ||||
try { | try { | ||||
int selectWifi = Integer.valueOf(mEditText.getText().toString().trim()); | int selectWifi = Integer.valueOf(mEditText.getText().toString().trim()); | ||||
WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi),wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||||
@Override | |||||
public void tvCancelListener(View v) { | |||||
if (mHashMap.get(selectWifi) != null && wifimacMap.get(selectWifi) != null) { | |||||
WifiDialog.newInstance().setTitle(mHashMap.get(selectWifi), wifimacMap.get(selectWifi)).setOnDialogListener(new WifiDialog.OnDialogListener() { | |||||
@Override | |||||
public void tvCancelListener(View v) { | |||||
} | |||||
} | |||||
@Override | |||||
public void tvSucceedListener(View v, String data) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWifiMac(wifimacMap.get(selectWifi))); | |||||
if (data.equals("") || data.length() > 8) { | |||||
setPaw(data); | |||||
} else { | |||||
Toast.makeText(WeightScaleWifiBle.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | |||||
@Override | |||||
public void tvSucceedListener(View v, String data) { | |||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWifiMac(wifimacMap.get(selectWifi))); | |||||
if (data.equals("") || data.length() > 8) { | |||||
setPaw(data); | |||||
} else { | |||||
Toast.makeText(WeightScaleWifiBle.this, "密码格式不对", Toast.LENGTH_SHORT).show(); | |||||
} | |||||
} | } | ||||
} | |||||
@Override | |||||
public void etModifyName(EditText v) { | |||||
@Override | |||||
public void etModifyName(EditText v) { | |||||
} | |||||
}).show(getSupportFragmentManager()); | |||||
} | |||||
}).show(getSupportFragmentManager()); | |||||
} | |||||
} catch (NumberFormatException e) { | } catch (NumberFormatException e) { | ||||
e.printStackTrace(); | e.printStackTrace(); | ||||
mMHandler.sendEmptyMessage(ConnectWifi); | mMHandler.sendEmptyMessage(ConnectWifi); | ||||
} | } | ||||
break; | break; | ||||
case R.id.setedmac: | case R.id.setedmac: | ||||
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().getSelectWifiMac()); | bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().getSelectWifiMac()); | ||||
} | } | ||||
private final int ToRefreUi = 300; | private final int ToRefreUi = 300; | ||||
private final int ConnectWifi=400; | |||||
private final int ConnectWifi = 400; | |||||
private class MHandler extends Handler { | private class MHandler extends Handler { | ||||
@Override | @Override | ||||
} | } | ||||
} | } | ||||
/** | |||||
* wifi密码一次只能传14个byte | |||||
* 如果密码长度超过14个byte 就需要分包传送 | |||||
* subpackage 为0 时,表示后面还有数据 | |||||
* subpackage 为1 时,表示数据小于或等于14个byte,后面没有数据 | |||||
* | |||||
* @param paw | |||||
*/ | |||||
private void setPaw(String paw) { | private void setPaw(String paw) { | ||||
if (paw.isEmpty()) { | if (paw.isEmpty()) { | ||||
byte[] bytes = new byte[0]; | byte[] bytes = new byte[0]; | ||||
} | } | ||||
} | } |
package aicare.net.cn.sdk.ailinksdkdemoandroid; | |||||
import android.app.AlertDialog; | |||||
import android.content.DialogInterface; | |||||
import android.content.Intent; | |||||
import android.content.pm.PackageManager; | |||||
import android.location.LocationManager; | |||||
import android.os.Build; | |||||
import android.os.Bundle; | |||||
import android.provider.Settings; | |||||
import android.util.Log; | |||||
import android.view.View; | |||||
import android.widget.ArrayAdapter; | |||||
import android.widget.Button; | |||||
import android.widget.CompoundButton; | |||||
import android.widget.EditText; | |||||
import android.widget.ListView; | |||||
import android.widget.RadioButton; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.appcompat.app.AppCompatActivity; | |||||
import androidx.core.app.ActivityCompat; | |||||
import androidx.core.content.ContextCompat; | |||||
import org.json.JSONArray; | |||||
import org.json.JSONException; | |||||
import org.json.JSONObject; | |||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.net.HttpURLConnection; | |||||
import java.net.URL; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Locale; | |||||
import cn.net.aicare.modulelibrary.module.EightBodyfatscale.EightBodyfatUtil; | |||||
import cn.net.aicare.modulelibrary.module.wifi.WifiConfig; | |||||
import cn.net.aicare.modulelibrary.module.wifi.WifiUtils; | |||||
public class WifiConfigActivity extends AppCompatActivity implements View.OnClickListener, WifiUtils.OnWifiEventListener { | |||||
private String TAG = WifiConfigActivity.class.getName(); | |||||
private EditText ssid, paw, key, sn, devicename; | |||||
private ListView mListView; | |||||
private ArrayAdapter logadapter; | |||||
private List<String> loglist; | |||||
private Button btn_connect; | |||||
private Button btn_weight_result; | |||||
private WifiUtils mWifiUtils; | |||||
private Button btn_getdeviceid; | |||||
private Button btn_login; | |||||
private Button get_record; | |||||
private String SN; | |||||
private String myDeviceId; | |||||
private String token; | |||||
private long appid; | |||||
private List<Long> bodyId; | |||||
private RadioButton kg, jing, stlb, lb; | |||||
private String mDeviceName; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
setContentView(R.layout.activity_wifi_config); | |||||
ssid = findViewById(R.id.ssid); | |||||
paw = findViewById(R.id.password); | |||||
key = findViewById(R.id.key); | |||||
btn_getdeviceid = findViewById(R.id.deviceid); | |||||
btn_weight_result = findViewById(R.id.weight_result); | |||||
get_record = findViewById(R.id.get_record); | |||||
mListView = findViewById(R.id.log_list); | |||||
btn_connect = findViewById(R.id.btn_connect); | |||||
btn_login = findViewById(R.id.btn_login); | |||||
sn = findViewById(R.id.sn); | |||||
devicename = findViewById(R.id.device_name); | |||||
btn_login.setOnClickListener(this); | |||||
btn_weight_result.setOnClickListener(this); | |||||
btn_connect.setOnClickListener(this); | |||||
btn_getdeviceid.setOnClickListener(this); | |||||
get_record.setOnClickListener(this); | |||||
findViewById(R.id.clear_log).setOnClickListener(this); | |||||
findViewById(R.id.clear_record).setOnClickListener(this); | |||||
loglist = new ArrayList<>(); | |||||
logadapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, loglist); | |||||
mListView.setAdapter(logadapter); | |||||
mWifiUtils = new WifiUtils(this, this); | |||||
mWifiUtils.setLoopSendEnable(false); | |||||
mWifiUtils.setInterval(5); | |||||
ssid.setText(mWifiUtils.getSsidstring() == null ? "Elink-wif" : mWifiUtils.getSsidstring().replace("\"", "")); | |||||
paw.setText("elink1234567890"); | |||||
key.setText("1234567812345678"); | |||||
sn.setText("574d0868174f882078a5784b1f8d48"); | |||||
devicename.setText("wifi秤"); | |||||
bodyId = new ArrayList<>(); | |||||
kg = findViewById(R.id.kg); | |||||
jing = findViewById(R.id.jin); | |||||
stlb = findViewById(R.id.st_lb); | |||||
lb = findViewById(R.id.lb); | |||||
kg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
setUnit(WifiConfig.KG); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} | |||||
} | |||||
}); | |||||
jing.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
setUnit(WifiConfig.JIN); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} | |||||
} | |||||
}); | |||||
stlb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
setUnit(WifiConfig.ST); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} | |||||
} | |||||
}); | |||||
lb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | |||||
@Override | |||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { | |||||
if (isChecked) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
setUnit(WifiConfig.LB); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
if (v.getId() == R.id.btn_connect) { | |||||
if (mWifiUtils.getRunning() == 0) { | |||||
btn_connect.setText("停止"); | |||||
mWifiUtils.startSendData(ssid.getText().toString().trim(), paw.getText().toString().trim(), key.getText().toString().trim()); | |||||
} else { | |||||
mWifiUtils.end(); | |||||
btn_connect.setText("开始配网"); | |||||
} | |||||
} else if (v.getId() == R.id.deviceid) { | |||||
SN = sn.getText().toString().trim(); | |||||
mDeviceName = devicename.getText().toString().trim(); | |||||
if (appid != 0 && token != null && !SN.isEmpty() && !mDeviceName.isEmpty()) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
getDeviceid(); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} else { | |||||
if (appid == 0 || token == null) { | |||||
loglist.add(0, "未登录"); | |||||
} | |||||
if (SN.isEmpty()) { | |||||
loglist.add(0, "没有SN号"); | |||||
} | |||||
if (mDeviceName.isEmpty()) { | |||||
loglist.add(0, "没有设备名称"); | |||||
} | |||||
} | |||||
logadapter.notifyDataSetChanged(); | |||||
} else if (v.getId() == R.id.weight_result) { | |||||
if (appid != 0 && token != null && myDeviceId != null) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
getWeight(appid, token, myDeviceId); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} else { | |||||
if (appid == 0 || token == null) { | |||||
loglist.add(0, "未登录"); | |||||
} | |||||
if (myDeviceId == null) { | |||||
loglist.add(0, "没有得到设备Id"); | |||||
} | |||||
} | |||||
logadapter.notifyDataSetChanged(); | |||||
} else if (v.getId() == R.id.btn_login) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
login(); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} else if (v.getId() == R.id.clear_log) { | |||||
loglist.clear(); | |||||
logadapter.notifyDataSetChanged(); | |||||
} else if (v.getId() == R.id.clear_record) { | |||||
if (bodyId.size() != 0) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
for (int i = 0; i < bodyId.size(); i++) { | |||||
try { | |||||
delRecord(bodyId.get(i)); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
} | |||||
}).start(); | |||||
} else { | |||||
loglist.add(0, "没有BodyFatId"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
} else if (v.getId() == R.id.get_record) { | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
getTestRecord(); | |||||
} catch (Throwable throwable) { | |||||
throwable.printStackTrace(); | |||||
} | |||||
} | |||||
}).start(); | |||||
} | |||||
} | |||||
@Override | |||||
public void onEvent(int code) { | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
switch (code) { | |||||
case WifiConfig.KEY_ILLEGAL: | |||||
loglist.add(0, "加密key非法"); | |||||
break; | |||||
case WifiConfig.ERROR_EXCEPTIONAL: | |||||
loglist.add(0, "异常"); | |||||
break; | |||||
case WifiConfig.INFORMATION_SUCCESSFUL: | |||||
loglist.add(0, "生成数据类info 成功"); | |||||
break; | |||||
case WifiConfig.DEVICE_CONNECTION_SUCCESSFUL: | |||||
mWifiUtils.end(); | |||||
loglist.add(0, "设备联网成功成功"); | |||||
btn_connect.setText("开始配网"); | |||||
//调取登录 通过SN号去获取deviceId | |||||
break; | |||||
case WifiConfig.START_SEND_DATA: | |||||
loglist.add(0, "开始发送加密包"); | |||||
break; | |||||
case WifiConfig.ERROR_START_SEND_DATA: | |||||
loglist.add(0, "开始发送加密包,出错"); | |||||
break; | |||||
case WifiConfig.START_RECEIVE_DATA: | |||||
loglist.add(0, "开始接收设备数据"); | |||||
break; | |||||
case WifiConfig.ERROR_START_RECEIVE_DATA: | |||||
loglist.add(0, "开始接收设备数据,出错"); | |||||
break; | |||||
case WifiConfig.SSID_KEY_NULL: | |||||
loglist.add(0, "ssid为空或key为空"); | |||||
break; | |||||
} | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
mWifiUtils.onDestory(); | |||||
} | |||||
public void login() throws Throwable { | |||||
URL uri = new URL("http://test.ailink.app.aicare.net.cn/api/user/login?key=inet_elink&username=dhls@qq.com&password=dc483e80a7a0bd9ef71d8cf973673924"); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// Post请求必须设置允许输出 | |||||
httpURLConnection.setDoOutput(true); | |||||
// Post请求不能使用缓存 | |||||
httpURLConnection.setUseCaches(false); | |||||
// 设置为Post请求 | |||||
httpURLConnection.setRequestMethod("POST"); | |||||
httpURLConnection.setInstanceFollowRedirects(true); | |||||
// 配置请求Content-Type | |||||
httpURLConnection.setRequestProperty("Content-Type", | |||||
"application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
Log.i(TAG, result); | |||||
JSONObject jsonObject = new JSONObject(result); | |||||
JSONObject datajson = jsonObject.getJSONObject("data"); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
token = jsonObject.getString("token"); | |||||
appid = datajson.getLong("appUserId"); | |||||
loglist.add(0, "登录成功"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} catch (JSONException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
}); | |||||
} else { | |||||
Log.i(TAG, "Post方式请求失败"); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "登录失败"); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
public void getWeight(long appid, String token, String deviceId) throws Throwable { | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/list?key=inet_elink&appUserId="); | |||||
stringBuilder.append(appid); | |||||
stringBuilder.append("&token="); | |||||
stringBuilder.append(token); | |||||
stringBuilder.append("&deviceId="); | |||||
stringBuilder.append(deviceId); | |||||
stringBuilder.append("&subUserId=1&maxId=0"); | |||||
URL uri = new URL(stringBuilder.toString()); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// // Post请求必须设置允许输出 | |||||
// httpURLConnection.setDoOutput(true); | |||||
// // Post请求不能使用缓存 | |||||
// httpURLConnection.setUseCaches(false); | |||||
// 设置为Post请求 | |||||
// httpURLConnection.setRequestMethod("GET"); | |||||
// httpURLConnection.setInstanceFollowRedirects(true); | |||||
// // 配置请求Content-Type | |||||
// httpURLConnection.setRequestProperty("Content-Type", | |||||
// "application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
JSONObject jsonObject = new JSONObject(result); | |||||
JSONArray datajson = jsonObject.getJSONArray("data"); | |||||
bodyId.clear(); | |||||
for (int i = 0; i < datajson.length(); i++) { | |||||
bodyId.add(datajson.getJSONObject(i).getLong("bodyFatId")); | |||||
} | |||||
Log.i(TAG, result); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, result); | |||||
logadapter.notifyDataSetChanged(); | |||||
loglist.add(0, "总共有:" + bodyId.size()); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} else { | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "请求失败"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
public void getDeviceid() throws Throwable { | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/getDeviceBySN?key=inet_elink&appUserId="); | |||||
stringBuilder.append(appid); | |||||
stringBuilder.append("&token="); | |||||
stringBuilder.append(token); | |||||
stringBuilder.append("&deviceSN="); | |||||
stringBuilder.append(SN); | |||||
Log.e(TAG, stringBuilder.toString()); | |||||
URL uri = new URL(stringBuilder.toString()); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// Post请求必须设置允许输出 | |||||
httpURLConnection.setDoOutput(true); | |||||
// Post请求不能使用缓存 | |||||
httpURLConnection.setUseCaches(false); | |||||
// 设置为Post请求 | |||||
httpURLConnection.setRequestMethod("POST"); | |||||
httpURLConnection.setInstanceFollowRedirects(true); | |||||
// 配置请求Content-Type | |||||
httpURLConnection.setRequestProperty("Content-Type", | |||||
"application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
Log.i(TAG, result); | |||||
JSONObject jsonObject = new JSONObject(result); | |||||
JSONArray datajson = jsonObject.getJSONArray("data"); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
if (datajson.length() > 0) | |||||
myDeviceId = datajson.getJSONObject(0).getString("deviceId"); | |||||
loglist.add(0, "设备信息" + result); | |||||
logadapter.notifyDataSetChanged(); | |||||
} catch (JSONException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
}); | |||||
bindDevice(); | |||||
} else { | |||||
Log.i(TAG, "Post方式请求失败"); | |||||
} | |||||
} | |||||
public void bindDevice() throws Throwable { | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId="); | |||||
stringBuilder.append(appid); | |||||
stringBuilder.append("&token="); | |||||
stringBuilder.append(token); | |||||
stringBuilder.append("&deviceId="); | |||||
stringBuilder.append(myDeviceId); | |||||
stringBuilder.append("&roomId=4326&deviceName="); | |||||
stringBuilder.append(mDeviceName); | |||||
URL uri = new URL(stringBuilder.toString()); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// Post请求必须设置允许输出 | |||||
httpURLConnection.setDoOutput(true); | |||||
// Post请求不能使用缓存 | |||||
httpURLConnection.setUseCaches(false); | |||||
// 设置为Post请求 | |||||
httpURLConnection.setRequestMethod("POST"); | |||||
httpURLConnection.setInstanceFollowRedirects(true); | |||||
// 配置请求Content-Type | |||||
httpURLConnection.setRequestProperty("Content-Type", | |||||
"application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
Log.i(TAG, result); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "绑定设备" + result); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} else { | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "绑定设备失败"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
public void delRecord(Long bodyid) throws Throwable { | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/BFScale/delete?key=inet_elink&appUserId="); | |||||
stringBuilder.append(appid); | |||||
stringBuilder.append("&token="); | |||||
stringBuilder.append(token); | |||||
stringBuilder.append("&bodyFatId="); | |||||
stringBuilder.append(bodyid); | |||||
stringBuilder.append(""); | |||||
URL uri = new URL(stringBuilder.toString()); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// Post请求必须设置允许输出 | |||||
httpURLConnection.setDoOutput(true); | |||||
// Post请求不能使用缓存 | |||||
httpURLConnection.setUseCaches(false); | |||||
// 设置为Post请求 | |||||
httpURLConnection.setRequestMethod("POST"); | |||||
httpURLConnection.setInstanceFollowRedirects(true); | |||||
// 配置请求Content-Type | |||||
httpURLConnection.setRequestProperty("Content-Type", | |||||
"application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
Log.i(TAG, result); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, result); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} else { | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "请求失败"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
public byte[] readInputStream(InputStream inputStream) throws IOException { | |||||
byte[] buffer = new byte[1024]; | |||||
int len = 0; | |||||
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |||||
while ((len = inputStream.read(buffer)) != -1) { | |||||
bos.write(buffer, 0, len); | |||||
} | |||||
bos.close(); | |||||
return bos.toByteArray(); | |||||
} | |||||
public void setUnit(int unit) throws Throwable { | |||||
if (appid == 0 || token == null || SN == null || SN.isEmpty() || mDeviceName == null || mDeviceName.isEmpty()) { | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "请先登录,然后获取设备id"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
return; | |||||
} | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
// http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId=10429&token=57dce920-8521-42e9-9040-157d08c7d922&deviceId=3001&roomId=4326&deviceName=WIFI秤测试&deviceUnit=1 | |||||
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/device/update?key=inet_elink&appUserId="); | |||||
stringBuilder.append(appid); | |||||
stringBuilder.append("&token="); | |||||
stringBuilder.append(token); | |||||
stringBuilder.append("&deviceId="); | |||||
stringBuilder.append(myDeviceId); | |||||
stringBuilder.append("&roomId=4326&deviceName="); | |||||
stringBuilder.append(mDeviceName); | |||||
stringBuilder.append("&deviceUnit="); | |||||
stringBuilder.append(unit); | |||||
Log.e("设置单位", stringBuilder.toString()); | |||||
URL uri = new URL(stringBuilder.toString()); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// Post请求必须设置允许输出 | |||||
httpURLConnection.setDoOutput(true); | |||||
// Post请求不能使用缓存 | |||||
httpURLConnection.setUseCaches(false); | |||||
// 设置为Post请求 | |||||
httpURLConnection.setRequestMethod("POST"); | |||||
httpURLConnection.setInstanceFollowRedirects(true); | |||||
// 配置请求Content-Type | |||||
httpURLConnection.setRequestProperty("Content-Type", | |||||
"application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
Log.i(TAG, result); | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, result); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} else { | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "请求失败"); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
public void getTestRecord() throws Throwable { | |||||
StringBuilder stringBuilder = new StringBuilder(); | |||||
stringBuilder.append("http://test.ailink.app.aicare.net.cn/api/deDataTest/getDeDataTestPage?key=inet_elink&appUserId="); | |||||
stringBuilder.append(appid); | |||||
stringBuilder.append("&token="); | |||||
stringBuilder.append(token); | |||||
stringBuilder.append("&maxId=0"); | |||||
stringBuilder.append("&sortColumns="); | |||||
stringBuilder.append("id desc"); | |||||
Log.e(TAG, stringBuilder.toString()); | |||||
URL uri = new URL(stringBuilder.toString()); | |||||
HttpURLConnection httpURLConnection = (HttpURLConnection) uri.openConnection(); | |||||
// // Post请求必须设置允许输出 | |||||
// httpURLConnection.setDoOutput(true); | |||||
// // Post请求不能使用缓存 | |||||
// httpURLConnection.setUseCaches(false); | |||||
// // 设置为Post请求 | |||||
// httpURLConnection.setRequestMethod("POST"); | |||||
// httpURLConnection.setInstanceFollowRedirects(true); | |||||
// // 配置请求Content-Type | |||||
// httpURLConnection.setRequestProperty("Content-Type", | |||||
// "application/x-www-form-urlencode"); | |||||
// 设置连接超时时间 | |||||
httpURLConnection.setConnectTimeout(6 * 1000); | |||||
// 开始连接 | |||||
httpURLConnection.connect(); | |||||
// DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream()); | |||||
// dos.write(map.toString().getBytes()); | |||||
// dos.flush(); | |||||
// dos.close(); | |||||
// 判断请求是否成功 | |||||
if (httpURLConnection.getResponseCode() == 200) { | |||||
// 获取返回的数据 | |||||
byte[] data = readInputStream(httpURLConnection.getInputStream()); | |||||
String result = new String(data, "UTF-8"); | |||||
Log.i(TAG, result); | |||||
JSONObject jsonObject = new JSONObject(result); | |||||
JSONObject datajson = jsonObject.getJSONObject("data"); | |||||
JSONArray listjson = datajson.getJSONArray("list"); | |||||
StringBuffer stringBuffer = new StringBuffer(); | |||||
for (int i = 0; i < listjson.length(); i++) { | |||||
long id = listjson.getJSONObject(i).getLong("id"); | |||||
// String createTime="数据时间 "+getDateDefault(listjson.getJSONObject(i).getLong("createTime")); | |||||
String encryptData = "请求的加密值: " + listjson.getJSONObject(i).getString("encryptData"); | |||||
// String decryptData = "解密结果: " + listjson.getJSONObject(i).getString("decryptData"); | |||||
stringBuffer.append("id: "); | |||||
stringBuffer.append(id); | |||||
stringBuffer.append("\n"); | |||||
stringBuffer.append(encryptData); | |||||
stringBuffer.append("\n=================\n"); | |||||
} | |||||
runOnUiThread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
loglist.add(0, "测试数据\n" + stringBuffer.toString()); | |||||
logadapter.notifyDataSetChanged(); | |||||
} | |||||
}); | |||||
} else { | |||||
} | |||||
} | |||||
public static String getDateDefault(Long time) { | |||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); | |||||
return simpleDateFormat.format(time); | |||||
} | |||||
public void getPermission() { | |||||
String[] permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION,}; | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
//当前系统大于等于6.0 | |||||
for (String perssion : permissions) { | |||||
int isGranted = ContextCompat.checkSelfPermission(this, perssion); | |||||
if (isGranted != PackageManager.PERMISSION_GRANTED) { | |||||
ActivityCompat.requestPermissions(this, new String[]{perssion}, 1); | |||||
} | |||||
} | |||||
LocationManager lm = (LocationManager) this.getSystemService(this.LOCATION_SERVICE); | |||||
if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) { | |||||
/*Toast.makeText(this, "检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启", Toast.LENGTH_SHORT).show(); | |||||
new Thread(new Runnable() { | |||||
@Override | |||||
public void run() { | |||||
try { | |||||
Thread.sleep(3 * 1000); //sleep s | |||||
} catch (InterruptedException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
}).start();*/ | |||||
AlertDialog dialog = new AlertDialog.Builder(this) | |||||
.setTitle("警告!") | |||||
.setMessage("检测到未开启GPS定位服务,需要开启才能扫描到附件WiFi信息,请开启") | |||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||||
startActivityForResult(intent, 1); | |||||
} | |||||
}).show(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { | |||||
switch (requestCode) { | |||||
case 1: { | |||||
// If request is cancelled, the result arrays are empty. | |||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||||
Log.d("Mainactivity", "onRequestPermissionsResult granted"); | |||||
} else { | |||||
Log.d("Mainactivity", "onRequestPermissionsResult denied"); | |||||
AlertDialog dialog = new AlertDialog.Builder(this) | |||||
.setTitle("警告!") | |||||
.setMessage("需要授予定位权限才能扫描到附件WiFi信息") | |||||
.setPositiveButton("确定", new DialogInterface.OnClickListener() { | |||||
@Override | |||||
public void onClick(DialogInterface dialog, int which) { | |||||
//一般情况下如果用户不授权的话,功能是无法运行的,做退出处理 | |||||
finish(); | |||||
} | |||||
}).show(); | |||||
} | |||||
break; | |||||
} | |||||
default: | |||||
break; | |||||
} | |||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.base; | |||||
import android.Manifest; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.content.Intent; | |||||
import android.content.pm.ActivityInfo; | |||||
import android.content.pm.PackageManager; | |||||
import android.os.Build; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Message; | |||||
import android.view.KeyEvent; | |||||
import android.view.MenuItem; | |||||
import android.view.MotionEvent; | |||||
import android.view.View; | |||||
import android.view.inputmethod.InputMethodManager; | |||||
import android.widget.TextView; | |||||
import com.pingwang.bluetoothlib.BleBaseActivity; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart; | |||||
import java.lang.ref.WeakReference; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.appcompat.widget.Toolbar; | |||||
import androidx.core.app.ActivityCompat; | |||||
import androidx.core.content.ContextCompat; | |||||
import butterknife.ButterKnife; | |||||
import butterknife.Unbinder; | |||||
/** | |||||
* 2019/4/16 11:55 | |||||
* activity的基类, 共有的功能都可以写在这里 | |||||
*/ | |||||
public abstract class BleAppBaseActivity extends BleBaseActivity { | |||||
/** | |||||
* 上下文对象 | |||||
*/ | |||||
protected Context mContext; | |||||
protected String TAG = this.getClass().getName(); | |||||
protected Handler mHandler = new MyHandler(this); | |||||
@Nullable | |||||
protected TextView mTvTopTitle; | |||||
@Nullable | |||||
protected Toolbar mToolbar; | |||||
private Unbinder bind; | |||||
//--------------ble--------------- | |||||
/** | |||||
* 需要申请的权限 | |||||
*/ | |||||
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}; | |||||
/** | |||||
* 权限请求返回 | |||||
*/ | |||||
private final int PERMISSION = 101; | |||||
/** | |||||
* 定位服务返回 | |||||
*/ | |||||
protected final int LOCATION_SERVER = 102; | |||||
private HintDataDialogFragment mHintDataDialog = null; | |||||
@Override | |||||
protected void onCreate(@Nullable Bundle savedInstanceState) { | |||||
super.onCreate(savedInstanceState); | |||||
if (getLayoutId() != 0) { | |||||
initWindows(); | |||||
setContentView(getLayoutId()); | |||||
SaveActivityData(savedInstanceState); | |||||
mContext = this; | |||||
init(); | |||||
} else if (getLayoutView() != null) { | |||||
initWindows(); | |||||
setContentView(getLayoutView()); | |||||
SaveActivityData(savedInstanceState); | |||||
mContext = this; | |||||
init(); | |||||
} | |||||
} | |||||
protected void SaveActivityData(Bundle savedInstanceState) { | |||||
} | |||||
/** | |||||
* handler消息,使用弱引用,避免泄露问题 | |||||
*/ | |||||
private static class MyHandler extends Handler { | |||||
private WeakReference<BleAppBaseActivity> mActivity; | |||||
MyHandler(BleAppBaseActivity activity) { | |||||
mActivity = new WeakReference<>(activity); | |||||
} | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
if (mActivity.get() == null) { | |||||
return; | |||||
} | |||||
mActivity.get().uiHandlerMessage(msg); | |||||
} | |||||
} | |||||
/** | |||||
* handler消息处理 | |||||
*/ | |||||
protected abstract void uiHandlerMessage(Message msg); | |||||
/** | |||||
* 在绑定布局前的操作(状态,任务栏等的设置) | |||||
*/ | |||||
protected void initWindows() { | |||||
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//禁止横屏 | |||||
//设置状态栏文字为黑色 | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); | |||||
} | |||||
} | |||||
/** | |||||
* 获取当前activity的布局 | |||||
* | |||||
* @return int | |||||
*/ | |||||
protected abstract int getLayoutId(); | |||||
/** | |||||
* 获取当前activity的布局 | |||||
* | |||||
* @return View | |||||
*/ | |||||
protected View getLayoutView() { | |||||
return null; | |||||
} | |||||
/** | |||||
* 初始化 | |||||
*/ | |||||
protected final void init() { | |||||
bind = ButterKnife.bind(this); | |||||
addInit(); | |||||
initView(); | |||||
initData(); | |||||
initListener(); | |||||
} | |||||
protected void addInit() { | |||||
} | |||||
//-----------------------权限---------------------------------------- | |||||
protected void initPermissions() { | |||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | |||||
onPermissionsOk(); | |||||
return; | |||||
} | |||||
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) | |||||
.setDialogListener(new HintDataDialogFragment.DialogListener() { | |||||
@Override | |||||
public void tvSucceedListener(View v) { | |||||
startLocationActivity(); | |||||
} | |||||
}); | |||||
mHintDataDialog.show(getSupportFragmentManager()); | |||||
} else { | |||||
onPermissionsOk(); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | |||||
@NonNull int[] grantResults) { | |||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults); | |||||
//请求权限被拒绝 | |||||
if (requestCode != PERMISSION) | |||||
return; | |||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |||||
initPermissions(); | |||||
} else { | |||||
if (ActivityCompat.shouldShowRequestPermissionRationale(BleAppBaseActivity.this, | |||||
LOCATION_PERMISSION[0])) { | |||||
//权限请求失败,但未选中“不再提示”选项,再次请求 | |||||
ActivityCompat.requestPermissions(this, LOCATION_PERMISSION, PERMISSION); | |||||
} else { | |||||
//权限请求失败,选中“不再提示”选项 | |||||
mHintDataDialog = HintDataDialogFragment.newInstance() | |||||
.setTitle("提示", 0) | |||||
.setCancel("取消",0) | |||||
.setOk("确定",0) | |||||
.setContent("请求开启定位权限", true) | |||||
.setDialogListener(new HintDataDialogFragment.DialogListener() { | |||||
@Override | |||||
public void tvSucceedListener(View v) { | |||||
AppStart.startUseSetActivity(mContext); | |||||
} | |||||
}); | |||||
mHintDataDialog.show(getSupportFragmentManager()); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 启动去设置定位服务 | |||||
*/ | |||||
protected void startLocationActivity() { | |||||
AppStart.startLocationActivity(BleAppBaseActivity.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(); | |||||
} | |||||
} | |||||
/** | |||||
* 初始化事件 | |||||
*/ | |||||
protected abstract void initListener(); | |||||
/** | |||||
* 初始化数据 | |||||
*/ | |||||
protected abstract void initData(); | |||||
/** | |||||
* 初始化,绑定布局 | |||||
*/ | |||||
protected abstract void initView(); | |||||
// @Override | |||||
// public boolean onCreateOptionsMenu(Menu menu) { | |||||
// getMenuInflater().inflate(R.menu.public_toolbar_menu, menu); | |||||
// MenuItem item = menu.findItem(R.id.img_public_right); | |||||
// if (item != null) { | |||||
// item.setIcon(R.drawable.me_manssage); | |||||
// } | |||||
// return true; | |||||
// } | |||||
@Override | |||||
public boolean onOptionsItemSelected(MenuItem item) { | |||||
int i = item.getItemId(); | |||||
if (i == android.R.id.home) { | |||||
myFinish(); | |||||
return true; | |||||
} | |||||
return super.onOptionsItemSelected(item); | |||||
} | |||||
/** | |||||
* 返回键 | |||||
*/ | |||||
@Override | |||||
public boolean onKeyDown(int keyCode, KeyEvent event) { | |||||
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { | |||||
myFinish(); | |||||
return true; | |||||
} | |||||
return super.onKeyDown(keyCode, event); | |||||
} | |||||
/** | |||||
* 返回 | |||||
*/ | |||||
protected void myFinish() { | |||||
finish(); | |||||
} | |||||
protected void onClickRight() { | |||||
} | |||||
@Override | |||||
protected void onStart() { | |||||
super.onStart(); | |||||
} | |||||
@Override | |||||
protected void onRestart() { | |||||
super.onRestart(); | |||||
} | |||||
@Override | |||||
protected void onResume() { | |||||
super.onResume(); | |||||
} | |||||
@Override | |||||
protected void onPause() { | |||||
super.onPause(); | |||||
} | |||||
@Override | |||||
protected void onStop() { | |||||
super.onStop(); | |||||
} | |||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
if (mHandler != null) { | |||||
mHandler.removeCallbacksAndMessages(null); | |||||
} | |||||
if (bind != null) | |||||
bind.unbind(); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.config; | |||||
/** | |||||
* xing<br> | |||||
* 2019/3/5<br> | |||||
* 设备相关信息配置 | |||||
*/ | |||||
public class BleDeviceConfig { | |||||
//--------------------设备类型----------------------- | |||||
/** | |||||
* 血压计(sphygmomanometer) | |||||
* | |||||
*/ | |||||
public final static int BLOOD_PRESSURE =0x01; | |||||
/** | |||||
* 额温枪(Forehead gun) | |||||
*/ | |||||
public final static int INFRARED_THERMOMETER =0x02; | |||||
/** | |||||
* 体温计(thermometer) | |||||
*/ | |||||
public final static int THERMOMETER =0x03; | |||||
/** | |||||
* 婴儿秤(Baby scale) | |||||
*/ | |||||
public final static int BABY_SCALE =0x04; | |||||
/** | |||||
* 身高仪(Height gauge) | |||||
*/ | |||||
public final static int HEIGHT_METER =0x05; | |||||
/** | |||||
* 智能门锁(Smart door lock) | |||||
*/ | |||||
public final static int SMART_LOCK =0x0B; | |||||
/** | |||||
* 定制版遥控器(Customized remote control) | |||||
*/ | |||||
public final static int EL_REMOTE_CONTROL =0x0C; | |||||
/** | |||||
* 连接类型的TPMS(Connection type TPMS) | |||||
*/ | |||||
public final static int TPMS_CONN_DEVICE =0x0D; | |||||
/** | |||||
* 体重体脂称(Body fat scale) | |||||
*/ | |||||
public final static int WEIGHT_BODY_FAT_SCALE =0x0E; | |||||
/** | |||||
* 箱包锁(Luggage lock) | |||||
*/ | |||||
public final static int LUGGAGE_LOCK =0x0F; | |||||
/** | |||||
* 锁遥控器(Lock the remote control) | |||||
*/ | |||||
public final static int LOCK_REMOTE_CONTROL =0x10; | |||||
/** | |||||
* wifi+ble体脂秤(wifi + ble body fat scale) | |||||
*/ | |||||
public final static int WEIGHT_BODY_FAT_SCALE_WIFI_BLE=0x11; | |||||
/** | |||||
* wifi+ble牙刷(wifi + ble body fat scale) | |||||
*/ | |||||
public final static int TOOTHBRUSH_WIFI_BLE=0x12; | |||||
/** | |||||
* 八电极体脂秤 | |||||
*/ | |||||
public final static int EIGHT_BODY_FAT_SCALE =0x13; | |||||
/** | |||||
* 风速计 | |||||
* cid 为0x14 | |||||
*/ | |||||
public final static int ANEMOMETER=0x14; | |||||
/** | |||||
* 钳表 | |||||
* cid 为0x15 | |||||
*/ | |||||
public final static int CLAMP_TABLE=0x15; | |||||
/** | |||||
* 体重体脂称(Body fat scale)艾迪 | |||||
*/ | |||||
public final static int WEIGHT_BODY_FAT_SCALE_AD =0x100E; | |||||
/** | |||||
* 婴儿体脂两用秤 | |||||
*/ | |||||
public final static int BABY_BODY_FAT =0x1A; | |||||
/** | |||||
* 血糖仪 | |||||
*/ | |||||
public final static int BLOOD_GLUCOSE=0x1c; | |||||
/** | |||||
* 运动手表 华盛达手表 | |||||
*/ | |||||
public final static int SPORTS_WATCH_BLE = 0x1D; | |||||
/** | |||||
* 广播秤 | |||||
*/ | |||||
public final static int BROADCAST_SCALE =0x10001; | |||||
/** | |||||
* 智能口罩 | |||||
*/ | |||||
public final static int SMART_MASK =0x0022; | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||||
import android.content.Context; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.widget.TextView; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
import java.util.List; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
/** | |||||
* xing<br> | |||||
* 2019/8/24<br> | |||||
* dialog列表<br> | |||||
*/ | |||||
public class DialogStringImageAdapter extends RecyclerView.Adapter<DialogStringImageAdapter.KeyViewHolder> { | |||||
private List<DialogStringImageBean> mList; | |||||
private OnItemClickListener listener; | |||||
private Context mContext; | |||||
public interface OnItemClickListener { | |||||
void onItemClick(int position); | |||||
} | |||||
public DialogStringImageAdapter(Context context, List<DialogStringImageBean> list, OnItemClickListener listener) { | |||||
mList = list; | |||||
this.listener = listener; | |||||
mContext = context; | |||||
} | |||||
@NonNull | |||||
@Override | |||||
public KeyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | |||||
View view = LayoutInflater.from(mContext).inflate(R.layout.item_string_dialog_list, parent, false); | |||||
return new KeyViewHolder(view, listener); | |||||
} | |||||
@Override | |||||
public void onBindViewHolder(@NonNull KeyViewHolder holder, int position) { | |||||
DialogStringImageBean bean = mList.get(position); | |||||
holder.mTvTitle.setText(bean.getName()); | |||||
} | |||||
@Override | |||||
public int getItemCount() { | |||||
return mList.size(); | |||||
} | |||||
static class KeyViewHolder extends RecyclerView.ViewHolder { | |||||
private TextView mTvTitle; | |||||
KeyViewHolder(@NonNull View itemView, final OnItemClickListener listener) { | |||||
super(itemView); | |||||
mTvTitle = itemView.findViewById(R.id.tv_dialog_list_data); | |||||
itemView.setOnClickListener(v -> { | |||||
if (listener != null) | |||||
listener.onItemClick(getLayoutPosition()); | |||||
}); | |||||
} | |||||
} | |||||
public static class DialogStringImageBean{ | |||||
String mName; | |||||
long mType; | |||||
public DialogStringImageBean(String name, long type) { | |||||
mName = name; | |||||
mType = type; | |||||
} | |||||
public String getName() { | |||||
return mName; | |||||
} | |||||
public void setName(String name) { | |||||
mName = name; | |||||
} | |||||
public long getType() { | |||||
return mType; | |||||
} | |||||
public void setType(long type) { | |||||
mType = type; | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||||
import android.app.Dialog; | |||||
import android.content.Context; | |||||
import android.content.DialogInterface; | |||||
import android.graphics.Color; | |||||
import android.graphics.drawable.ColorDrawable; | |||||
import android.os.Bundle; | |||||
import android.util.DisplayMetrics; | |||||
import android.view.Gravity; | |||||
import android.view.KeyEvent; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.view.Window; | |||||
import android.view.WindowManager; | |||||
import android.widget.TextView; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||||
import androidx.annotation.ColorInt; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.fragment.app.DialogFragment; | |||||
import androidx.fragment.app.FragmentManager; | |||||
/** | |||||
* 显示信息的弹框 | |||||
*/ | |||||
public class HintDataDialogFragment extends DialogFragment { | |||||
private static String TAG = HintDataDialogFragment.class.getName(); | |||||
private Context mContext; | |||||
private DialogListener mDialogListener; | |||||
private TextView mTvTitle; | |||||
private TextView mTvCancel, mTvSucceed, mTvContent; | |||||
private View view_cancel_line; | |||||
private CharSequence mTitle; | |||||
private CharSequence mContent; | |||||
/** | |||||
* 是否居中 | |||||
*/ | |||||
private boolean isCenter = false; | |||||
private CharSequence mCancel; | |||||
@ColorInt | |||||
private int mCancelColor = 0; | |||||
private CharSequence mOkStr; | |||||
@ColorInt | |||||
private int mOkColor = 0; | |||||
@ColorInt | |||||
private int mTitleColor = 0; | |||||
private boolean mBottom; | |||||
/** | |||||
* 是否显示灰色背景 | |||||
*/ | |||||
private boolean mBackground=true; | |||||
/** | |||||
* 点击空白区域是否关闭 | |||||
*/ | |||||
private boolean mCancelBlank; | |||||
/** | |||||
* 是否显示 | |||||
*/ | |||||
private boolean mShow; | |||||
public static HintDataDialogFragment newInstance() { | |||||
return new HintDataDialogFragment(); | |||||
} | |||||
private HintDataDialogFragment() { | |||||
} | |||||
@NonNull | |||||
@Override | |||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||||
L.i(TAG, "onCreateDialog"); | |||||
Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||||
dialogView.setCancelable(false);//设置是否可以关闭 | |||||
dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消 | |||||
dialogView.setOnKeyListener((dialog, keyCode, event) -> { | |||||
if (mCancelBlank) { | |||||
return false; | |||||
} else { | |||||
//返回不关闭 | |||||
return keyCode == KeyEvent.KEYCODE_BACK; | |||||
} | |||||
}); | |||||
return dialogView; | |||||
} | |||||
@Nullable | |||||
@Override | |||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, | |||||
@Nullable Bundle savedInstanceState) { | |||||
L.i(TAG, "onCreateView"); | |||||
return inflater.inflate(R.layout.dialog_hint_data, container);// 得到加载view | |||||
} | |||||
@Override | |||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { | |||||
super.onViewCreated(view, savedInstanceState); | |||||
mContext = view.getContext(); | |||||
initView(view); | |||||
initData(); | |||||
} | |||||
@Override | |||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) { | |||||
super.onActivityCreated(savedInstanceState); | |||||
L.i(TAG, "onActivityCreated"); | |||||
Dialog dialog = getDialog(); | |||||
if (dialog != null) { | |||||
getDialog().setOnShowListener(null); | |||||
getDialog().setOnCancelListener(null); | |||||
getDialog().setOnDismissListener(null); | |||||
Window window = dialog.getWindow(); | |||||
if (window != null) { | |||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); | |||||
WindowManager.LayoutParams params = window.getAttributes(); | |||||
if (mBackground) { | |||||
params.dimAmount = 0.8f; | |||||
} else { | |||||
params.dimAmount = 0f; | |||||
} | |||||
if (mBottom) { | |||||
params.y = 10;//设置Dialog距离底部的距离 | |||||
params.gravity = Gravity.BOTTOM; | |||||
} | |||||
window.setAttributes(params); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 初始化控件,数据 | |||||
*/ | |||||
private void initView(View mDialogView) { | |||||
mTvTitle = mDialogView.findViewById(R.id.tv_hint_data_title); | |||||
mTvCancel = mDialogView.findViewById(R.id.tv_hint_data_cancel); | |||||
view_cancel_line = mDialogView.findViewById(R.id.view_cancel_line); | |||||
mTvSucceed = mDialogView.findViewById(R.id.tv_hint_data_ok); | |||||
mTvContent = mDialogView.findViewById(R.id.tv_hint_data_context); | |||||
mTvCancel.setOnClickListener(v -> { | |||||
if (mDialogListener != null) { | |||||
mDialogListener.tvCancelListener(v); | |||||
} | |||||
this.dismiss(); | |||||
}); | |||||
mTvSucceed.setOnClickListener(v -> { | |||||
if (mDialogListener != null) { | |||||
mDialogListener.tvSucceedListener(v); | |||||
} | |||||
this.dismiss(); | |||||
}); | |||||
} | |||||
private void initData() { | |||||
this.initData(mTitle, mContent, isCenter, mCancel, mOkStr); | |||||
this.initColor(mCancelColor, mOkColor); | |||||
} | |||||
/** | |||||
* 设置取消,确定按钮颜色 | |||||
* | |||||
* @param cancelColor 取消的颜色 | |||||
* @param okColor 确定的颜色 | |||||
*/ | |||||
public HintDataDialogFragment initColor(@ColorInt int cancelColor, @ColorInt int okColor) { | |||||
this.mCancelColor = cancelColor; | |||||
this.mOkColor = okColor; | |||||
if (mTvCancel != null && mCancelColor != 0) | |||||
mTvCancel.setTextColor(mCancelColor); | |||||
if (mTvSucceed != null && mOkColor != 0) | |||||
mTvSucceed.setTextColor(mOkColor); | |||||
return this; | |||||
} | |||||
public HintDataDialogFragment setContent(CharSequence content, boolean center) { | |||||
this.mContent = content; | |||||
this.isCenter = center; | |||||
if (mTvContent != null) { | |||||
if (mContent != null && !mContent.equals("")) { | |||||
mTvContent.setVisibility(View.VISIBLE); | |||||
mTvContent.setText(mContent); | |||||
} else if (mContent == null) { | |||||
mTvContent.setVisibility(View.GONE); | |||||
} | |||||
if (isCenter) | |||||
mTvContent.setGravity(Gravity.CENTER); | |||||
else | |||||
mTvContent.setGravity(Gravity.CENTER_VERTICAL); | |||||
} | |||||
return this; | |||||
} | |||||
public HintDataDialogFragment setTitle(CharSequence title, @ColorInt int titleColor) { | |||||
this.mTitle = title; | |||||
this.mTitleColor = titleColor; | |||||
if (mTvTitle != null) { | |||||
if (mTitle != null && !mTitle.equals("")) { | |||||
mTvTitle.setVisibility(View.VISIBLE); | |||||
mTvTitle.setText(mTitle); | |||||
} else if (mTitle == null) { | |||||
mTvTitle.setVisibility(View.GONE); | |||||
} | |||||
if (mTitleColor != 0) { | |||||
mTvTitle.setTextColor(mTitleColor); | |||||
} | |||||
} | |||||
return this; | |||||
} | |||||
public HintDataDialogFragment setCancel(CharSequence cancel, @ColorInt int cancelColor) { | |||||
this.mCancel = cancel; | |||||
this.mCancelColor = cancelColor; | |||||
if (mTvCancel != null) { | |||||
if (mCancel != null && !mCancel.equals("")) { | |||||
mTvCancel.setVisibility(View.VISIBLE); | |||||
view_cancel_line.setVisibility(View.VISIBLE); | |||||
mTvCancel.setText(mCancel); | |||||
} else if (mCancel == null) { | |||||
mTvCancel.setVisibility(View.GONE); | |||||
view_cancel_line.setVisibility(View.GONE); | |||||
} | |||||
if (mCancelColor != 0) { | |||||
mTvCancel.setTextColor(mCancelColor); | |||||
} | |||||
} | |||||
return this; | |||||
} | |||||
public HintDataDialogFragment setOk(CharSequence ok, @ColorInt int okColor) { | |||||
this.mOkStr = ok; | |||||
this.mOkColor = okColor; | |||||
if (mTvSucceed != null) { | |||||
if (mOkStr != null && !mOkStr.equals("")) { | |||||
mTvSucceed.setVisibility(View.VISIBLE); | |||||
mTvSucceed.setText(mOkStr); | |||||
} else if (mOkStr == null) { | |||||
mTvSucceed.setVisibility(View.GONE); | |||||
} | |||||
if (mOkColor != 0) | |||||
mTvSucceed.setTextColor(mOkColor); | |||||
} | |||||
return this; | |||||
} | |||||
/** | |||||
* 设置dialog是否在底部 | |||||
*/ | |||||
public HintDataDialogFragment setBottom(boolean bottom) { | |||||
mBottom = bottom; | |||||
return this; | |||||
} | |||||
/** | |||||
* 设置dialog是否有灰色背景 | |||||
*/ | |||||
public HintDataDialogFragment setBackground(boolean background) { | |||||
mBackground = background; | |||||
return this; | |||||
} | |||||
/** | |||||
* 设置点击空白区域是否可以关闭 | |||||
*/ | |||||
public HintDataDialogFragment setCancelBlank(boolean cancelable) { | |||||
mCancelBlank = cancelable; | |||||
return this; | |||||
} | |||||
/** | |||||
* 当前是否显示 | |||||
*/ | |||||
public boolean isShow() { | |||||
return mShow; | |||||
} | |||||
/** | |||||
* 初始化数据 | |||||
* | |||||
* @param isCenter 显示的内容是否居中 | |||||
*/ | |||||
public HintDataDialogFragment initData(CharSequence title, CharSequence content, | |||||
boolean isCenter, CharSequence cancel, CharSequence ok) { | |||||
setTitle(title, mTitleColor); | |||||
setContent(content, isCenter); | |||||
setCancel(cancel, mCancelColor); | |||||
setOk(ok, mOkColor); | |||||
return this; | |||||
} | |||||
/** | |||||
* 初始化数据 | |||||
*/ | |||||
public HintDataDialogFragment initData(CharSequence title, CharSequence content) { | |||||
return this.initData(title, content, false, "", ""); | |||||
} | |||||
/** | |||||
* 初始化数据 | |||||
*/ | |||||
public HintDataDialogFragment initData(CharSequence title, CharSequence content, | |||||
CharSequence cancel, CharSequence ok) { | |||||
return this.initData(title, content, false, cancel, ok); | |||||
} | |||||
@Override | |||||
public void onStart() { | |||||
super.onStart(); | |||||
Dialog dialog = getDialog(); | |||||
if (dialog != null) { | |||||
dialog.setOnDismissListener(this); | |||||
DisplayMetrics dm = new DisplayMetrics(); | |||||
if (getActivity() != null) { | |||||
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm); | |||||
if (dialog.getWindow() != null) | |||||
//设置宽度为80% | |||||
dialog.getWindow() | |||||
.setLayout((int) (dm.widthPixels * 0.9), | |||||
ViewGroup.LayoutParams.WRAP_CONTENT); | |||||
} | |||||
} | |||||
} | |||||
@Override | |||||
public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||||
try { | |||||
if (!mShow) { | |||||
super.show(manager, tag); | |||||
mShow = true; | |||||
} | |||||
} catch (Exception e) { | |||||
L.e(TAG, "显示异常"); | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
public void show(@NonNull FragmentManager manager) { | |||||
this.show(manager, "HintDataDialogFragment"); | |||||
} | |||||
@Override | |||||
public void onDismiss(@NonNull DialogInterface dialog) { | |||||
super.onDismiss(dialog); | |||||
mShow = false; | |||||
} | |||||
@Override | |||||
public void dismiss() { | |||||
try { | |||||
mShow = false; | |||||
super.dismiss(); | |||||
} catch (Exception e) { | |||||
L.e(TAG, "关闭异常"); | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
public interface DialogListener { | |||||
/** | |||||
* 取消的点击事件 | |||||
* | |||||
* @param v | |||||
*/ | |||||
default void tvCancelListener(View v) { | |||||
} | |||||
/** | |||||
* 成功的点击事件 | |||||
* | |||||
* @param v | |||||
*/ | |||||
default void tvSucceedListener(View v) { | |||||
} | |||||
} | |||||
public HintDataDialogFragment setDialogListener(DialogListener dialogListener) { | |||||
mDialogListener = dialogListener; | |||||
return this; | |||||
} | |||||
@Override | |||||
public void onDetach() { | |||||
super.onDetach(); | |||||
} | |||||
@Override | |||||
public void onDestroy() { | |||||
super.onDestroy(); | |||||
} | |||||
@Override | |||||
public void onDestroyView() { | |||||
super.onDestroyView(); | |||||
mShow = false; | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||||
import android.app.Dialog; | |||||
import android.content.DialogInterface; | |||||
import android.os.Bundle; | |||||
import android.os.Handler; | |||||
import android.os.Looper; | |||||
import android.os.Message; | |||||
import android.view.KeyEvent; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.fragment.app.DialogFragment; | |||||
import androidx.fragment.app.FragmentManager; | |||||
import androidx.fragment.app.FragmentTransaction; | |||||
/** | |||||
* elink-android<br> | |||||
* LoadingIosDialogFragment<br> | |||||
* xing<br> | |||||
* 2019/2/26 16:07<br> | |||||
* 加载提示框 | |||||
*/ | |||||
public class LoadingIosDialogFragment extends DialogFragment { | |||||
private static String TAG = LoadingIosDialogFragment.class.getName(); | |||||
private final static int DISMISS_OUT = 1; | |||||
/** | |||||
* 默认超时时间 | |||||
*/ | |||||
private int timeOut = 30; | |||||
private boolean show = false; | |||||
public boolean isShow() { | |||||
return show; | |||||
} | |||||
private Handler mHandler = new Handler(Looper.getMainLooper()) { | |||||
@Override | |||||
public void handleMessage(Message msg) { | |||||
switch (msg.what) { | |||||
case DISMISS_OUT: | |||||
LoadingIosDialogFragment.this.dismiss(); | |||||
break; | |||||
} | |||||
} | |||||
}; | |||||
@Override | |||||
public void dismiss() { | |||||
try { | |||||
mHandler.removeMessages(DISMISS_OUT); | |||||
if (getFragmentManager() != null) | |||||
super.dismiss(); | |||||
show = false; | |||||
} catch (Exception e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
public int getTimeOut() { | |||||
return timeOut; | |||||
} | |||||
public void setTimeOut(int timeOut) { | |||||
this.timeOut = timeOut; | |||||
} | |||||
public void show(@NonNull FragmentManager manager) { | |||||
this.show(manager, "LoadingIosDialogFragment"); | |||||
} | |||||
@Override | |||||
public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||||
try { | |||||
super.show(manager, tag); | |||||
show = true; | |||||
} catch (Exception e) { | |||||
show = false; | |||||
e.printStackTrace(); | |||||
} | |||||
mHandler.sendEmptyMessageDelayed(DISMISS_OUT, timeOut * 1000); | |||||
} | |||||
@Override | |||||
public int show(@NonNull FragmentTransaction transaction, @Nullable String tag) { | |||||
return super.show(transaction, tag); | |||||
} | |||||
@Override | |||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) { | |||||
super.onActivityCreated(savedInstanceState); | |||||
if (getDialog() != null) { | |||||
getDialog().setOnShowListener(null); | |||||
getDialog().setOnCancelListener(null); | |||||
getDialog().setOnDismissListener(null); | |||||
} | |||||
} | |||||
@Nullable | |||||
@Override | |||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | |||||
return super.onCreateView(inflater, container, savedInstanceState); | |||||
} | |||||
@NonNull | |||||
@Override | |||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||||
LayoutInflater inflater = LayoutInflater.from(requireContext()); | |||||
View v = inflater.inflate(R.layout.dialog_loading_ios, null);// 得到加载view | |||||
Dialog loadingDialog = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||||
loadingDialog.setCancelable(false);//设置点击空白处是否可以取消 | |||||
//按返回键是否可以取消 | |||||
loadingDialog.setCanceledOnTouchOutside(false); | |||||
loadingDialog.setContentView(v);// 设置布局 | |||||
loadingDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { | |||||
@Override | |||||
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { | |||||
//返回不关闭 | |||||
return keyCode == KeyEvent.KEYCODE_BACK; | |||||
} | |||||
}); | |||||
return loadingDialog; | |||||
} | |||||
@Override | |||||
public void onDestroyView() { | |||||
super.onDestroyView(); | |||||
if (mHandler != null) { | |||||
mHandler.removeCallbacksAndMessages(null); | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.dialog; | |||||
import android.app.Dialog; | |||||
import android.content.Context; | |||||
import android.content.DialogInterface; | |||||
import android.graphics.Color; | |||||
import android.graphics.drawable.ColorDrawable; | |||||
import android.os.Bundle; | |||||
import android.view.Gravity; | |||||
import android.view.KeyEvent; | |||||
import android.view.LayoutInflater; | |||||
import android.view.View; | |||||
import android.view.ViewGroup; | |||||
import android.view.Window; | |||||
import android.view.WindowManager; | |||||
import android.widget.TextView; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.R; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.L; | |||||
import aicare.net.cn.sdk.ailinksdkdemoandroid.view.MyItemDecoration; | |||||
import androidx.annotation.ColorInt; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.annotation.Nullable; | |||||
import androidx.fragment.app.DialogFragment; | |||||
import androidx.fragment.app.FragmentManager; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
/** | |||||
* 列表显示的dialog | |||||
*/ | |||||
public class ShowListDialogFragment extends DialogFragment implements View.OnClickListener { | |||||
private String TAG = ShowListDialogFragment.class.getName(); | |||||
private Context mContext; | |||||
private onDialogListener mOnDialogListener; | |||||
private TextView mTvCancel, mTvTitle; | |||||
private RecyclerView rv_dialog_list; | |||||
private DialogStringImageAdapter mAdapter; | |||||
private int mCancelColor; | |||||
private CharSequence mCancel; | |||||
private CharSequence mTitle; | |||||
private ArrayList<DialogStringImageAdapter.DialogStringImageBean> mList; | |||||
private boolean mBottom; | |||||
/** | |||||
* 是否显示灰色背景 | |||||
*/ | |||||
private boolean mBackground=true; | |||||
/** | |||||
* 点击空白区域是否关闭 | |||||
*/ | |||||
private boolean mCancelBlank; | |||||
/** | |||||
* 是否显示 | |||||
*/ | |||||
private boolean mShow; | |||||
public static ShowListDialogFragment newInstance() { | |||||
return new ShowListDialogFragment(); | |||||
} | |||||
@NonNull | |||||
@Override | |||||
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { | |||||
Dialog dialogView = new Dialog(requireContext(), R.style.MyDialog);// 创建自定义样式dialog | |||||
dialogView.setCancelable(false);//设置是否可以关闭 | |||||
dialogView.setCanceledOnTouchOutside(mCancelBlank);//设置点击空白处是否可以取消 | |||||
dialogView.setOnKeyListener((dialog, keyCode, event) -> { | |||||
if (mCancelBlank) { | |||||
return false; | |||||
} else { | |||||
//返回不关闭 | |||||
return keyCode == KeyEvent.KEYCODE_BACK; | |||||
} | |||||
}); | |||||
return dialogView; | |||||
} | |||||
@Nullable | |||||
@Override | |||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { | |||||
return inflater.inflate(R.layout.dialog_list_data_fillet, container); | |||||
} | |||||
@Override | |||||
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { | |||||
super.onViewCreated(view, savedInstanceState); | |||||
mContext = view.getContext(); | |||||
initView(view); | |||||
initData(mList, mTitle, mCancel, mCancelColor); | |||||
} | |||||
@Override | |||||
public void onActivityCreated(@Nullable Bundle savedInstanceState) { | |||||
super.onActivityCreated(savedInstanceState); | |||||
L.i(TAG,"onActivityCreated"); | |||||
Dialog dialog = getDialog(); | |||||
if (dialog != null) { | |||||
Window window = dialog.getWindow(); | |||||
if (window != null) { | |||||
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); | |||||
WindowManager.LayoutParams params = window.getAttributes(); | |||||
if (mBackground) { | |||||
params.dimAmount = 0.8f; | |||||
} else { | |||||
params.dimAmount = 0f; | |||||
} | |||||
if (mBottom) { | |||||
params.y = 10;//设置Dialog距离底部的距离 | |||||
params.gravity = Gravity.BOTTOM; | |||||
} | |||||
window.setAttributes(params); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 初始化控件,数据 | |||||
*/ | |||||
private void initView(View view) { | |||||
mTvTitle = view.findViewById(R.id.tv_dialog_list_data_title); | |||||
mTvCancel = view.findViewById(R.id.tv_dialog_photo_cancel); | |||||
rv_dialog_list = view.findViewById(R.id.rv_dialog_list); | |||||
rv_dialog_list.setLayoutManager(new LinearLayoutManager(mContext)); | |||||
rv_dialog_list.addItemDecoration(new MyItemDecoration(mContext, | |||||
LinearLayoutManager.VERTICAL, 1, | |||||
mContext.getResources().getColor(R.color.public_white))); | |||||
} | |||||
/** | |||||
* 初始化数据 | |||||
*/ | |||||
private void initData(ArrayList<DialogStringImageAdapter.DialogStringImageBean> list, CharSequence title, CharSequence cancel, int cancelColor) { | |||||
if (mList == null) | |||||
mList = new ArrayList<>(); | |||||
mAdapter = new DialogStringImageAdapter(mContext, mList, position -> { | |||||
if (mOnDialogListener != null) { | |||||
//item点击事件 | |||||
mOnDialogListener.onItemListener(position); | |||||
dismiss(); | |||||
} | |||||
}); | |||||
rv_dialog_list.setAdapter(mAdapter); | |||||
setList(list); | |||||
setTitle(title); | |||||
setCancel(cancel, cancelColor); | |||||
mTvCancel.setOnClickListener(this); | |||||
} | |||||
public ShowListDialogFragment setTitle(CharSequence title) { | |||||
this.mTitle = title; | |||||
if (mTvTitle != null) { | |||||
if (mTitle != null && !mTitle.equals("")) { | |||||
mTvTitle.setVisibility(View.VISIBLE); | |||||
mTvTitle.setText(mTitle); | |||||
} else if (mTitle == null) { | |||||
mTvTitle.setVisibility(View.GONE); | |||||
} | |||||
} | |||||
return this; | |||||
} | |||||
public ShowListDialogFragment setCancel(CharSequence cancel, @ColorInt int cancelColor) { | |||||
this.mCancel = cancel; | |||||
this.mCancelColor = cancelColor; | |||||
if (mTvCancel != null) { | |||||
if (mCancel != null && !mCancel.equals("")) { | |||||
mTvCancel.setVisibility(View.VISIBLE); | |||||
mTvCancel.setText(mCancel); | |||||
} else if (mCancel == null) { | |||||
mTvCancel.setVisibility(View.GONE); | |||||
} | |||||
if (mCancelColor != 0) | |||||
mTvCancel.setTextColor(mCancelColor); | |||||
} | |||||
return this; | |||||
} | |||||
/** | |||||
* 修改列表中的内容 | |||||
*/ | |||||
public ShowListDialogFragment setList(List<DialogStringImageAdapter.DialogStringImageBean> list) { | |||||
if (mList == null) { | |||||
mList = new ArrayList<>(); | |||||
mList.addAll(list); | |||||
} | |||||
if (mAdapter != null) | |||||
mAdapter.notifyDataSetChanged(); | |||||
return this; | |||||
} | |||||
public ShowListDialogFragment setOnDialogListener(onDialogListener onDialogListener) { | |||||
mOnDialogListener = onDialogListener; | |||||
return this; | |||||
} | |||||
@Override | |||||
public void onClick(View v) { | |||||
int i = v.getId(); | |||||
if (i == R.id.tv_dialog_photo_cancel) { | |||||
if (mOnDialogListener != null) | |||||
mOnDialogListener.onCancelListener(v); | |||||
dismiss(); | |||||
} | |||||
} | |||||
/** | |||||
* 设置dialog是否在底部 | |||||
*/ | |||||
public ShowListDialogFragment setBottom(boolean bottom) { | |||||
mBottom = bottom; | |||||
return this; | |||||
} | |||||
/** | |||||
* 设置dialog是否有灰色背景 | |||||
*/ | |||||
public ShowListDialogFragment setBackground(boolean background) { | |||||
mBackground = background; | |||||
return this; | |||||
} | |||||
/** | |||||
* 设置点击空白区域是否可以关闭 | |||||
*/ | |||||
public ShowListDialogFragment setCancelBlank(boolean cancelable) { | |||||
mCancelBlank = cancelable; | |||||
return this; | |||||
} | |||||
/** | |||||
* 当前是否显示 | |||||
*/ | |||||
public boolean isShow() { | |||||
return mShow; | |||||
} | |||||
@Override | |||||
public void show(@NonNull FragmentManager manager, @Nullable String tag) { | |||||
try { | |||||
if (!mShow) { | |||||
super.show(manager, tag); | |||||
mShow = true; | |||||
} | |||||
} catch (Exception e) { | |||||
L.e(TAG, "显示异常"); | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
public void show(@NonNull FragmentManager manager) { | |||||
this.show(manager, "HintDataDialogFragment"); | |||||
} | |||||
@Override | |||||
public void onDismiss(@NonNull DialogInterface dialog) { | |||||
super.onDismiss(dialog); | |||||
mShow = false; | |||||
} | |||||
@Override | |||||
public void dismiss() { | |||||
try { | |||||
mShow = false; | |||||
super.dismiss(); | |||||
} catch (Exception e) { | |||||
L.e(TAG, "关闭异常"); | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
public interface onDialogListener { | |||||
/** | |||||
* 取消的点击事件 | |||||
*/ | |||||
default void onCancelListener(View v) { | |||||
} | |||||
/** | |||||
* 打开点击事件 | |||||
*/ | |||||
void onItemListener(int position); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
import android.app.Activity; | |||||
import android.content.Context; | |||||
import android.content.Intent; | |||||
import android.content.pm.PackageManager; | |||||
import android.location.LocationManager; | |||||
import android.net.Uri; | |||||
import android.provider.Settings; | |||||
/** | |||||
* xing<br> | |||||
* 2019/4/22<br> | |||||
* 路由跳转工具类 | |||||
*/ | |||||
public class AppStart { | |||||
private static String TAG = AppStart.class.getName(); | |||||
/** | |||||
* 进入应用设置界面 | |||||
* | |||||
*/ | |||||
public static void startUseSetActivity(Context context) { | |||||
Intent localIntent = new Intent(); | |||||
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |||||
localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); | |||||
localIntent.setData(Uri.fromParts("package", context.getPackageName(), null)); | |||||
context.startActivity(localIntent); | |||||
} | |||||
/** | |||||
* 进入设置系统界面 | |||||
* | |||||
* @param context 上下文 | |||||
*/ | |||||
public static void startSetActivity(Context context) { | |||||
Intent intent = new Intent(Settings.ACTION_SETTINGS); | |||||
context.startActivity(intent); | |||||
} | |||||
/** | |||||
* 手机是否开启位置服务 | |||||
*/ | |||||
public static boolean isLocServiceEnable(Context context) { | |||||
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); | |||||
boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); | |||||
boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); | |||||
if (gps || network) { | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* 进入定位服务 | |||||
*/ | |||||
public static void startLocationActivity(Activity activity, int code) { | |||||
Intent localIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); | |||||
if (activity.getPackageManager().resolveActivity(localIntent, | |||||
PackageManager.MATCH_DEFAULT_ONLY) != null) { | |||||
activity.startActivityForResult(localIntent, code); | |||||
} | |||||
} | |||||
/** | |||||
* 跳转到系统web | |||||
*/ | |||||
public static void startSysWeb(Context context, String url) { | |||||
Intent intentWeb = new Intent(); | |||||
intentWeb.setAction("android.intent.action.VIEW"); | |||||
Uri content_url = Uri.parse("http://" + url); | |||||
intentWeb.setData(content_url); | |||||
context.startActivity(intentWeb); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
import android.os.Environment; | |||||
import java.io.File; | |||||
import java.util.ArrayList; | |||||
import java.util.Arrays; | |||||
import java.util.Comparator; | |||||
public class FileUtils { | |||||
private static String TAG = FileUtils.class.getName(); | |||||
private static String filesDir = Environment.getExternalStorageDirectory().getAbsolutePath(); | |||||
public static String FILE_DIR="AiLinkBleDemo"; | |||||
public static String FILE_NAME="updateName.img"; | |||||
public static void init(){ | |||||
filesDir = Environment.getExternalStorageDirectory().getAbsolutePath(); | |||||
createFileDirectories(FILE_DIR); | |||||
} | |||||
public static String getByFileName(){ | |||||
return filesDir + File.separator ; | |||||
} | |||||
/** | |||||
* 创建文件夹 | |||||
*/ | |||||
private static void createFileDirectories(String directoryName) { | |||||
filesDir = filesDir + File.separator + directoryName; | |||||
File directory = new File(filesDir); | |||||
if (!directory.exists()) { | |||||
boolean mkdirs = directory.mkdirs(); | |||||
L.i(TAG,"创建OTA文件:"+mkdirs); | |||||
} | |||||
} | |||||
public static ArrayList<String> list() { | |||||
File f = new File(filesDir); | |||||
File file[] = f.listFiles(); | |||||
if (file==null) | |||||
return new ArrayList<>(); | |||||
Arrays.sort(file, new Comparator<File>() { | |||||
@Override | |||||
public int compare(File lhs, File rhs) { | |||||
return lhs.getPath().compareToIgnoreCase(rhs.getPath()); | |||||
} | |||||
}); | |||||
L.d("Files", "Size: " + file.length); | |||||
ArrayList<String> names = new ArrayList<String>(); | |||||
for (int i = 0; i < file.length; i++) { | |||||
L.d("Files", "FileName:" + file[i].getName()); | |||||
names.add(file[i].getName()); | |||||
} | |||||
return names; | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
import android.util.Log; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.Date; | |||||
import java.util.Locale; | |||||
import androidx.annotation.NonNull; | |||||
/** | |||||
* 打印日志工具 | |||||
*/ | |||||
public class L { | |||||
/** | |||||
* 是否开启log日志 | |||||
*/ | |||||
private static boolean isLog = true; | |||||
private static String TAG = "TagOther"; | |||||
/** | |||||
* 日志初始化 | |||||
* | |||||
* @param isShowLog 是否打印日志 | |||||
*/ | |||||
public static void init(boolean isShowLog) { | |||||
isLog = isShowLog; | |||||
} | |||||
/** | |||||
* 详细日志 | |||||
*/ | |||||
public static void v(String tag, String msg) { | |||||
if (isLog) { | |||||
logContent(tag, msg, 4); | |||||
} | |||||
} | |||||
public static void v(String msg) { | |||||
v(TAG, msg); | |||||
} | |||||
/** | |||||
* 错误日志 | |||||
*/ | |||||
public static void e(String tag, String msg) { | |||||
if (isLog) { | |||||
logContent(tag, msg, 1); | |||||
} | |||||
} | |||||
public static void e(String msg) { | |||||
e(TAG, msg); | |||||
} | |||||
/** | |||||
* 警告日志 | |||||
*/ | |||||
public static void w(String tag, String msg) { | |||||
if (isLog) { | |||||
logContent(tag, msg, 3); | |||||
} | |||||
} | |||||
public static void w(String msg) { | |||||
w(TAG, msg); | |||||
} | |||||
/** | |||||
* 信息日志 | |||||
*/ | |||||
public static void i(String tag, String msg) { | |||||
if (isLog) { | |||||
logContent(tag, msg, 0); | |||||
} | |||||
} | |||||
public static void i(String msg) { | |||||
i(TAG, msg); | |||||
} | |||||
/** | |||||
* 调试日志 | |||||
*/ | |||||
public static void d(String tag, String msg) { | |||||
if (isLog) { | |||||
logContent(tag, msg, 2); | |||||
} | |||||
} | |||||
public static void d(String msg) { | |||||
d(TAG, msg); | |||||
} | |||||
private static void logContent(String msg) { | |||||
logContent("", msg, 0); | |||||
} | |||||
/** | |||||
* @param tag tag | |||||
* @param msg 内容 | |||||
* @param level 0=i;1=e;2=d;3=w;其他=v; | |||||
*/ | |||||
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 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") | |||||
.append("-------------------------------------------------------\n"); | |||||
return builder.toString(); | |||||
} | |||||
private static int getStackOffset(StackTraceElement[] trace) { | |||||
for (int i = 2; i < trace.length; i++) { | |||||
StackTraceElement e = trace[i]; | |||||
String name = e.getClassName(); | |||||
String l = L.class.getName(); | |||||
if (!name.equals(l)) { | |||||
return --i; | |||||
} | |||||
} | |||||
return -1; | |||||
} | |||||
private static String getSimpleClassName(@NonNull String name) { | |||||
int lastIndex = name.lastIndexOf("."); | |||||
return name.substring(lastIndex + 1); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
import android.content.Context; | |||||
import android.content.SharedPreferences; | |||||
import java.util.Map; | |||||
public class SP { | |||||
public static final int INT_DEFAULT = 0; | |||||
public static final String STR_DEFAULT = ""; | |||||
private static SP instance; | |||||
private SharedPreferences sp; | |||||
/** | |||||
* 保存在手机里面的文件名 | |||||
*/ | |||||
private static final String FILE_NAME = "app_data"; | |||||
public static String OTA_FILE_NAME = "OTA_FILE_NAME"; | |||||
//------------------------------------- | |||||
private SP(Context context) { | |||||
sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE); | |||||
} | |||||
public static SP getInstance() { | |||||
return instance; | |||||
} | |||||
public static void init(Context context) { | |||||
if (instance == null) { | |||||
synchronized (SP.class) { | |||||
if (instance == null) { | |||||
instance = new SP(context); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
public String getOtaFileName() { | |||||
return sp.getString(OTA_FILE_NAME, STR_DEFAULT); | |||||
} | |||||
public void putOtaFileName(String name) { | |||||
SharedPreferences.Editor editor = sp.edit(); | |||||
editor.putString(OTA_FILE_NAME, name); | |||||
apply(editor); | |||||
} | |||||
/** | |||||
* 移除某个key值已经对应的值 | |||||
*/ | |||||
public void remove(String key) { | |||||
SharedPreferences.Editor editor = sp.edit(); | |||||
editor.remove(key); | |||||
apply(editor); | |||||
} | |||||
/** | |||||
* 清除用户相关的所有数据 | |||||
*/ | |||||
public void clear() { | |||||
SharedPreferences.Editor editor = sp.edit(); | |||||
editor.remove(OTA_FILE_NAME); | |||||
apply(editor); | |||||
} | |||||
/** | |||||
* 清除所有数据 | |||||
*/ | |||||
public void clearAll() { | |||||
SharedPreferences.Editor editor = sp.edit(); | |||||
editor.clear(); | |||||
apply(editor); | |||||
} | |||||
/** | |||||
* 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法 | |||||
*/ | |||||
public int put(String key, Object object) { | |||||
SharedPreferences.Editor editor = sp.edit(); | |||||
if (object instanceof String) { | |||||
editor.putString(key, (String) object); | |||||
} else if (object instanceof Integer) { | |||||
editor.putInt(key, (Integer) object); | |||||
} else if (object instanceof Boolean) { | |||||
editor.putBoolean(key, (Boolean) object); | |||||
} else if (object instanceof Float) { | |||||
editor.putFloat(key, (Float) object); | |||||
} else if (object instanceof Long) { | |||||
editor.putLong(key, (Long) object); | |||||
} else { | |||||
editor.putString(key, object.toString()); | |||||
} | |||||
apply(editor); | |||||
return 0; | |||||
} | |||||
/** | |||||
* 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值 | |||||
*/ | |||||
public Object get(String key, Object defaultObject) { | |||||
if (defaultObject instanceof String) { | |||||
return sp.getString(key, (String) defaultObject); | |||||
} else if (defaultObject instanceof Integer) { | |||||
return sp.getInt(key, (Integer) defaultObject); | |||||
} else if (defaultObject instanceof Boolean) { | |||||
return sp.getBoolean(key, (Boolean) defaultObject); | |||||
} else if (defaultObject instanceof Float) { | |||||
return sp.getFloat(key, (Float) defaultObject); | |||||
} else if (defaultObject instanceof Long) { | |||||
return sp.getLong(key, (Long) defaultObject); | |||||
} | |||||
return defaultObject; | |||||
} | |||||
/** | |||||
* 查询某个key是否已经存在 | |||||
*/ | |||||
public boolean contains(Context context, String key) { | |||||
return sp.contains(key); | |||||
} | |||||
/** | |||||
* 返回所有的键值对 | |||||
*/ | |||||
public Map<String, ?> getAll(Context context) { | |||||
return sp.getAll(); | |||||
} | |||||
/** | |||||
* 使用apply执行,否则使用commit | |||||
*/ | |||||
private static void apply(SharedPreferences.Editor editor) { | |||||
try { | |||||
editor.apply(); | |||||
} catch (Exception e) { | |||||
editor.commit(); | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils; | |||||
import java.text.SimpleDateFormat; | |||||
import java.util.Locale; | |||||
/** | |||||
* xing<br> | |||||
* 2019/5/25<br> | |||||
* java类作用描述 | |||||
*/ | |||||
public class TimeUtils { | |||||
public static String getTime(){ | |||||
java.text.SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.US); | |||||
return format.format(System.currentTimeMillis())+":\n"; | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.view; | |||||
import android.content.Context; | |||||
import android.graphics.Canvas; | |||||
import android.graphics.Paint; | |||||
import android.graphics.Rect; | |||||
import android.util.TypedValue; | |||||
import android.view.View; | |||||
import androidx.annotation.ColorInt; | |||||
import androidx.annotation.NonNull; | |||||
import androidx.recyclerview.widget.LinearLayoutManager; | |||||
import androidx.recyclerview.widget.RecyclerView; | |||||
/** | |||||
* 2019/10/14 | |||||
* RecyclerView分界线 | |||||
*/ | |||||
public class MyItemDecoration extends RecyclerView.ItemDecoration { | |||||
private Paint mPaint; | |||||
private int mDividerHeight;//分割线高度,默认为1px | |||||
private int mLeft,mRight; | |||||
private int mOrientation;//列表的方向:LinearLayoutManager.VERTICAL或LinearLayoutManager.HORIZONTAL | |||||
/** | |||||
* 自定义分割线 | |||||
* | |||||
* @param orientation 列表方向 | |||||
* @param dividerHeight 分割线高度 | |||||
* @param mLeft 距离左边的距离 | |||||
* @param mRight 距离右边的距离 | |||||
* @param dividerColor 分割线颜色 | |||||
*/ | |||||
public MyItemDecoration(Context context, int orientation, int dividerHeight, int mLeft, int mRight, @ColorInt int dividerColor) { | |||||
mOrientation=orientation; | |||||
mDividerHeight = dividerHeight; | |||||
this.mLeft = dp2px(context,mLeft); | |||||
this.mRight = dp2px(context,mRight); | |||||
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); | |||||
mPaint.setColor(dividerColor); | |||||
mPaint.setStyle(Paint.Style.FILL); | |||||
} | |||||
/** | |||||
* 自定义分割线 | |||||
* | |||||
* @param orientation 列表方向 | |||||
* @param dividerHeight 分割线高度 | |||||
* @param dividerColor 分割线颜色 | |||||
*/ | |||||
public MyItemDecoration(Context context, int orientation, int dividerHeight, @ColorInt int dividerColor) { | |||||
this(context,orientation,dividerHeight,0,0,dividerColor); | |||||
} | |||||
//获取分割线尺寸 | |||||
@Override | |||||
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { | |||||
super.getItemOffsets(outRect, view, parent, state); | |||||
if (mOrientation == LinearLayoutManager.VERTICAL) { | |||||
outRect.set(mLeft, 0, mRight, mDividerHeight); | |||||
} else { | |||||
outRect.set(0, 0, mDividerHeight, 0); | |||||
} | |||||
} | |||||
//绘制分割线 | |||||
@Override | |||||
public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) { | |||||
super.onDraw(c, parent, state); | |||||
if (mOrientation == LinearLayoutManager.VERTICAL) { | |||||
drawVertical(c, parent); | |||||
} else { | |||||
drawHorizontal(c, parent); | |||||
} | |||||
} | |||||
/** | |||||
* 绘制纵向列表时的分隔线 这时分隔线是横着的 | |||||
* 每次 left相同,top根据child变化,right相同,bottom也变化 | |||||
* | |||||
*/ | |||||
private void drawVertical(Canvas canvas, RecyclerView parent) { | |||||
final int left = parent.getPaddingLeft(); | |||||
final int right = parent.getMeasuredWidth() - parent.getPaddingRight(); | |||||
final int childSize = parent.getChildCount(); | |||||
for (int i = 0; i < childSize-1; i++) { | |||||
final View child = parent.getChildAt(i); | |||||
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); | |||||
final int top = child.getBottom() + layoutParams.bottomMargin; | |||||
final int bottom = top + mDividerHeight; | |||||
if (mPaint != null) { | |||||
canvas.drawRect(left, top, right, bottom, mPaint); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 绘制横向列表时的分隔线 这时分隔线是竖着的 | |||||
* l、r 变化; t、b 不变 | |||||
* | |||||
*/ | |||||
private void drawHorizontal(Canvas canvas, RecyclerView parent) { | |||||
final int top = parent.getPaddingTop(); | |||||
final int bottom = parent.getMeasuredHeight() - parent.getPaddingBottom(); | |||||
final int childSize = parent.getChildCount(); | |||||
for (int i = 0; i < childSize; i++) { | |||||
final View child = parent.getChildAt(i); | |||||
RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) child.getLayoutParams(); | |||||
final int left = child.getRight() + layoutParams.rightMargin; | |||||
final int right = left + mDividerHeight; | |||||
if (mPaint != null) { | |||||
canvas.drawRect(left, top, right, bottom, mPaint); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* dp转px | |||||
* | |||||
*/ | |||||
private int dp2px(Context context, float dpVal) { | |||||
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, | |||||
dpVal, context.getResources().getDisplayMetrics()); | |||||
} | |||||
} |
package aicare.net.cn.sdk.ailinksdkdemoandroid.view; | |||||
import android.content.Context; | |||||
import android.os.Build; | |||||
import android.util.AttributeSet; | |||||
import android.widget.SeekBar; | |||||
/** | |||||
* xing<br> | |||||
* 2020/5/9<br> | |||||
* SeekBar允许设置最小值 | |||||
* 兼容旧版本 | |||||
*/ | |||||
public class SeekBarMin extends SeekBar implements SeekBar.OnSeekBarChangeListener { | |||||
private int mMin; | |||||
private boolean mApi26 = false; | |||||
private OnSeekBarChangeListener mOnSeekBarChangeListener; | |||||
public SeekBarMin(Context context) { | |||||
this(context, null); | |||||
} | |||||
public SeekBarMin(Context context, AttributeSet attrs) { | |||||
this(context, attrs, 0); | |||||
} | |||||
public SeekBarMin(Context context, AttributeSet attrs, int defStyleAttr) { | |||||
super(context, attrs, defStyleAttr); | |||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | |||||
mApi26 = true; | |||||
} | |||||
super.setOnSeekBarChangeListener(this); | |||||
} | |||||
@Override | |||||
public synchronized void setMin(int min) { | |||||
if (mApi26) { | |||||
super.setMin(min); | |||||
} else { | |||||
mMin = min; | |||||
} | |||||
} | |||||
@Override | |||||
public synchronized void setProgress(int progress) { | |||||
if (!mApi26) { | |||||
progress -= mMin; | |||||
} | |||||
super.setProgress(progress); | |||||
} | |||||
@Override | |||||
public synchronized void setMax(int max) { | |||||
if (!mApi26) { | |||||
max -= mMin; | |||||
} | |||||
super.setMax(max); | |||||
} | |||||
@Override | |||||
public int getMin() { | |||||
return mMin; | |||||
} | |||||
@Override | |||||
public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) { | |||||
mOnSeekBarChangeListener = l; | |||||
} | |||||
@Override | |||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { | |||||
if (!mApi26) { | |||||
progress += mMin; | |||||
} | |||||
if (mOnSeekBarChangeListener != null) | |||||
mOnSeekBarChangeListener.onProgressChanged(seekBar, progress, fromUser); | |||||
} | |||||
@Override | |||||
public void onStartTrackingTouch(SeekBar seekBar) { | |||||
if (mOnSeekBarChangeListener != null) | |||||
mOnSeekBarChangeListener.onStartTrackingTouch(seekBar); | |||||
} | |||||
@Override | |||||
public void onStopTrackingTouch(SeekBar seekBar) { | |||||
if (mOnSeekBarChangeListener != null) | |||||
mOnSeekBarChangeListener.onStopTrackingTouch(seekBar); | |||||
} | |||||
} |
<?xml version="1.0" encoding="utf-8"?> | |||||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
<item> | |||||
<shape | |||||
android:shape="rectangle"> | |||||
<solid android:color="@android:color/white" /> | |||||
<corners | |||||
android:radius="10dp"/> | |||||
</shape> | |||||
</item> | |||||
</selector> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
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:orientation="vertical"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/btnVersion" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="版本号" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/btnDis" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="断开" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/btnConnect" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="连接" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Height:" /> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="center_vertical" | |||||
android:padding="10dp"> | |||||
<RadioGroup | |||||
android:id="@+id/radio_height" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal"> | |||||
<RadioButton | |||||
android:id="@+id/radio_height_cm" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:checked="true" | |||||
android:text="cm" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_height_inch" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="inch" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_height_foot" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="foot" /> | |||||
</RadioGroup> | |||||
</LinearLayout> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Weight:" /> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="center_vertical" | |||||
android:padding="10dp"> | |||||
<RadioGroup | |||||
android:id="@+id/radio_weight" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal"> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_kg" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:checked="true" | |||||
android:text="kg" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_jin" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="jin" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_lb" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="lb:oz" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_oz" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="oz" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_st_lb" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="st:lb" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_g" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="g" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_lb_lb" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="lb" /> | |||||
</RadioGroup> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/btn_set_tare" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Tare" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/btn_set_hold" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Hold" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="@string/clear" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll"> | |||||
</ListView> | |||||
</LinearLayout> |
android:layout_weight="1" | android:layout_weight="1" | ||||
> | > | ||||
<LinearLayout | <LinearLayout | ||||
android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="@string/clear" | android:text="@string/clear" | ||||
/> | /> | ||||
<Button | |||||
android:id="@+id/btnPause" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="暂停" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
> | |||||
<Button | <Button | ||||
android:id="@+id/btnHandshake" | android:id="@+id/btnHandshake" | ||||
android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
</LinearLayout> | </LinearLayout> | ||||
<LinearLayout | <LinearLayout | ||||
android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="读名称" | android:text="读名称" | ||||
/> | /> | ||||
<Button | |||||
android:id="@+id/btn_start_ble" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="唤醒模块" | |||||
/> | |||||
</LinearLayout> | </LinearLayout> | ||||
/> | /> | ||||
</LinearLayout> | </LinearLayout> | ||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
android:padding="5dp" | |||||
> | |||||
<EditText | |||||
android:id="@+id/etSleepTime" | |||||
android:layout_width="150dp" | |||||
android:layout_height="wrap_content" | |||||
android:digits="0987654321," | |||||
android:text="1,60,1,1000" | |||||
android:hint="标记,时间,操作,广播时间" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btnSleepTimeWrite" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="写自动休眠" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btnSleepTimeRead" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="读自动休眠" | |||||
/> | |||||
</LinearLayout> | |||||
</LinearLayout> | </LinearLayout> | ||||
</ScrollView> | </ScrollView> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<ScrollView | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="0.5"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="vertical"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
android:layout_marginStart="10dp" | |||||
android:layout_marginTop="10dp" | |||||
android:gravity="center_vertical" | |||||
> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Mac:" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/tv_broadcast_mac" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="" | |||||
android:layout_marginStart="5dp" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
android:layout_marginStart="10dp" | |||||
android:layout_marginTop="10dp" | |||||
android:gravity="center_vertical" | |||||
> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="血氧百分比:" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/tv_broadcast_blood_oxygen" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="--%" | |||||
android:layout_marginStart="5dp" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="@string/clear" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/open" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="开始" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/stop" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="停止" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll"> | |||||
</ListView> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<ScrollView | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="0.5"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="vertical"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
android:layout_marginStart="10dp" | |||||
android:layout_marginTop="10dp" | |||||
android:gravity="center_vertical" | |||||
> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Mac:" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/tv_broadcast_mac" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="" | |||||
android:layout_marginStart="5dp" | |||||
/> | |||||
</LinearLayout> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginStart="10dp" | |||||
android:layout_marginTop="10dp" | |||||
android:text="Weight:" /> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="center_vertical" | |||||
android:padding="10dp"> | |||||
<RadioGroup | |||||
android:id="@+id/radio_weight" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal"> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_kg" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:checked="true" | |||||
android:text="kg" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_jin" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="jin" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_lb" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="lb:oz" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_oz" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="oz" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_st_lb" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="st:lb" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_g" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="g" /> | |||||
<RadioButton | |||||
android:id="@+id/radio_weight_lb_lb" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="lb" /> | |||||
</RadioGroup> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
android:layout_marginStart="10dp" | |||||
android:layout_marginTop="10dp" | |||||
android:gravity="center_vertical" | |||||
> | |||||
<TextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Temp:" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/tv_broadcast_temp" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="30℃" | |||||
android:layout_marginStart="5dp" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="@string/clear" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/open" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="开始" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/stop" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="停止" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll"> | |||||
</ListView> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:focusable="true" | |||||
android:focusableInTouchMode="true" | |||||
android:orientation="vertical"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/btn" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="搜索" /> | |||||
<Button | |||||
android:id="@+id/btn1" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="停止" /> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清空列表" /> | |||||
<Button | |||||
android:id="@+id/clearData" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清空数据" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/filter" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="过滤:true" /> | |||||
<Button | |||||
android:id="@+id/跳过" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="跳过" /> | |||||
</LinearLayout> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp"> | |||||
</ListView> | |||||
<ListView | |||||
android:id="@+id/listviewData" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll" | |||||
> | |||||
</ListView> | |||||
</LinearLayout> |
<?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> |
<?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" | |||||
xmlns:tools="http://schemas.android.com/tools" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
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="0dp" | |||||
android:layout_weight="1" | |||||
android:orientation="vertical" | |||||
> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal"> | |||||
<Button | |||||
android:id="@+id/button_connect" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="连接" | |||||
/> | |||||
<Button | |||||
android:id="@+id/button_dis" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="断开" | |||||
tools:layout_editor_absoluteX="281dp" | |||||
tools:layout_editor_absoluteY="40dp"/> | |||||
<Button | |||||
android:id="@+id/button_clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清空" | |||||
tools:layout_editor_absoluteX="281dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
<Button | |||||
android:id="@+id/button_ota" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="OTA" | |||||
tools:layout_editor_absoluteX="281dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal"> | |||||
<Button | |||||
android:id="@+id/button_time" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="同步时间" | |||||
/> | |||||
<Button | |||||
android:id="@+id/button_status" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取状态" | |||||
tools:layout_editor_absoluteX="281dp" | |||||
tools:layout_editor_absoluteY="40dp"/> | |||||
<Button | |||||
android:id="@+id/button_info" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取参数" | |||||
tools:layout_editor_absoluteX="281dp" | |||||
tools:layout_editor_absoluteY="40dp"/> | |||||
<Button | |||||
android:id="@+id/button_log" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="读取记录" | |||||
tools:layout_editor_absoluteX="16dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"> | |||||
<Button | |||||
android:id="@+id/button_close" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="关机" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
<Button | |||||
android:id="@+id/button_activation" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="激活设备" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
<Button | |||||
android:id="@+id/button_close_activation" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清除激活状态" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
<Button | |||||
android:id="@+id/button_bind" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="绑定" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"> | |||||
<Button | |||||
android:id="@+id/button_reboot" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="重启" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
<Button | |||||
android:id="@+id/button_version" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="版本号" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
<TextView | |||||
android:id="@+id/tv_version" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="bm" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"> | |||||
<EditText | |||||
android:id="@+id/et_set_user" | |||||
android:layout_width="0dp" | |||||
android:layout_height="match_parent" | |||||
android:layout_weight="1" | |||||
android:digits="0123456789" | |||||
android:hint="userId" | |||||
android:text="1" | |||||
/> | |||||
<EditText | |||||
android:id="@+id/et_set_user_status" | |||||
android:layout_width="0dp" | |||||
android:layout_height="match_parent" | |||||
android:layout_weight="1" | |||||
android:digits="0123456789" | |||||
android:hint="status" | |||||
android:maxLength="1" | |||||
android:text="0" | |||||
/> | |||||
<Button | |||||
android:id="@+id/button_user" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="下发用户" | |||||
tools:layout_editor_absoluteX="148dp" | |||||
tools:layout_editor_absoluteY="41dp"/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="靠近报警阀值:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar1" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/text1" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="接收的阀值次数:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar2" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/text2" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="脱离报警时间:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar3" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/text3" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="脱离报警次数:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar4" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1"/> | |||||
<TextView | |||||
android:id="@+id/text4" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="Gsensor灵敏度:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar5" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/text5" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="Gsensor不动的脱机时间:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar6" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/text6" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:gravity="center_vertical" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="马达震动时间:" | |||||
/> | |||||
<aicare.net.cn.sdk.ailinksdkdemoandroid.view.SeekBarMin | |||||
android:id="@+id/seekBar7" | |||||
style="@style/Widget.AppCompat.SeekBar" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/text7" | |||||
android:layout_width="50dp" | |||||
android:layout_height="wrap_content" | |||||
android:text="阀值" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="right" | |||||
> | |||||
<Button | |||||
android:id="@+id/button_set" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="设置参数" | |||||
tools:layout_editor_absoluteX="281dp" | |||||
tools:layout_editor_absoluteY="120dp"/> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_marginTop="10dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll" | |||||
> | |||||
</ListView> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical" | |||||
android:focusable="true" | |||||
android:focusableInTouchMode="true" | |||||
> | |||||
<ScrollView | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1.5" | |||||
> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="vertical" | |||||
> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/btnVersion" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="版本号" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清空" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/btn_get_did" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="did" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_get_battery" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="battery" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_init" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="init" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/set_key" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="set_key" | |||||
/> | |||||
<Button | |||||
android:id="@+id/syn_time" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="同步时间" | |||||
/> | |||||
<Button | |||||
android:id="@+id/one_pwd" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="一次性密码" | |||||
/> | |||||
<Button | |||||
android:id="@+id/resetT" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="重置T" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/openLock" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="开锁" | |||||
/> | |||||
<Button | |||||
android:id="@+id/closeLock" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="关锁" | |||||
/> | |||||
<Button | |||||
android:id="@+id/lockLog" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="记录" | |||||
/> | |||||
<Button | |||||
android:id="@+id/lockErrLog" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="异常记录" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/deleteLog" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="删除记录" | |||||
/> | |||||
<Button | |||||
android:id="@+id/cancelLog" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="取消读取" | |||||
/> | |||||
<Button | |||||
android:id="@+id/keyType" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="支持类型" | |||||
/> | |||||
<Button | |||||
android:id="@+id/bindingOk" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="绑定成功" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/getKey" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="同步用户" | |||||
/> | |||||
<Button | |||||
android:id="@+id/clearKey" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清空用户" | |||||
/> | |||||
<Button | |||||
android:id="@+id/getModuleStatus" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="查询模块状态" | |||||
/> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="2.5" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll" | |||||
> | |||||
</ListView> | |||||
</LinearLayout> |
<LinearLayout | <LinearLayout | ||||
android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:layout_margin="10dp" | android:layout_margin="10dp" | ||||
</LinearLayout> | </LinearLayout> | ||||
<LinearLayout | <LinearLayout | ||||
android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:layout_margin="10dp" | android:layout_margin="10dp" | ||||
<Button | <Button | ||||
android:id="@+id/btn_ad_weight" | android:id="@+id/btn_ad_weight" | ||||
android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="艾迪体脂秤" | android:text="艾迪体脂秤" | ||||
/> | /> | ||||
<Button | |||||
android:id="@+id/btn_smart_mask" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="口罩" | |||||
/> | |||||
</LinearLayout> | </LinearLayout> | ||||
<LinearLayout | <LinearLayout | ||||
android:layout_width="match_parent" | |||||
android:layout_margin="10dp" | |||||
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_width="match_parent" | ||||
android:layout_margin="10dp" | android:layout_margin="10dp" | ||||
android:layout_height="wrap_content"> | android:layout_height="wrap_content"> | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="WiFi+Ble体脂秤" | 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 | <Button | ||||
android:id="@+id/btn_bloodglucose" | |||||
android:id="@+id/btn_wifi_ble_tooth" | |||||
android:layout_width="wrap_content" | android:layout_width="wrap_content" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:text="血糖仪" | |||||
android:text="牙刷(wifi+ble)" | |||||
/> | /> | ||||
</LinearLayout> | </LinearLayout> | ||||
<LinearLayout | <LinearLayout | ||||
android:layout_width="match_parent" | android:layout_width="match_parent" | ||||
android:layout_height="wrap_content" | android:layout_height="wrap_content" | ||||
android:layout_margin="10dp" | android:layout_margin="10dp" | ||||
android:text="Ble通用设置" | 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" | |||||
android:layout_margin="10dp"> | |||||
<Button | |||||
android:id="@+id/wifi_config" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="WIFI设备(配置wifi)" | |||||
/> | |||||
<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" | |||||
android:layout_margin="10dp" | |||||
> | |||||
<Button | |||||
android:id="@+id/btn_ota" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="OTA通用" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_wristband" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="手环" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_transmission" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="透传" | |||||
/> | |||||
</LinearLayout> | </LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
android:orientation="vertical"> | |||||
<ScrollView | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="0.5"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="vertical"> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="@string/clear" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/get_version" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取版本" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp"> | |||||
<Button | |||||
android:id="@+id/set_status" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取状态" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/set_filter" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="更换滤网" | |||||
android:textAllCaps="false" /> | |||||
<Button | |||||
android:id="@+id/set_fan" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="风扇控制" | |||||
android:textAllCaps="false" /> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll"> | |||||
</ListView> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
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:orientation="vertical" | |||||
> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:paddingStart="10dp" | |||||
android:paddingEnd="10dp" | |||||
> | |||||
<EditText | |||||
android:id="@+id/et_cmd" | |||||
android:layout_width="180dp" | |||||
android:layout_height="wrap_content" | |||||
android:hint="透传数据" | |||||
android:text="4" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn1" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="发送" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_stop" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="停止" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:paddingStart="10dp" | |||||
android:paddingEnd="10dp" | |||||
> | |||||
<EditText | |||||
android:id="@+id/et_uuid" | |||||
android:layout_width="180dp" | |||||
android:layout_height="wrap_content" | |||||
android:hint="uuid" | |||||
android:text="0000FFE1" | |||||
android:lines="1" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_uuid" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="特征设置" | |||||
/> | |||||
</LinearLayout> <LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:paddingStart="10dp" | |||||
android:paddingEnd="10dp" | |||||
> | |||||
<EditText | |||||
android:id="@+id/et_uuid_server" | |||||
android:layout_width="180dp" | |||||
android:layout_height="wrap_content" | |||||
android:hint="uuid_server" | |||||
android:text="0000FFE0" | |||||
android:maxLines="1" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_uuid_server" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="服务设置" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:paddingStart="10dp" | |||||
android:paddingEnd="10dp" | |||||
> | |||||
<EditText | |||||
android:id="@+id/et_notify" | |||||
android:layout_width="180dp" | |||||
android:layout_height="wrap_content" | |||||
android:hint="uuid_notify" | |||||
android:text="0000FFE2" | |||||
android:maxLines="1" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_notify" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="Notify" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_notify_status" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="true" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:paddingStart="10dp" | |||||
android:paddingEnd="10dp" | |||||
> | |||||
<EditText | |||||
android:id="@+id/et_time" | |||||
android:layout_width="100dp" | |||||
android:layout_height="wrap_content" | |||||
android:hint="发送间隔" | |||||
android:text="1000" | |||||
android:maxLines="1" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_time" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="设置" | |||||
/> | |||||
<Button | |||||
android:id="@+id/clear" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清空" | |||||
/> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll" | |||||
> | |||||
</ListView> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent" | |||||
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:orientation="vertical" | |||||
android:padding="10dp" | |||||
> | |||||
<TextView | |||||
android:id="@+id/tv_version" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="版本号:" | |||||
android:textSize="18dp" | |||||
/> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginTop="5dp" | |||||
> | |||||
<Button | |||||
android:id="@+id/btn_ota_connect" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="连接" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_ota_dis" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="断开" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_ota_file" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="选择文件" | |||||
/> | |||||
<Button | |||||
android:id="@+id/btn_ota_start" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="OTA" | |||||
/> | |||||
</LinearLayout> | |||||
</LinearLayout> | |||||
</ScrollView> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="0dp" | |||||
android:layout_weight="1" | |||||
android:padding="10dp" | |||||
android:stackFromBottom="true" | |||||
android:transcriptMode="alwaysScroll" | |||||
> | |||||
</ListView> | |||||
</LinearLayout> |
<?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/wifistatus" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="查看wifi状态" /> | |||||
<Button | |||||
android:id="@+id/scan_wifi" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginStart="12dp" | |||||
android:layout_toEndOf="@+id/wifistatus" | |||||
android:text="搜索wifi热点" /> | |||||
<Button | |||||
android:id="@+id/sn" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@+id/scan_wifi" | |||||
android:layout_marginTop="8dp" | |||||
android:text="查看设备id" /> | |||||
<EditText | |||||
android:id="@+id/select_wifi_et" | |||||
android:layout_width="90dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginStart="22dp" | |||||
android:layout_toEndOf="@+id/scan_wifi" | |||||
android:hint="选择wifi序号" | |||||
android:inputType="number" | |||||
android:textSize="14dp" /> | |||||
<Button | |||||
android:id="@+id/connect_wifi" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@+id/select_wifi_et" | |||||
android:layout_marginStart="13dp" | |||||
android:layout_marginTop="11dp" | |||||
android:layout_toEndOf="@+id/disconnect" | |||||
android:text="发起连接" /> | |||||
<Button | |||||
android:id="@+id/disconnect" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@+id/scan_wifi" | |||||
android:layout_marginStart="9dp" | |||||
android:layout_marginTop="5dp" | |||||
android:layout_toEndOf="@+id/sn" | |||||
android:text="断开连接" /> | |||||
<Button | |||||
android:id="@+id/default_try_out" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@+id/sn" | |||||
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/setedname" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_below="@+id/default_mode" | |||||
android:layout_marginTop="5dp" | |||||
android:text="获取wifi名称" /> | |||||
<Button | |||||
android:id="@+id/support_unit" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_toEndOf="@id/setedname" | |||||
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/setedname" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent"> | |||||
</ListView> | |||||
</RelativeLayout> |
<?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"> | |||||
<EditText | |||||
android:id="@+id/et" | |||||
android:hint="输入payload数据" | |||||
android:digits="0123456789ABCDEFabcdef" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"/> | |||||
<LinearLayout | |||||
android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"> | |||||
<EditText | |||||
android:id="@+id/et_cid" | |||||
android:digits="0123456789ABCDEFabcdef" | |||||
android:layout_width="120dp" | |||||
android:hint="填入cid 16进制数" | |||||
android:layout_height="wrap_content"/> | |||||
<Button | |||||
android:id="@+id/send" | |||||
android:text="发送" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content"/> | |||||
<Button | |||||
android:id="@+id/bt_clear" | |||||
android:text="清空" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content"/> | |||||
<Button | |||||
android:id="@+id/bt_clear_log" | |||||
android:text="清空log" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content"/> | |||||
</LinearLayout> | |||||
<Button | |||||
android:id="@+id/bt_cid" | |||||
android:text="读cid" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content"/> | |||||
<ListView | |||||
android:id="@+id/listview" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="match_parent"/> | |||||
</LinearLayout> |
<?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"> | |||||
<ListView | |||||
android:id="@+id/user_list" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="150dp"> | |||||
</ListView> | |||||
<Button | |||||
android:layout_marginTop="20dp" | |||||
android:layout_below="@id/user_list" | |||||
android:id="@+id/history" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="请求历史记录"/> | |||||
<Button | |||||
android:layout_marginTop="20dp" | |||||
android:layout_below="@id/user_list" | |||||
android:id="@+id/userlist" | |||||
android:layout_toRightOf="@id/history" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="同步用户列表"/> | |||||
<Button | |||||
android:layout_marginTop="20dp" | |||||
android:layout_below="@id/user_list" | |||||
android:id="@+id/adduser" | |||||
android:layout_toRightOf="@id/userlist" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="添加用户"/> | |||||
<Button | |||||
android:layout_below="@id/history" | |||||
android:id="@+id/user" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="同步单个用户"/> | |||||
<EditText | |||||
android:id="@+id/edit_Userid" | |||||
android:layout_toRightOf="@id/user" | |||||
android:layout_below="@id/history" | |||||
android:layout_width="100dp" | |||||
android:hint="输入用户id" | |||||
android:padding="10dp" | |||||
android:inputType="number" | |||||
android:digits="12345678" | |||||
android:layout_height="60dp" /> | |||||
<Button | |||||
android:layout_below="@id/history" | |||||
android:id="@+id/syntime" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:layout_toRightOf="@id/edit_Userid" | |||||
android:text="同步时间"/> | |||||
<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> | |||||
<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> | |||||
</RelativeLayout> |
<?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"> | |||||
<LinearLayout | |||||
android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="right" | |||||
android:weightSum="1"> | |||||
<CheckedTextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="SSID :" | |||||
android:id="@+id/checkedTextView" | |||||
android:checked="false" /> | |||||
<EditText | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:ems="10" | |||||
android:id="@+id/ssid" | |||||
android:inputType="text" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="right" | |||||
android:weightSum="1" > | |||||
<CheckedTextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="PASSWORD:" | |||||
android:id="@+id/checkedTextView2" | |||||
android:checked="false" /> | |||||
<EditText | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:ems="10" | |||||
android:id="@+id/password" | |||||
android:inputType="text" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="right" | |||||
android:weightSum="1" > | |||||
<CheckedTextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="KEY:" | |||||
android:id="@+id/checkedTextView3" | |||||
android:checked="false" /> | |||||
<EditText | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:ems="10" | |||||
android:id="@+id/key" | |||||
android:inputType="text" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="right" | |||||
android:weightSum="1" > | |||||
<CheckedTextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="SN:" | |||||
android:id="@+id/checkedTextView4" | |||||
android:checked="false" /> | |||||
<EditText | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:ems="10" | |||||
android:id="@+id/sn" | |||||
android:inputType="text" /> | |||||
</LinearLayout> | |||||
<LinearLayout | |||||
android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="right" | |||||
android:weightSum="1" > | |||||
<CheckedTextView | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="设备名:" | |||||
android:id="@+id/checkedTextView5" | |||||
android:checked="false" /> | |||||
<EditText | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:ems="10" | |||||
android:id="@+id/device_name" | |||||
android:inputType="text" /> | |||||
</LinearLayout> | |||||
<LinearLayout android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"> | |||||
<Button | |||||
android:id="@+id/btn_connect" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="开始配网" | |||||
/> | |||||
<Button android:id="@+id/btn_login" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="登录" /> | |||||
<Button | |||||
android:id="@+id/deviceid" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取设备id" | |||||
/> | |||||
<Button | |||||
android:id="@+id/weight_result" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取体重数据" | |||||
/> | |||||
</LinearLayout> | |||||
<LinearLayout android:orientation="horizontal" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content"> | |||||
<Button | |||||
android:id="@+id/clear_log" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="清除log" | |||||
/> | |||||
<Button | |||||
android:id="@+id/clear_record" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="删除这条记录" | |||||
/> | |||||
<Button | |||||
android:id="@+id/get_record" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="获取测试数据" | |||||
/> | |||||
</LinearLayout> | |||||
<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> | |||||
<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> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="match_parent" | |||||
android:background="@android:color/white" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tv_hint_data_title" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_margin="10dp" | |||||
android:text="确定移除家人?" | |||||
android:padding="10dp" | |||||
android:gravity="center" | |||||
android:textColor="@android:color/black" | |||||
android:textSize="18dp" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/tv_hint_data_context" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_margin="15dp" | |||||
android:text="移除后所有数据清空" | |||||
android:padding="8dp" | |||||
android:gravity="center_vertical" | |||||
android:textSize="18dp" | |||||
/> | |||||
<View | |||||
android:layout_width="match_parent" | |||||
android:layout_height="1dp" | |||||
android:layout_marginTop="15dp" | |||||
android:background="@android:color/black" | |||||
/> | |||||
<LinearLayout | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:orientation="horizontal" | |||||
> | |||||
<TextView | |||||
android:id="@+id/tv_hint_data_cancel" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
android:gravity="center" | |||||
android:padding="10dp" | |||||
android:text="取消" | |||||
android:textSize="18dp" | |||||
/> | |||||
<View | |||||
android:id="@+id/view_cancel_line" | |||||
android:layout_width="1dp" | |||||
android:layout_height="match_parent" | |||||
android:background="@android:color/black" | |||||
/> | |||||
<TextView | |||||
android:id="@+id/tv_hint_data_ok" | |||||
android:layout_width="0dp" | |||||
android:layout_height="wrap_content" | |||||
android:layout_weight="1" | |||||
android:gravity="center" | |||||
android:padding="10dp" | |||||
android:text="ok" | |||||
android:textSize="18dp" | |||||
/> | |||||
</LinearLayout> | |||||
</LinearLayout> |
<?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:background="@drawable/bg_btn_white_dialog" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/tv_dialog_list_data_title" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="center" | |||||
android:padding="10dp" | |||||
android:text="请选择" | |||||
android:textColor="@android:color/black" | |||||
android:textSize="16dp"/> | |||||
<androidx.recyclerview.widget.RecyclerView | |||||
android:id="@+id/rv_dialog_list" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:overScrollMode="never" | |||||
android:scrollbars="none"/> | |||||
<View | |||||
android:layout_width="match_parent" | |||||
android:layout_height="1px" | |||||
android:background="@android:color/black"/> | |||||
<TextView | |||||
android:id="@+id/tv_dialog_photo_cancel" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:gravity="center" | |||||
android:padding="10dp" | |||||
android:text="取消" | |||||
android:textColor="@android:color/black" | |||||
/> | |||||
</LinearLayout> |
<?xml version="1.0" encoding="utf-8"?> | |||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="50dp" | |||||
android:background="@android:color/white" | |||||
android:gravity="center"> | |||||
<TextView | |||||
android:id="@+id/tv_dialog_list_data" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:padding="10dp" | |||||
android:text="永久" | |||||
android:textColor="@android:color/black" | |||||
android:textSize="16dp" | |||||
/> | |||||
</LinearLayout> |
<?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:background="#ffffff" | |||||
android:orientation="vertical"> | |||||
<TextView | |||||
android:id="@+id/id" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="60dp" | |||||
android:padding="10dp" | |||||
android:gravity="center" | |||||
android:textSize="15dp" /> | |||||
<TextView | |||||
android:id="@+id/sex" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/id" | |||||
android:padding="5dp" | |||||
android:text="sex:" | |||||
android:textSize="15dp" /> | |||||
<RadioGroup | |||||
android:id="@+id/sexrg" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/id" | |||||
android:layout_toRightOf="@id/sex" | |||||
android:orientation="horizontal" | |||||
android:padding="5dp"> | |||||
<RadioButton | |||||
android:id="@+id/man" | |||||
android:textColor="#000000" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="男" /> | |||||
<RadioButton | |||||
android:id="@+id/female" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:textColor="#000000" | |||||
android:text="女" /> | |||||
</RadioGroup> | |||||
<TextView | |||||
android:id="@+id/mode" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/sex" | |||||
android:padding="5dp" | |||||
android:text="模式:" | |||||
android:textSize="15dp" /> | |||||
<RadioGroup | |||||
android:id="@+id/moderg" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/sex" | |||||
android:layout_toRightOf="@id/sex" | |||||
android:orientation="horizontal" | |||||
android:padding="5dp"> | |||||
<RadioButton | |||||
android:id="@+id/ordinary" | |||||
android:textColor="#000000" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="普通人" /> | |||||
<RadioButton | |||||
android:id="@+id/athlete" | |||||
android:layout_width="wrap_content" | |||||
android:textColor="#000000" | |||||
android:layout_height="wrap_content" | |||||
android:text="运动员" /> | |||||
<RadioButton | |||||
android:id="@+id/pregnant" | |||||
android:textColor="#000000" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="wrap_content" | |||||
android:text="孕妇" /> | |||||
</RadioGroup> | |||||
<TextView | |||||
android:id="@+id/age" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/mode" | |||||
android:padding="5dp" | |||||
android:text="年龄:" | |||||
android:textSize="15dp" /> | |||||
<SeekBar | |||||
android:id="@+id/agesb" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/mode" | |||||
android:layout_toRightOf="@id/age" | |||||
android:max="100" | |||||
android:min="5" /> | |||||
<TextView | |||||
android:id="@+id/height" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/age" | |||||
android:padding="5dp" | |||||
android:text="身高:" | |||||
android:textSize="15dp" /> | |||||
<SeekBar | |||||
android:id="@+id/heightsb" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/age" | |||||
android:layout_toRightOf="@id/height" | |||||
android:max="250" | |||||
android:min="0" /> | |||||
<TextView | |||||
android:id="@+id/weight" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/height" | |||||
android:padding="5dp" | |||||
android:text="体重:" | |||||
android:textSize="15dp" /> | |||||
<SeekBar | |||||
android:id="@+id/weightsb" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/height" | |||||
android:layout_toRightOf="@id/weight" | |||||
android:max="200" | |||||
android:min="5" /> | |||||
<TextView | |||||
android:id="@+id/adc" | |||||
android:layout_width="wrap_content" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/weight" | |||||
android:padding="5dp" | |||||
android:text="阻抗:" | |||||
android:textSize="15dp" /> | |||||
<SeekBar | |||||
android:id="@+id/adcsb" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="40dp" | |||||
android:layout_below="@id/weight" | |||||
android:layout_toRightOf="@id/weight" | |||||
android:max="1000" | |||||
android:min="0" /> | |||||
<TextView | |||||
android:layout_below="@id/adcsb" | |||||
android:id="@+id/tv_move_data_ok" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginEnd="25dp" | |||||
android:layout_marginStart="25dp" | |||||
android:layout_marginTop="40dp" | |||||
android:background="#2878ce" | |||||
android:gravity="center" | |||||
android:padding="10dp" | |||||
android:text="确认" | |||||
android:textColor="#ffffff" | |||||
android:textSize="18dp" | |||||
/> | |||||
<TextView | |||||
android:layout_below="@id/tv_move_data_ok" | |||||
android:id="@+id/tv_move_data_cancel" | |||||
android:layout_width="match_parent" | |||||
android:layout_height="wrap_content" | |||||
android:layout_marginEnd="25dp" | |||||
android:layout_marginStart="25dp" | |||||
android:layout_marginTop="10dp" | |||||
android:gravity="center" | |||||
android:padding="10dp" | |||||
android:text="取消" | |||||
android:textSize="15dp" | |||||
/> | |||||
</RelativeLayout> |
<color name="colorPrimary">#008577</color> | <color name="colorPrimary">#008577</color> | ||||
<color name="colorPrimaryDark">#00574B</color> | <color name="colorPrimaryDark">#00574B</color> | ||||
<color name="colorAccent">#D81B60</color> | <color name="colorAccent">#D81B60</color> | ||||
<color name="public_white">#FFFFFF</color> | |||||
</resources> | </resources> |
} | } | ||||
dependencies { | dependencies { | ||||
classpath 'com.android.tools.build:gradle:3.4.0' | classpath 'com.android.tools.build:gradle:3.4.0' | ||||
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.0' | |||||
// NOTE: Do not place your application dependencies here; they belong | // NOTE: Do not place your application dependencies here; they belong | ||||
// in the individual module build.gradle files | // in the individual module build.gradle files | ||||
} | } |