fix(MainActivity): 优化定位权限校验逻辑与空转状态UI刷新
1. 服务开关开启前增加定位权限前置校验,无权限时阻止开启并提示 2. 空转关闭时自动检测权限,无权限则强制停止GPS服务 3. 权限被拒绝时强制关闭服务开关并禁用管理按钮 4. 新增Toolbar副标题显示空转运行状态提示 5. 新增管理按钮状态刷新,空转中强制可点击并追加提示文字 6. 移除冗余注释,精简接口定义
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Sun May 03 05:39:16 GMT 2026
|
||||
#Sun May 03 15:20:10 CST 2026
|
||||
stageCount=20
|
||||
libraryProject=
|
||||
baseVersion=15.12
|
||||
publishVersion=15.12.19
|
||||
buildCount=7
|
||||
buildCount=11
|
||||
baseBetaVersion=15.12.20
|
||||
|
||||
@@ -46,7 +46,7 @@ import cc.winboll.studio.positions.R;
|
||||
* 4. 全局权限申请与权限结果回调处理
|
||||
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
||||
* @CreateTime 2026/05/03 12:23:00
|
||||
* @EditTime 2026/05/03 15:26:13
|
||||
* @EditTime 2026/05/03 15:42:15
|
||||
*/
|
||||
public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
|
||||
@@ -71,16 +71,7 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
* 应用空转状态回调内部接口
|
||||
*/
|
||||
public interface OnAppIdleRunningListener {
|
||||
/**
|
||||
* 接收空转开关状态变更
|
||||
* @param isRunning 空转是否开启
|
||||
*/
|
||||
void onIdleStatusChange(boolean isRunning);
|
||||
|
||||
/**
|
||||
* 接收空转日志消息
|
||||
* @param log 日志文本
|
||||
*/
|
||||
void onIdleLogReceive(String log);
|
||||
}
|
||||
|
||||
@@ -112,7 +103,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
|
||||
mADsBannerView = findViewById(R.id.adsbanner);
|
||||
initAppIdleHandler();
|
||||
// 初始化自动根据空转状态刷新日志面板
|
||||
refreshIdleLogLayout();
|
||||
}
|
||||
|
||||
@@ -136,9 +126,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
}
|
||||
|
||||
// ===================== 初始化相关方法 =====================
|
||||
/**
|
||||
* 初始化顶部导航栏
|
||||
*/
|
||||
private void initToolbar() {
|
||||
mToolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||
setSupportActionBar(mToolbar);
|
||||
@@ -148,9 +135,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
LogUtils.d(TAG, "initToolbar -> 顶部工具栏初始化完毕");
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化全部UI控件与绑定事件
|
||||
*/
|
||||
private void initViews() {
|
||||
mTvIdleLog = (TextView) findViewById(R.id.tv_idle_log);
|
||||
mScrollIdleLog = (ScrollView) findViewById(R.id.scroll_idle_log);
|
||||
@@ -164,31 +148,31 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
mServiceSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
//切换开关时先校验权限,无权限直接强制关闭开关
|
||||
if(isChecked && !checkLocationPermissions()){
|
||||
mServiceSwitch.setChecked(false);
|
||||
Toast.makeText(MainActivity.this,"未获取定位权限,无法开启GPS服务",Toast.LENGTH_SHORT).show();
|
||||
return;
|
||||
}
|
||||
|
||||
LogUtils.d(TAG, "onCheckedChanged -> 服务开关状态变更,isChecked = " + isChecked);
|
||||
if (isChecked && !checkLocationPermissions()) {
|
||||
requestLocationPermissions();
|
||||
return;
|
||||
}
|
||||
if (isChecked) {
|
||||
ServiceUtil.startAutoService(MainActivity.this);
|
||||
} else {
|
||||
ServiceUtil.stopAutoService(MainActivity.this);
|
||||
}
|
||||
mManagePositionsButton.setEnabled(isChecked);
|
||||
refreshManageButtonState();
|
||||
}
|
||||
});
|
||||
LogUtils.i(TAG, "initViews -> 全部UI控件初始化绑定完成");
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化空转处理器并绑定监听回调
|
||||
*/
|
||||
private void initAppIdleHandler() {
|
||||
AppIdleRunningModeHandler.init(MainActivity.this);
|
||||
setOnAppIdleRunningListener(new OnAppIdleRunningListener() {
|
||||
@Override
|
||||
public void onIdleStatusChange(boolean isRunning) {
|
||||
// 状态变更立刻刷新边框与日志
|
||||
refreshIdleLogLayout();
|
||||
appendIdleLog("IdleRunning Status : " + isRunning);
|
||||
}
|
||||
@@ -201,9 +185,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
LogUtils.i(TAG, "initAppIdleHandler -> 空转处理器初始化与监听绑定完成");
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置主布局主题背景色
|
||||
*/
|
||||
private void setLLMainBackgroundColor() {
|
||||
TypedArray typedArray = getTheme().obtainStyledAttributes(new int[]{android.R.attr.colorAccent});
|
||||
int colorAccent = typedArray.getColor(0, Color.GRAY);
|
||||
@@ -213,10 +194,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
}
|
||||
|
||||
// ===================== 空转日志输出工具 =====================
|
||||
/**
|
||||
* 追加空转日志并自动滚动至底部
|
||||
* @param logText 需要追加的日志文本
|
||||
*/
|
||||
private void appendIdleLog(final String logText) {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
@@ -233,11 +210,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 日志面板样式自动控制
|
||||
* 非空转 = 清空日志 + 去除边框
|
||||
* 空转开启 = 恢复边框
|
||||
*/
|
||||
private void refreshIdleLogLayout() {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
@@ -245,19 +217,52 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
if (App.isAppIdleRunning()) {
|
||||
mScrollIdleLog.setBackgroundResource(R.drawable.shape_log_border);
|
||||
} else {
|
||||
//关闭空转时:检测权限,无权限强制关闭GPS开关
|
||||
if(!checkLocationPermissions()){
|
||||
mServiceSwitch.setChecked(false);
|
||||
ServiceUtil.stopAutoService(MainActivity.this);
|
||||
}
|
||||
mTvIdleLog.setText("");
|
||||
mScrollIdleLog.setBackgroundColor(Color.TRANSPARENT);
|
||||
LogUtils.d(TAG, "refreshIdleLogLayout -> 非空转状态:日志清空、边框已移除");
|
||||
}
|
||||
refreshToolbarSubTitle();
|
||||
refreshManageButtonState();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void refreshToolbarSubTitle() {
|
||||
if(getSupportActionBar() == null){
|
||||
return;
|
||||
}
|
||||
if(App.isAppIdleRunning()){
|
||||
getSupportActionBar().setSubtitle("当前处于空转运行状态");
|
||||
}else{
|
||||
getSupportActionBar().setSubtitle("");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 空转状态专属:按钮强制可点击 + 文字追加提示
|
||||
*/
|
||||
private void refreshManageButtonState() {
|
||||
runOnUiThread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (App.isAppIdleRunning()) {
|
||||
mManagePositionsButton.setText("位置与任务管理【当前空转中】");
|
||||
mManagePositionsButton.setEnabled(true);
|
||||
} else {
|
||||
mManagePositionsButton.setText("位置与任务管理");
|
||||
boolean serviceEnable = AppConfigsUtil.getInstance(MainActivity.this).isEnableMainService(true);
|
||||
mManagePositionsButton.setEnabled(serviceEnable);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ===================== 权限处理相关 =====================
|
||||
/**
|
||||
* 检查前台+后台定位权限
|
||||
* @return 权限是否全部通过
|
||||
*/
|
||||
private boolean checkLocationPermissions() {
|
||||
int foregroundPerm = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
|
||||
boolean hasForegroundPerm = (foregroundPerm == PackageManager.PERMISSION_GRANTED);
|
||||
@@ -270,9 +275,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
return hasForegroundPerm && hasBackgroundPerm;
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起定位权限动态申请
|
||||
*/
|
||||
private void requestLocationPermissions() {
|
||||
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
|
||||
!= PackageManager.PERMISSION_GRANTED) {
|
||||
@@ -301,6 +303,10 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
requestLocationPermissions();
|
||||
} else {
|
||||
Toast.makeText(this, "需要前台定位权限才能使用该功能", Toast.LENGTH_SHORT).show();
|
||||
//权限被拒绝,强制关闭开关
|
||||
mServiceSwitch.setChecked(false);
|
||||
ServiceUtil.stopAutoService(MainActivity.this);
|
||||
mManagePositionsButton.setEnabled(false);
|
||||
}
|
||||
} else if (requestCode == REQUEST_BACKGROUND_LOCATION_PERMISSION) {
|
||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
@@ -332,14 +338,12 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
} else if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
||||
LogUtils.d(TAG, "onOptionsItemSelected -> 进入开发工具菜单");
|
||||
} else if (menuItemId == R.id.item_idle_switch) {
|
||||
// 菜单切换应用空转状态
|
||||
boolean idleNow = App.isAppIdleRunning();
|
||||
boolean idleNew = !idleNow;
|
||||
App.setAppIdleRunning(idleNew);
|
||||
AppIdleRunningModeHandler.sendIdleSwitch(idleNew);
|
||||
AppIdleRunningModeHandler.sendIdleLog("菜单手动切换空转状态:" + idleNew);
|
||||
LogUtils.d(TAG, "onOptionsItemSelected -> 空转状态已切换,当前:" + idleNew);
|
||||
// 切换立刻刷新UI样式
|
||||
refreshIdleLogLayout();
|
||||
} else if (menuItemId == R.id.item_settings) {
|
||||
Intent intent = new Intent();
|
||||
@@ -355,9 +359,6 @@ public class MainActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 跳转位置管理页面
|
||||
*/
|
||||
public void onPositions(View view) {
|
||||
LogUtils.d(TAG, "onPositions -> 跳转位置任务管理页面");
|
||||
startActivity(new Intent(MainActivity.this, LocationActivity.class));
|
||||
|
||||
Reference in New Issue
Block a user