陈福行 2 роки тому
джерело
коміт
2f47d8d370

+ 8
- 9
app/build.gradle Переглянути файл

@@ -1,14 +1,13 @@
apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.butterknife'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
compileSdkVersion 31
defaultConfig {
applicationId "aicare.net.cn.sdk.ailinksdkdemoandroid"
minSdkVersion 19
targetSdkVersion 29
versionCode 15
versionName "1.10.2"
targetSdkVersion 31
versionCode 16
versionName "1.10.3"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -19,8 +18,8 @@ android {
}

compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
sourceCompatibility '1.8'
targetCompatibility '1.8'
}
sourceSets {
main {
@@ -32,10 +31,10 @@ android {

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.12'
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.10.2'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKRepositoryAndroid:1.10.3'//蓝牙核心库
implementation 'com.github.elinkthings:AILinkSDKOtaLibraryAndroid:1.0.3'//OTA库,需要依赖核心库
implementation 'com.github.elinkthings:AILinkSDKParsingLibraryAndroid:1.6.8'//蓝牙解析库
implementation 'androidx.recyclerview:recyclerview:1.1.0'

+ 26
- 9
app/src/main/AndroidManifest.xml Переглянути файл

@@ -4,24 +4,40 @@
xmlns:tools="http://schemas.android.com/tools">


<!--兼容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 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" />

<!--兼容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
android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!--android12还需要增加如下权限,也需求动态申请-->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!--android10,11需要后台扫描的,需要添加如下权限-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="false" />
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />

<!--OTA需要读写文件-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true"/>

<application
android:allowBackup="true"
@@ -33,7 +49,8 @@
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme"
tools:targetApi="q">
<activity android:name=".MainActivity">
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />

+ 55
- 156
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/ShowBleActivity.java Переглянути файл

@@ -1,20 +1,9 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid;

import android.Manifest;
import android.app.Activity;
import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
@@ -30,7 +19,6 @@ import com.pingwang.bluetoothlib.device.BleDevice;
import com.pingwang.bluetoothlib.listener.CallbackDisIm;
import com.pingwang.bluetoothlib.listener.OnCallbackBle;
import com.pingwang.bluetoothlib.listener.OnScanFilterListener;
import com.pingwang.bluetoothlib.server.ELinkBleServer;
import com.pingwang.bluetoothlib.utils.BleLog;
import com.pingwang.bluetoothlib.utils.BleStrUtils;

@@ -40,6 +28,7 @@ import java.util.List;
import java.util.Map;
import java.util.UUID;

import aicare.net.cn.sdk.ailinksdkdemoandroid.base.BleAppBaseActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.config.BleDeviceConfig;
import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.LoadingIosDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.find.FindDeviceNewActivity;
@@ -48,12 +37,8 @@ import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.food_temp.FoodTempActivity
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_charger.ShareChargerActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_condom.ShareCondomActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.modules.share_socket.ShareSocketActivity;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import cn.net.aicare.modulelibrary.module.RopeSkipping.RopeSkippingBleData;
import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;

@@ -63,9 +48,8 @@ import cn.net.aicare.modulelibrary.module.scooter.SkateboardBleConfig;
* 2019/3/6<br>
* java类作用描述
*/
public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle, OnScanFilterListener {
public class ShowBleActivity extends BleAppBaseActivity implements OnCallbackBle, OnScanFilterListener {

public static final int REQUEST_PERMISSION_CODE = 1500;

private static String TAG = ShowBleActivity.class.getName();

@@ -74,12 +58,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
private final int REFRESH_DATA = 3;
private List<String> mList;
private ArrayAdapter listAdapter;
private ELinkBleServer mBluetoothService;
/**
* 服务Intent
*/
private Intent bindIntent;
private Context mContext;
private int mType;
private String mNoEncryptionMac = "";
private String mFilterName = "";
@@ -87,46 +65,36 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
private int mCid;
private int mVid;
private int mPid;
private Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {

case BIND_SERVER_OK:
@Override
protected void uiHandlerMessage(Message msg) {
switch (msg.what) {

break;
case BIND_SERVER_OK:

case REFRESH_DATA:
listAdapter.notifyDataSetChanged();
break;
}
break;

case REFRESH_DATA:
listAdapter.notifyDataSetChanged();
break;
}
};
}

@Override
protected int getLayoutId() {
return R.layout.activity_show_ble;
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show_ble);
Intent mUserService = new Intent(this.getApplicationContext(), ELinkBleServer.class);
//核心用户服务
startService(mUserService);
mContext = this;
protected void initData() {
mType = getIntent().getIntExtra("type", 0);
if (0 == mType) {
finish();
return;
}
init();
initData();
}

private void initData() {
bindService();

}

private void init() {
@Override
protected void initView() {
mList = new ArrayList<>();
ListView listView = findViewById(R.id.listview);
Button btn = findViewById(R.id.btn);
@@ -147,8 +115,7 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
mBluetoothService.scanLeDevice(0, map, BleConfig.UUID_SERVER_AILINK, SkateboardBleConfig.UUID_BROADCAST);
} else {
//0000FEE7=手表
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK, UUID
.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
mBluetoothService.scanLeDevice(0, BleConfig.UUID_SERVER_AILINK, UUID.fromString("0000FEE7-0000-1000-8000-00805F9B34FB"), SkateboardBleConfig.UUID_BROADCAST);
}
mList.clear();
listAdapter.notifyDataSetChanged();
@@ -202,7 +169,7 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
startActivity(intent);
finish();

} else if (BleDeviceConfig.TOOTHBRUSH_BLE==mType){
} else if (BleDeviceConfig.TOOTHBRUSH_BLE == mType) {
mBluetoothService.stopScan();
Intent intent = new Intent();
intent.setClass(ShowBleActivity.this, ToothBrushBleActivity.class);
@@ -210,7 +177,7 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
intent.putExtra("mac", mac);
startActivity(intent);
finish();
}else {
} else {
if (mCid == BleDeviceConfig.BLE_BOOLD_OXYGEN && mVid == 0x0012) {
//vid=12的不用握手校验,不加密
mNoEncryptionMac = mac;
@@ -251,56 +218,33 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
}


//---------------------------------服务---------------------------------------------------
@Override
protected void initListener() {

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() {
if (mBluetoothService != null)
mBluetoothService.stopForeground();//停止前台服务
CallbackDisIm.getInstance().removeListener(this);
if (mFhrSCon != null) {
BleLog.i(TAG, "解绑服务");
this.unbindService(mFhrSCon);
//---------------------------------服务---------------------------------------------------

@Override
public void onServiceSuccess() {
if (mBluetoothService!=null) {
mBluetoothService.setOnCallback(ShowBleActivity.this);
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this);
mHandler.sendEmptyMessage(BIND_SERVER_OK);
}
bindIntent = null;
CallbackDisIm.getInstance().addListListener(this);
}

@Override
public void onServiceErr() {

/**
* 服务连接与界面的连接
*/
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(ShowBleActivity.this);
mBluetoothService.setOnScanFilterListener(ShowBleActivity.this);
mBluetoothService.initForegroundService(1, R.mipmap.ic_launcher, "前台服务", MainActivity.class);
mBluetoothService.startForeground();//启动前台服务

mHandler.sendEmptyMessage(BIND_SERVER_OK);
}
}
}

@Override
public void onServiceDisconnected(ComponentName name) {
BleLog.i(TAG, "服务与界面连接断开");
//与服务断开连接
mBluetoothService = null;
}
};
@Override
public void unbindServices() {
CallbackDisIm.getInstance().removeListener(this);
}


@Override
@@ -517,13 +461,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
//TODO 过滤后的设备
}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_PERMISSION_CODE) {
checkPermission();
}
}

//--------------------------start Loading--------------------------
private LoadingIosDialogFragment mDialogFragment;
@@ -532,8 +469,9 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
* 显示加载
*/
private void showLoading() {
if (mDialogFragment == null)
if (mDialogFragment == null) {
mDialogFragment = new LoadingIosDialogFragment();
}
mDialogFragment.show(getSupportFragmentManager());
}

@@ -541,8 +479,9 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
* 关闭加载
*/
private void dismissLoading() {
if (mDialogFragment != null)
if (mDialogFragment != null) {
mDialogFragment.dismiss();
}
}

//--------------------------end Loading--------------------------
@@ -563,7 +502,6 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
if (mBluetoothService != null) {
mBluetoothService.stopScan();
}
unbindService();
}


@@ -578,29 +516,14 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
requestBluetooth();
return;
}
// 没有定位权限就请求定位权限
if (!hasLocationPermission()) {
requestLocationPermission(this);
return;
}
// 没有定位服务就请求定位服务
if (!hasLocationService()) {
requestLocationService();
return;
}
// 都有了,OK
Toast.makeText(mContext, "权限都有,可以开始搜索", Toast.LENGTH_SHORT).show();
}
new CheckPermissionUtils(this).checkPermissions(() -> {
// 都有了,OK
Toast.makeText(mContext, "权限都有,可以开始搜索", Toast.LENGTH_SHORT).show();

/**
* 是否有定位权限
*
* @return boolean
*/
private boolean hasLocationPermission() {
return ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
});
}


/**
* 蓝牙是否打开
*
@@ -610,39 +533,15 @@ public class ShowBleActivity extends AppCompatActivity implements OnCallbackBle,
return BluetoothAdapter.getDefaultAdapter().isEnabled();
}

/**
* 定位服务是否打开
*
* @return boolean
*/
private boolean hasLocationService() {
LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
if (locationManager == null) {
return false;
}
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}

/**
* 申请定位权限
*/
private void requestLocationPermission(Activity activity) {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_PERMISSION_CODE);
}

/**
* 申请打开蓝牙
*/
@SuppressLint("MissingPermission")
private void requestBluetooth() {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
startActivity(intent);
}

/**
* 申请打开定位服务
*/
private void requestLocationService() {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
}

}

+ 6
- 6
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/WeightScaleWifiBleActivity.java Переглянути файл

@@ -687,9 +687,9 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.


private void setIp(byte[] ips) {
if (ips.length <= 14)
if (ips.length <= 14) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().environmentIp(0, ips));
else {
} else {
boolean isend = false;
int i = 0;
byte[] byte1 = ips;
@@ -717,9 +717,9 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
}

private void setIpUrl(byte[] setIpUrl) {
if (setIpUrl.length <= 14)
if (setIpUrl.length <= 14) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().environmentUrl(0, setIpUrl));
else {
} else {
boolean isend = false;
int i = 0;
byte[] byte1 = setIpUrl;
@@ -778,9 +778,9 @@ public class WeightScaleWifiBleActivity extends BleBaseActivity implements View.
} else {
byte[] password = BleStrUtils.stringToBytes(paw);
if (password != null) {
if (password.length < 14)
if (password.length < 14) {
bodyFatBleUtilsData.sendData(BodyFatDataUtil.getInstance().setWifiPwd(0, password));
else {
} else {
boolean isend = false;
int i = 0;
byte[] byte1 = password;

+ 8
- 104
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/base/BleAppBaseActivity.java Переглянути файл

@@ -1,10 +1,7 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.base;

import android.Manifest;
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;
@@ -16,13 +13,9 @@ import android.widget.TextView;

import java.lang.ref.WeakReference;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.AppStart;
import androidx.annotation.NonNull;
import aicare.net.cn.sdk.ailinksdkdemoandroid.utils.CheckPermissionUtils;
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;

@@ -44,22 +37,7 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
@Nullable
protected Toolbar mToolbar;
private Unbinder bind;
//--------------ble---------------
/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.WRITE_EXTERNAL_STORAGE};

/**
* 权限请求返回
*/
private final int PERMISSION = 101;
/**
* 定位服务返回
*/
protected final int LOCATION_SERVER = 102;

private HintDataDialogFragment mHintDataDialog = null;


@Override
@@ -162,79 +140,12 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {


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();
new CheckPermissionUtils(this).checkPermissions(new CheckPermissionUtils.OnPermissionListener() {
@Override
public void onPermissionsOk() {
BleAppBaseActivity.this.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);
});

}

@@ -246,14 +157,6 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {

}

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == LOCATION_SERVER) {
//定位服务页面返回
initPermissions();
}
}

/**
* 初始化事件
@@ -350,7 +253,8 @@ public abstract class BleAppBaseActivity extends BleBaseActivity {
if (mHandler != null) {
mHandler.removeCallbacksAndMessages(null);
}
if (bind != null)
if (bind != null) {
bind.unbind();
}
}
}

+ 25
- 26
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/dialog/HintDataDialogFragment.java Переглянути файл

@@ -18,7 +18,6 @@ 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;
@@ -32,7 +31,7 @@ import androidx.fragment.app.FragmentManager;
public class HintDataDialogFragment extends DialogFragment {
private static String TAG = HintDataDialogFragment.class.getName();
private Context mContext;
private DialogListener mDialogListener;
private onDialogListener mDialogListener;
private TextView mTvTitle;
private TextView mTvCancel, mTvSucceed, mTvContent;
private View view_cancel_line;
@@ -42,10 +41,10 @@ public class HintDataDialogFragment extends DialogFragment {
* 是否居中
*/
private boolean isCenter = false;
private CharSequence mCancel;
private CharSequence mCancel="";
@ColorInt
private int mCancelColor = 0;
private CharSequence mOkStr;
private CharSequence mOkStr="";
@ColorInt
private int mOkColor = 0;
@ColorInt
@@ -54,7 +53,7 @@ public class HintDataDialogFragment extends DialogFragment {
/**
* 是否显示灰色背景
*/
private boolean mBackground=true;
private boolean mBackground = true;

/**
* 点击空白区域是否关闭
@@ -97,8 +96,7 @@ public class HintDataDialogFragment extends DialogFragment {

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
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

@@ -154,14 +152,14 @@ public class HintDataDialogFragment extends DialogFragment {
mTvContent = mDialogView.findViewById(R.id.tv_hint_data_context);
mTvCancel.setOnClickListener(v -> {
if (mDialogListener != null) {
mDialogListener.tvCancelListener(v);
mDialogListener.onCancelListener(v);
}
this.dismiss();

});
mTvSucceed.setOnClickListener(v -> {
if (mDialogListener != null) {
mDialogListener.tvSucceedListener(v);
mDialogListener.onSucceedListener(v);
}
this.dismiss();
});
@@ -182,10 +180,12 @@ public class HintDataDialogFragment extends DialogFragment {
public HintDataDialogFragment initColor(@ColorInt int cancelColor, @ColorInt int okColor) {
this.mCancelColor = cancelColor;
this.mOkColor = okColor;
if (mTvCancel != null && mCancelColor != 0)
if (mTvCancel != null && mCancelColor != 0) {
mTvCancel.setTextColor(mCancelColor);
if (mTvSucceed != null && mOkColor != 0)
}
if (mTvSucceed != null && mOkColor != 0) {
mTvSucceed.setTextColor(mOkColor);
}
return this;
}

@@ -200,10 +200,11 @@ public class HintDataDialogFragment extends DialogFragment {
} else if (mContent == null) {
mTvContent.setVisibility(View.GONE);
}
if (isCenter)
if (isCenter) {
mTvContent.setGravity(Gravity.CENTER);
else
} else {
mTvContent.setGravity(Gravity.CENTER_VERTICAL);
}
}
return this;
}
@@ -259,8 +260,9 @@ public class HintDataDialogFragment extends DialogFragment {
} else if (mOkStr == null) {
mTvSucceed.setVisibility(View.GONE);
}
if (mOkColor != 0)
if (mOkColor != 0) {
mTvSucceed.setTextColor(mOkColor);
}
}
return this;
}
@@ -303,8 +305,7 @@ public class HintDataDialogFragment extends DialogFragment {
*
* @param isCenter 显示的内容是否居中
*/
public HintDataDialogFragment initData(CharSequence title, CharSequence content,
boolean isCenter, CharSequence cancel, CharSequence ok) {
public HintDataDialogFragment initData(CharSequence title, CharSequence content, boolean isCenter, CharSequence cancel, CharSequence ok) {
setTitle(title, mTitleColor);
setContent(content, isCenter);
setCancel(cancel, mCancelColor);
@@ -322,8 +323,7 @@ public class HintDataDialogFragment extends DialogFragment {
/**
* 初始化数据
*/
public HintDataDialogFragment initData(CharSequence title, CharSequence content,
CharSequence cancel, CharSequence ok) {
public HintDataDialogFragment initData(CharSequence title, CharSequence content, CharSequence cancel, CharSequence ok) {
return this.initData(title, content, false, cancel, ok);
}

@@ -337,11 +337,10 @@ public class HintDataDialogFragment extends DialogFragment {
DisplayMetrics dm = new DisplayMetrics();
if (getActivity() != null) {
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
if (dialog.getWindow() != null)
if (dialog.getWindow() != null) {
//设置宽度为80%
dialog.getWindow()
.setLayout((int) (dm.widthPixels * 0.9),
ViewGroup.LayoutParams.WRAP_CONTENT);
dialog.getWindow().setLayout((int) (dm.widthPixels * 0.9), ViewGroup.LayoutParams.WRAP_CONTENT);
}
}
}
}
@@ -384,14 +383,14 @@ public class HintDataDialogFragment extends DialogFragment {
}
}

public interface DialogListener {
public interface onDialogListener {

/**
* 取消的点击事件
*
* @param v
*/
default void tvCancelListener(View v) {
default void onCancelListener(View v) {
}

/**
@@ -399,12 +398,12 @@ public class HintDataDialogFragment extends DialogFragment {
*
* @param v
*/
default void tvSucceedListener(View v) {
default void onSucceedListener(View v) {
}

}

public HintDataDialogFragment setDialogListener(DialogListener dialogListener) {
public HintDataDialogFragment setOnDialogListener(onDialogListener dialogListener) {
mDialogListener = dialogListener;
return this;
}

+ 340
- 0
app/src/main/java/aicare/net/cn/sdk/ailinksdkdemoandroid/utils/CheckPermissionUtils.java Переглянути файл

@@ -0,0 +1,340 @@
package aicare.net.cn.sdk.ailinksdkdemoandroid.utils;

import android.Manifest;
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.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.view.View;

import java.lang.ref.WeakReference;
import java.util.Map;

import aicare.net.cn.sdk.ailinksdkdemoandroid.dialog.HintDataDialogFragment;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;

/**
* @author xing<br>
* @date 2022/11/24<br>
* 权限工具,用于动态权限检测
*/
public class CheckPermissionUtils {

private PermissionRequestFragment mPermissionRequestFragment;

public CheckPermissionUtils(AppCompatActivity activity) {
mPermissionRequestFragment = new PermissionRequestFragment();
WeakReference<AppCompatActivity> mActivity = new WeakReference<>(activity);;
mPermissionRequestFragment.setActivity(mActivity.get());

}

public void checkPermissions(OnPermissionListener listener) {
try {
if (mPermissionRequestFragment != null) {
mPermissionRequestFragment.setOnPermissionListener(listener);
mPermissionRequestFragment.initPermissions();
}
} catch (Exception e) {
e.printStackTrace();
}
}


public interface OnPermissionListener {
void onPermissionsOk();
}


public static class PermissionRequestFragment extends Fragment {


private OnPermissionListener mOnPermissionListener;
private AppCompatActivity mActivity;
private Context mContext;

/**
* 需要申请的权限
*/
private String[] LOCATION_PERMISSION = new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
private String[] BLUETOOTH_PERMISSION = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_ADVERTISE, Manifest.permission.BLUETOOTH_CONNECT};
private ActivityResultLauncher<String[]> mActivityResultLauncher;
private int mErrNumber;
private FragmentManager mFragmentManager;

public void setOnPermissionListener(OnPermissionListener onPermissionListener) {
mOnPermissionListener = onPermissionListener;
}

private void setActivity(AppCompatActivity activity) {
mActivity = activity;
mContext = activity;
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initPermissions();
}

protected void initPermissions() {
// 创建Fragment
if (!isAdded()) {
if (mActivity != null) {
mFragmentManager = mActivity.getSupportFragmentManager();
mFragmentManager.beginTransaction().add(0, this).commitAllowingStateLoss();
mFragmentManager.executePendingTransactions();
}
return;
}
if (mContext==null||mActivity==null) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (!checkBluetoothPermission()) {
//没有权限,请求开启
requestBluetoothPermission();
} else {
onPermissionsOk();
}
} else {
if (!checkBluetoothPermission()) {
//没有权限,请求开启
requestLocationPermission();
} else {
boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示",0)
.setContent("请求打开定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else {
onPermissionsOk();
}
}
}

}

private boolean checkBluetoothPermission() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
String[] perms;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
perms = BLUETOOTH_PERMISSION;
} else {
perms = LOCATION_PERMISSION;

}
for (String perm : perms) {
if (ContextCompat.checkSelfPermission(mContext, perm) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}

/**
* 申请蓝牙权限
*/
private void requestBluetoothPermission() {

mActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
@Override
public void onActivityResult(Map<String, Boolean> result) {
//权限状态
boolean permissionState = true;
for (String s : BLUETOOTH_PERMISSION) {
if (Boolean.FALSE.equals(result.get(s))) {
permissionState = false;
break;
}
}
if (permissionState) {
//请求的权限都有了
onPermissionsOk();
} else {
//请求的权限有一个或者多个被拒绝
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求蓝牙权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
mErrNumber++;
if (mErrNumber >= 3) {
startUseSetActivity(mContext);
} else {
mActivityResultLauncher.launch(BLUETOOTH_PERMISSION);
}
}
}).show(mActivity.getSupportFragmentManager());
}


}
});
mActivityResultLauncher.launch(BLUETOOTH_PERMISSION);
}


/**
* 申请定位权限
*/
private void requestLocationPermission() {
mActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), result -> {
//权限状态
boolean permissionState = true;
for (String s : LOCATION_PERMISSION) {
if (Boolean.FALSE.equals(result.get(s))) {
permissionState = false;
break;
}
}
if (permissionState) {
//请求的权限都有了
boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求位置权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else {
onPermissionsOk();
}
} else {
//请求的权限有一个或者多个被拒绝
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求定位权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
mErrNumber++;
if (mErrNumber >= 3) {
startUseSetActivity(mContext);
} else {
mActivityResultLauncher.launch(LOCATION_PERMISSION);
}
}
}).show(mActivity.getSupportFragmentManager());
}


});
mActivityResultLauncher.launch(LOCATION_PERMISSION);
}


/**
* 启动去设置定位服务
*/
protected void startLocationActivity() {
Intent localIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
if (mActivity.getPackageManager().resolveActivity(localIntent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
//定位服务页面返回
boolean bleStatus = isLocServiceEnable(mContext);
if (!bleStatus) {
//没有开启定位服务
HintDataDialogFragment.newInstance().setTitle("提示",0).setContent("请求位置权限", true)
.setOnDialogListener(new HintDataDialogFragment.onDialogListener() {
@Override
public void onCancelListener(View v) {

}

@Override
public void onSucceedListener(View v) {
startLocationActivity();
}
}).show(mActivity.getSupportFragmentManager());
} else {
onPermissionsOk();
}
}
}
}).launch(localIntent);
}
}

/**
* 权限ok
*/
private void onPermissionsOk() {
if (!isDetached()&&!isRemoving()) {
mFragmentManager.beginTransaction().detach(this).commit();
}

if (mOnPermissionListener != null) {
mOnPermissionListener.onPermissionsOk();
}
}

}


/**
* 进入应用设置界面
*/
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);
}

/**
* 手机是否开启位置服务
*/
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);
return gps || network;
}

}

+ 2
- 2
app/src/main/res/layout/dialog_hint_data.xml Переглянути файл

@@ -11,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="确定移除家人?"
android:text="提示"
android:padding="10dp"
android:gravity="center"
android:textColor="@android:color/black"
@@ -24,7 +24,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:text="移除后所有数据清空"
android:text=""
android:padding="8dp"
android:gravity="center_vertical"
android:textSize="18dp"

+ 1
- 1
build.gradle Переглянути файл

@@ -7,7 +7,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
classpath 'com.android.tools.build:gradle:4.1.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files

+ 1
- 1
gradle/wrapper/gradle-wrapper.properties Переглянути файл

@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip

Завантаження…
Відмінити
Зберегти