From 2664e9cf7661bf498370a893efebe4446adff3d4 Mon Sep 17 00:00:00 2001 From: jia Date: Mon, 6 Jan 2025 22:12:40 +0800 Subject: [PATCH] ble --- .../newbind/NewBindDeviceActivity.java | 188 ++++++++++++++---- .../com/ifish/fragment/DeviceFragment.java | 156 ++++++++------- .../main/java/com/ifish/utils/AppUtil.java | 33 ++- 3 files changed, 265 insertions(+), 112 deletions(-) diff --git a/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java b/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java index 1a91779d8..4124ac176 100644 --- a/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java +++ b/iFish7/src/main/java/com/ifish/activity/newbind/NewBindDeviceActivity.java @@ -28,6 +28,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.annotation.RequiresPermission; import androidx.appcompat.app.AppCompatActivity; //jjia-xpush import com.clj.fastble.BleManager; @@ -58,6 +59,7 @@ import com.ifish.activity.MainThree1CControlActivity; import com.ifish.activity.MainThreeControlActivity; import com.ifish.activity.MainTwoControlActivity; import com.ifish.activity.MainZeroControlActivity; +import com.ifish.activity.MineActivity; import com.ifish.activity.R; import com.ifish.activity.WebViewActivity; import com.ifish.basebean.BaseBean; @@ -65,6 +67,7 @@ import com.ifish.basebean.ConnectMessageEvent; import com.ifish.basebean.Device; import com.ifish.basebean.EventBean; import com.ifish.baseclass.BaseGradeActivity; +import com.ifish.permission.PermissionHelper; import com.ifish.tcp.BackFunctionCode7_11; import com.ifish.tcp.ModelCodec; import com.ifish.tcp.OrderDeviceConnectModel; @@ -73,6 +76,7 @@ import com.ifish.tcp.ResetDeviceModel; import com.ifish.utils.ActivityManager; import com.ifish.utils.AnimationUtil; import com.ifish.utils.AppRoute; +import com.ifish.utils.AppUtil; import com.ifish.utils.BlueToothUtil; import com.ifish.utils.ByteUtil; import com.ifish.utils.ClickUtil; @@ -83,6 +87,7 @@ import com.ifish.utils.L; import com.ifish.utils.SPUtil; import com.ifish.utils.ToastUtil; import com.ifish.utils.WifiAdmin; +import com.ifish.view.IosAlertDialog; import com.lidroid.xutils.util.LogUtils; import java.io.BufferedReader; @@ -130,12 +135,15 @@ public class NewBindDeviceActivity extends AppCompatActivity { private Dialog waterTempDialog; String type = null; private Activity activity; + private PermissionHelper permissionHelper; + String[] permission; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_new_bind_device_choice); activity = this; - + permission = AppUtil.getBluePermissionList(); + permissionHelper = new PermissionHelper(this, permission, 250); ActivityManager.getInstance().addActivity(this); sp=SPUtil.getInstance(this); @@ -470,43 +478,14 @@ public class NewBindDeviceActivity extends AppCompatActivity { break; case BlueTooth: - - - //jjia-xpush - boolean support = BleManager.getInstance().isSupportBle(); - if (!support){ - ToastUtil.show(NewBindDeviceActivity.this,"当前设备不支持低功耗蓝牙"); + if (permissionHelper.checkSelfPermission(permission)) { + blueClick(); } else { - boolean enable = BleManager.getInstance().isBlueEnable(); - if (enable){ - if (TextUtils.isEmpty(type)){ - blueScan(); - }else { - showDialog("开始连接蓝牙设备"); - connectBle(); - } - }else { - AlertDialog.Builder dialog = new AlertDialog.Builder(NewBindDeviceActivity.this, AlertDialog.THEME_HOLO_LIGHT); - dialog.setCancelable(false); - dialog.setMessage("蓝牙没有打开,现在去申请打开蓝牙,请允许后,再点击'确定'连接"); - dialog.setPositiveButton("去申请", new DialogInterface.OnClickListener() { - @Override - public void onClick( - DialogInterface dialog, - int which) { - BlueToothUtil.openBlueTooth(NewBindDeviceActivity.this); - } - }); - dialog.setNegativeButton("拒绝", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - finish(); - } - }); - dialog.show(); - } + showPermissionHint(); } + + break; case APConnect: //开始AP连接 @@ -520,6 +499,124 @@ public class NewBindDeviceActivity extends AppCompatActivity { break; } } + + private void showPermissionHint(){ + IosAlertDialog dialog = new IosAlertDialog(this).builder(); + dialog.setCancelable(false); + dialog.setTitle("权限申请理由"); + dialog.setMessage("蓝牙联网,需要app获取手机的蓝牙扫描权限才能进行蓝牙扫描,是否允许申请蓝牙扫描相关权限?"); + dialog.setNegativeButton("拒绝", view -> { + + }); + dialog.setPositiveButton("申请", view -> + { + getPermission(); + }); + dialog.show(); + } + + private void getPermission() { + permissionHelper.request(new PermissionHelper.PermissionCallback() { + @Override + public void onPermissionGranted() { + blueClick(); + } + + @Override + public void onIndividualPermissionGranted(String[] grantedPermission) { + AlertDialog.Builder dialog = new AlertDialog.Builder(NewBindDeviceActivity.this); + dialog.setCancelable(false); + dialog.setMessage("蓝牙联网,请先同意app获取蓝牙相关权限"); + dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick( + DialogInterface dialog, + int which) { + + } + }); + dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + dialog.show(); + } + + @Override + public void onPermissionDenied() { + AlertDialog.Builder dialog = new AlertDialog.Builder(NewBindDeviceActivity.this); + dialog.setCancelable(false); + dialog.setMessage("蓝牙联网,请先同意app获取蓝牙相关权限"); + dialog.setPositiveButton("确定", new DialogInterface.OnClickListener() { + @Override + public void onClick( + DialogInterface dialog, + int which) { + getPermission(); + } + }); + dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + } + }); + dialog.show(); + } + + @Override + public void onPermissionDeniedBySystem() { + AlertDialog.Builder dialog = new AlertDialog.Builder(NewBindDeviceActivity.this); + dialog.setCancelable(false); + dialog.setTitle("温馨提示"); + dialog.setMessage("蓝牙联网,请到应用信息页面-权限管理-打开蓝牙权限"); + dialog.setPositiveButton("去开启", (dialog1, which) -> { + AppUtil.toAuthority(NewBindDeviceActivity.this); + }); + dialog.setNegativeButton("取消", (dialog12, which) -> { + }); + dialog.show(); + } + }); + } + + + private void blueClick(){ + //jjia-xpush + boolean support = BleManager.getInstance().isSupportBle(); + if (!support){ + ToastUtil.show(NewBindDeviceActivity.this,"当前设备不支持低功耗蓝牙"); + } else { + boolean enable = BleManager.getInstance().isBlueEnable(); + if (enable){ + if (TextUtils.isEmpty(type)){ + blueScan(); + }else { + showDialog("开始连接蓝牙设备"); + connectBle(); + } + }else { + AlertDialog.Builder dialog = new AlertDialog.Builder(NewBindDeviceActivity.this, AlertDialog.THEME_HOLO_LIGHT); + dialog.setCancelable(false); + dialog.setMessage("蓝牙没有打开,现在去申请打开蓝牙,请允许后,再点击'确定'连接"); + dialog.setPositiveButton("去申请", new DialogInterface.OnClickListener() { + @Override + public void onClick( + DialogInterface dialog, + int which) { + BlueToothUtil.openBlueTooth(NewBindDeviceActivity.this); + } + }); + dialog.setNegativeButton("拒绝", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }); + dialog.show(); + } + } + } //jjia-xpush private void blueScan(){ BleManager.getInstance().scan(new BleScanCallback() { @@ -698,19 +795,19 @@ public class NewBindDeviceActivity extends AppCompatActivity { @Override public void onWriteSuccess(int current, int total, byte[] justWrite) { - L.i("jjia-------------ssid 发送"); + L.i("jjia-------------ssid 发送ok"); } @Override public void onWriteFailure(BleException exception) { - + L.i("jjia-------------发送-失败"+exception.toString()); } }); } //jjia-xpush private void toReset(){ ResetDeviceModel model = OrderModel.resetDevice();//设置正式环境域名 - byte[] data = ModelCodec.enCode(model); + byte[] data = ModelCodec.enCode(model,Commons.IoBuffer); // data = new byte[1]; // QueryTempeSettingModel xx = OrderModel.OrderQueryTempeSettingModel(device_mac); @@ -733,11 +830,20 @@ public class NewBindDeviceActivity extends AppCompatActivity { public static final String READ_UUID = "0000ff01-0000-1000-8000-00805f9b34fb"; //读特征 public static final String WRITE_UUID = "0000ff01-0000-1000-8000-00805f9b34fb"; //写特征 + // 全局gatt + private BluetoothGatt mGatt; //jjia-xpush private void connectBle(){ BleManager.getInstance().connect(currentDevice, new BleGattCallback() { + @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT) @Override public void onStartConnect() { + + if (mGatt!=null){ + mGatt.disconnect(); + mGatt.close(); + mGatt = null; + } showDialog("开始连接蓝牙设备"); } @@ -751,6 +857,8 @@ public class NewBindDeviceActivity extends AppCompatActivity { public void onConnectSuccess(BleDevice bleDevice, BluetoothGatt gatt, int status) { // ToastUtil.show(NewBindDeviceActivity.this,"蓝牙连接成功"); // setMessage("蓝牙连接成功"); + + mGatt = gatt; BleManager.getInstance().setMtu(bleDevice, 512, new BleMtuChangedCallback() { @Override public void onSetMTUFailure(BleException exception) { @@ -1181,6 +1289,10 @@ public class NewBindDeviceActivity extends AppCompatActivity { L.i(requestCode+"jjia--------result-1--"+requestCode); if (101== requestCode && 0==resultCode){ checkNet(); + }else if(250==requestCode){ + if (permissionHelper.checkSelfPermission(permission)) { + blueClick(); + } } } private void showDialog(String msg){ diff --git a/iFish7/src/main/java/com/ifish/fragment/DeviceFragment.java b/iFish7/src/main/java/com/ifish/fragment/DeviceFragment.java index 5390d0a0e..963f052ee 100644 --- a/iFish7/src/main/java/com/ifish/fragment/DeviceFragment.java +++ b/iFish7/src/main/java/com/ifish/fragment/DeviceFragment.java @@ -9,6 +9,7 @@ package com.ifish.fragment; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; +import android.Manifest; import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; @@ -22,6 +23,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.graphics.Color; import android.net.Uri; import android.os.Build; @@ -50,6 +52,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import com.bumptech.glide.Glide; //jjia-xpush @@ -193,6 +196,7 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi private PermissionHelper permissionHelper; String[] permission; + String[] permission_blue; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -215,8 +219,10 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi initInformation(); permission = new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}; + permission_blue = AppUtil.getBluePermissionList(); permissionHelper = new PermissionHelper(DeviceFragment.this, permission, 250); -// initBooth(); + + initBooth(); boolean notificationsEnabled = PushManager.getInstance().areNotificationsEnabled(requireActivity()); if (!notificationsEnabled){ toOpenNotifications(); @@ -270,9 +276,6 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi @Override public void onPermissionGranted() { - - - Intent intent = new Intent(); intent.setClass(getActivity(), BindTwoDeviceActivity.class); startActivity(intent); @@ -1911,37 +1914,38 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi } //jjia-xpush private void initBooth(){ - boolean enable = BleManager.getInstance().isBlueEnable(); - if (enable) { - BleManager.getInstance().scan(new BleScanCallback() { - @Override - public void onScanFinished(List scanResultList) { - if (currentDevice!=null){ // 扫描结束,有设备 - L.i("jjjia-----------scan---"); - showDevice(); - } - } - - @Override - public void onScanStarted(boolean success) { - - } - - @SuppressLint("MissingPermission") - @Override - public void onScanning(BleDevice bleDevice) { - if (bleDevice!=null && bleDevice.getDevice()!=null){ - BluetoothDevice bean = bleDevice.getDevice(); - if (!TextUtils.isEmpty(bean.getName()) && bean.getName().startsWith("ifish")){ - currentDevice = bleDevice; - BleManager.getInstance().cancelScan(); + if (AppUtil.checkSelfPermission(getContext(),permission_blue)) { + boolean enable = BleManager.getInstance().isBlueEnable(); + if (enable) { + BleManager.getInstance().scan(new BleScanCallback() { + @Override + public void onScanFinished(List scanResultList) { + if (currentDevice!=null){ // 扫描结束,有设备 + L.i("jjjia-----------scan---"); + showDevice(); } - L.i(bean.getName()+"jjia------mac---"+bean.getAddress()); } - } - }); - } + @Override + public void onScanStarted(boolean success) { + + } + + @SuppressLint("MissingPermission") + @Override + public void onScanning(BleDevice bleDevice) { + if (bleDevice!=null && bleDevice.getDevice()!=null){ + BluetoothDevice bean = bleDevice.getDevice(); + if (!TextUtils.isEmpty(bean.getName()) && bean.getName().startsWith("ifish")){ + currentDevice = bleDevice; + BleManager.getInstance().cancelScan(); + } + L.i(bean.getName()+"jjia------mac---"+bean.getAddress()); + } + } + }); + } + } } //jjia-xpush BleDevice currentDevice; @@ -1964,10 +1968,11 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi if (!isShowIng){ currentDevice = null; } - BleManager.getInstance().cancelScan(); - }else + if (AppUtil.checkSelfPermission(getContext(),permission_blue)) { + BleManager.getInstance().cancelScan(); + } - if (EventBean.TAB_INDEX.equals(eventBean.name)){ + }else if (EventBean.TAB_INDEX.equals(eventBean.name)){ currentIndex = eventBean.index; L.i("jjia-----tab_index--"+eventBean.index); if (currentIndex == 0){ @@ -2039,42 +2044,43 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi CountDownTimer countDownTimer; private void startDownTimer(){ closeDownTimer(); - if (!isShowIng && currentIndex == 0){ - dowmCount = 1; - countDownTimer = new CountDownTimer(2000000000,1000) { - @Override - public void onTick(long l) { - L.i("jjia-----dowmCount--"+dowmCount); - //jjia-xpush - if (dowmCount%6==0){ - BleScanState scanState = getScanState(); - L.i("jjia-----------timer--"+scanState); - if (BleScanState.STATE_IDLE.equals(scanState)){ - if (isShowIng){ - L.i("jjia-----已经扫描到设备了,等待反馈-"); - closeDownTimer(); + if (AppUtil.checkSelfPermission(getContext(),permission_blue)) { + if (!isShowIng && currentIndex == 0){ + dowmCount = 1; + countDownTimer = new CountDownTimer(2000000000,1000) { + @Override + public void onTick(long l) { + L.i("jjia-----dowmCount--"+dowmCount); + //jjia-xpush + if (dowmCount%6==0){ + BleScanState scanState = getScanState(); + L.i("jjia-----------timer--"+scanState); + if (BleScanState.STATE_IDLE.equals(scanState)){ + if (isShowIng){ + L.i("jjia-----已经扫描到设备了,等待反馈-"); + closeDownTimer(); + }else { + initBooth(); + L.i("jjia-----开始扫描-"); + } }else { - initBooth(); - L.i("jjia-----开始扫描-"); + L.i("jjia----timer--上一次的扫描还在继续中-"); } - }else { - L.i("jjia----timer--上一次的扫描还在继续中-"); } + + dowmCount++; } - dowmCount++; - } - - @Override - public void onFinish() { - L.i("jjia---倒计时完成----------"); - } - }; - countDownTimer.start(); - }else { - L.i("jjia----timer--已扫描到设备,暂不执行倒计时-"); + @Override + public void onFinish() { + L.i("jjia---倒计时完成----------"); + } + }; + countDownTimer.start(); + }else { + L.i("jjia----timer--已扫描到设备,暂不执行倒计时-"); + } } - } private void closeDownTimer(){ @@ -2087,7 +2093,6 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi private BleScanState getScanState(){ return BleManager.getInstance().getScanSate(); } - @Override public void onPause() { super.onPause(); @@ -2096,14 +2101,19 @@ public class DeviceFragment extends BaseV4Fragment implements ObservableScrollVi private void oonPause(){ closeDownTimer(); - //jjia-xpush - BleScanState scanState = getScanState(); - if (BleScanState.STATE_SCANNING.equals(scanState)) { - BleManager.getInstance().cancelScan(); - L.i("jjia---扫描暂停----------"); - } else { + if (AppUtil.checkSelfPermission(getContext(),permission_blue)) { + //jjia-xpush + BleScanState scanState = getScanState(); + if (BleScanState.STATE_SCANNING.equals(scanState)) { + BleManager.getInstance().cancelScan(); + L.i("jjia---扫描暂停----------"); + } else { + } + L.i("jjia---扫描暂停-"+scanState); } - L.i("jjia---扫描暂停-"+scanState); + } + + } diff --git a/iFish7/src/main/java/com/ifish/utils/AppUtil.java b/iFish7/src/main/java/com/ifish/utils/AppUtil.java index 89e2178f7..94d1f9a04 100644 --- a/iFish7/src/main/java/com/ifish/utils/AppUtil.java +++ b/iFish7/src/main/java/com/ifish/utils/AppUtil.java @@ -6,6 +6,7 @@ import android.bluetooth.BluetoothManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.text.TextUtils; @@ -14,6 +15,7 @@ import android.widget.ImageView; import androidx.activity.ComponentActivity; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; import com.ifish.activity.R; import com.squareup.picasso.Picasso; @@ -258,7 +260,14 @@ public class AppUtil { return false; } } - + public static boolean checkSelfPermission(Context context ,String[] permissions) { + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } public static String [] getImagePermissionList(){ List perList = new ArrayList<>(); @@ -282,6 +291,28 @@ public class AppUtil { return permissions; } + + public static String [] getBluePermissionList(){ + List perList = new ArrayList<>(); + perList.add(android.Manifest.permission.BLUETOOTH); + perList.add(android.Manifest.permission.ACCESS_FINE_LOCATION); + perList.add(android.Manifest.permission.ACCESS_COARSE_LOCATION); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){ + perList.add(android.Manifest.permission.BLUETOOTH_SCAN); + perList.add(android.Manifest.permission.BLUETOOTH_ADVERTISE); + perList.add(android.Manifest.permission.BLUETOOTH_CONNECT); + }else { + + } + int size = perList.size(); + String [] permissions = new String[size]; + + for (int i = 0;i