From d65a839878191e51c52744f3e78026eb16dd6a02 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 27 Sep 2025 13:45:00 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=9D=83=E9=99=90=E7=94=B3=E8=AF=B7=E6=AD=A5=E9=AA=A4=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.properties | 4 +- .../winboll/studio/contacts/MainActivity.java | 122 ++++++-- .../contacts/utils/AppGoToSettingsUtil.java | 270 ++++++++++++++++++ 3 files changed, 370 insertions(+), 26 deletions(-) create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/utils/AppGoToSettingsUtil.java diff --git a/contacts/build.properties b/contacts/build.properties index 67d8f382..5a022a94 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun Aug 31 06:05:42 CST 2025 +#Sat Sep 27 07:17:15 GMT 2025 stageCount=17 libraryProject= baseVersion=15.3 publishVersion=15.3.16 -buildCount=0 +buildCount=12 baseBetaVersion=15.3.17 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java index c46df2dc..3f3d2229 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java @@ -8,6 +8,7 @@ package cc.winboll.studio.contacts; import android.Manifest; import android.app.Activity; import android.app.ActivityManager; +import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; @@ -31,6 +32,8 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import androidx.viewpager.widget.ViewPager; +import // 新增:导入 AppGoToSettingsUtil 工具类(确保包路径与项目实际一致) +cc.winboll.studio.contacts.utils.AppGoToSettingsUtil; import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.activities.SettingsActivity; import cc.winboll.studio.contacts.beans.MainServiceBean; @@ -48,10 +51,9 @@ import java.util.List; final public class MainActivity extends AppCompatActivity implements IWinBoLLActivity, ViewPager.OnPageChangeListener, View.OnClickListener { public static final String TAG = "MainActivity"; - public static final int REQUEST_HOME_ACTIVITY = 0; public static final int REQUEST_ABOUT_ACTIVITY = 1; - + public static final int REQUEST_APP_SETTINGS = 2; public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoLL.ACTION_SOS"; static MainActivity _MainActivity; @@ -72,6 +74,13 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct List tabTitleList; private static final int DIALER_REQUEST_CODE = 1; + private static final int REQUEST_REQUIRED_PERMISSIONS = 1002; + // 关键修改1:新增 READ_CALL_LOG 权限到必需权限列表(解决通话记录读取崩溃) + private String[] REQUIRED_PERMISSIONS = new String[]{ + Manifest.permission.READ_CONTACTS, // 通讯录读取(原) + Manifest.permission.CALL_PHONE, // 电话拨号(原) + Manifest.permission.READ_CALL_LOG // 通话记录读取(新增,核心修复) + }; @Override @@ -88,9 +97,86 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); _MainActivity = this; + + // 优先检查所有必需权限(含新增的 READ_CALL_LOG) + if (!checkAllRequiredPermissions()) { + requestAllRequiredPermissions(); + } else { + initUIAndLogic(savedInstanceState); + } + } + + // 权限检查方法(无需修改,自动包含新增的 READ_CALL_LOG) + private boolean checkAllRequiredPermissions() { + for (String permission : REQUIRED_PERMISSIONS) { + if (ActivityCompat.checkSelfPermission(this, permission) + != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + // 权限申请方法(无需修改,自动申请新增的 READ_CALL_LOG) + private void requestAllRequiredPermissions() { + ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_REQUIRED_PERMISSIONS); + } + + // 权限结果回调(无需修改,确保所有权限(含 READ_CALL_LOG)都通过才加载UI) + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + if (requestCode == REQUEST_REQUIRED_PERMISSIONS) { + boolean allPermissionsGranted = true; + for (int result : grantResults) { + if (result != PackageManager.PERMISSION_GRANTED) { + allPermissionsGranted = false; + break; + } + } + + if (allPermissionsGranted) { + initUIAndLogic(null); + } else { + // 关键修改2:更新提示文案,告知用户新增的“通话记录权限” + showPermissionDeniedDialogAndExit(); + } + } + } + + // 核心修改:新增“设置权限”按钮,点击调用 AppGoToSettingsUtil 跳转设置页 + private void showPermissionDeniedDialogAndExit() { + new AlertDialog.Builder(this) + .setTitle("权限不足,无法使用") + // 文案修改:明确新增“通话记录读取”权限 + .setMessage("应用需要「通讯录读取」、「电话」和「通话记录读取」权限才能正常运行,请授予权限后重新打开应用。") + .setCancelable(false) + // 新增:左侧“设置权限”按钮(先添加的按钮在左侧) + .setNegativeButton("设置权限", new AlertDialog.OnClickListener() { + @Override + public void onClick(android.content.DialogInterface dialog, int which) { + dialog.dismiss(); + // 调用工具类跳转应用设置页(按需求实现) + AppGoToSettingsUtil appGoToSettingsUtil = new AppGoToSettingsUtil(); + appGoToSettingsUtil.GoToSetting(MainActivity.this); + } + }) + // 原有:右侧“确定退出”按钮(后添加的按钮在右侧) + .setPositiveButton("确定退出", new AlertDialog.OnClickListener() { + @Override + public void onClick(android.content.DialogInterface dialog, int which) { + dialog.dismiss(); + finishAndRemoveTask(); + } + }) + .show(); + } + + // 初始化UI和逻辑(无需修改,权限通过后才加载 CallLogFragment) + private void initUIAndLogic(Bundle savedInstanceState) { setContentView(R.layout.activity_main); - // 初始化工具栏(仅加载基础UI) mToolbar = (Toolbar) findViewById(R.id.activitymainToolbar1); setSupportActionBar(mToolbar); getSupportActionBar().setSubtitle(TAG); @@ -98,34 +184,28 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct tabLayout = (TabLayout) findViewById(R.id.tabLayout); viewPager = (ViewPager) findViewById(R.id.viewPager); - // 创建Fragment列表(仅实例化,不加载数据) fragmentList = new ArrayList(); tabTitleList = new ArrayList(); + // CallLogFragment 仅在权限通过后才实例化(避免提前触发读取) fragmentList.add(CallLogFragment.newInstance(0)); - fragmentList.add(ContactsFragment.newInstance(1)); // 延迟加载联系人数据 + fragmentList.add(ContactsFragment.newInstance(1)); fragmentList.add(LogFragment.newInstance(2)); tabTitleList.add("通话记录"); tabTitleList.add("联系人"); tabTitleList.add("应用日志"); - // 设置ViewPager适配器 MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList, tabTitleList); viewPager.setAdapter(adapter); - - // 关键:关闭预加载,仅当前页初始化 - viewPager.setOffscreenPageLimit(0); - - // 关联TabLayout和ViewPager + viewPager.setOffscreenPageLimit(0); // 关闭预加载,避免提前初始化 CallLogFragment tabLayout.setupWithViewPager(viewPager); - // 初始化服务状态(延迟启动非核心服务) + // 原有服务启动、电话监听等逻辑... MainServiceBean mMainServiceBean = MainServiceBean.loadBean(this, MainServiceBean.class); if (mMainServiceBean == null) { mMainServiceBean = new MainServiceBean(); MainServiceBean.saveBean(this, mMainServiceBean); } if (mMainServiceBean.isEnable()) { - // 延迟1秒启动服务,避免阻塞启动 new Handler().postDelayed(new Runnable() { @Override public void run() { @@ -134,16 +214,14 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct }, 1000); } - // 初始化电话状态监听(基础功能保留) telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); phoneStateListener = new MyPhoneStateListener(); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); } - // ViewPager适配器(Java 7语法) + // 以下为原有代码(无需修改) private class MyPagerAdapter extends FragmentPagerAdapter { - private List fragmentList; private List tabTitleList; @@ -173,21 +251,18 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(android.net.Uri.parse("tel:" + phoneNumber)); if (ActivityCompat.checkSelfPermission(_MainActivity, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(_MainActivity, "拨号权限不足", Toast.LENGTH_SHORT).show(); return; } _MainActivity.startActivity(intent); } - // OnPageChangeListener接口实现 @Override public void onPageScrollStateChanged(int state) {} - @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} - @Override public void onPageSelected(int position) {} - @Override public void onClick(View v) {} @@ -239,9 +314,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct super.onResume(); } - /** - * 检查是否是系统默认电话应用 - */ public boolean isDefaultPhoneCallApp() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { TelecomManager manger = (TelecomManager) getSystemService(TELECOM_SERVICE); @@ -272,7 +344,9 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct Toast.makeText(MainActivity.this, getString(R.string.app_name) + " 已成为默认电话应用", Toast.LENGTH_SHORT).show(); } - } + } else if (requestCode == REQUEST_APP_SETTINGS) { + recreate(); + } } } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/utils/AppGoToSettingsUtil.java b/contacts/src/main/java/cc/winboll/studio/contacts/utils/AppGoToSettingsUtil.java new file mode 100644 index 00000000..38d8f0c8 --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/utils/AppGoToSettingsUtil.java @@ -0,0 +1,270 @@ +package cc.winboll.studio.contacts.utils; + +/** + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/09/27 14:27 + * @Describe 调用应用属性设置页工具类 + * 来源:https://blog.csdn.net/zhuhai__yizhi/article/details/78737593 + * Created by zyy on 2018/3/12. + * 直接跳转到权限后返回,可以监控权限授权情况,但是,跳转到应用详情页,无法监测权限情况 + * 是否要加以区分,若是应用详情页,则跳转回来后,onRestart检测所求权限,如果授权,则收回提示,如果没授权,则继续提示 + */ +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +import cc.winboll.studio.contacts.MainActivity; + +public class AppGoToSettingsUtil { + + public static final String TAG = "AppGoToSettingsUtil"; + + public static final int ACTIVITY_RESULT_APP_SETTINGS = MainActivity.REQUEST_APP_SETTINGS; + + /** + * Build.MANUFACTURER判断各大手机厂商品牌 + */ + private static final String MANUFACTURER_HUAWEI = "Huawei";//华为 + private static final String MANUFACTURER_MEIZU = "Meizu";//魅族 + private static final String MANUFACTURER_XIAOMI = "Xiaomi";//小米 + private static final String MANUFACTURER_SONY = "Sony";//索尼 + private static final String MANUFACTURER_OPPO = "OPPO"; + private static final String MANUFACTURER_LG = "LG"; + private static final String MANUFACTURER_VIVO = "vivo"; + private static final String MANUFACTURER_SAMSUNG = "samsung";//三星 + private static final String MANUFACTURER_LETV = "Letv";//乐视 + private static final String MANUFACTURER_ZTE = "ZTE";//中兴 + private static final String MANUFACTURER_YULONG = "YuLong";//酷派 + private static final String MANUFACTURER_LENOVO = "LENOVO";//联想 + + public static boolean isAppSettingOpen=false; + /** + * 跳转到相应品牌手机系统权限设置页,如果跳转不成功,则跳转到应用详情页 + * 这里需要改造成返回true或者false,应用详情页:true,应用权限页:false + * @param activity + */ + public static void GoToSetting(Activity activity) { + switch (Build.MANUFACTURER) { + case MANUFACTURER_HUAWEI://华为 + Huawei(activity); + break; + case MANUFACTURER_MEIZU://魅族 + Meizu(activity); + break; + case MANUFACTURER_XIAOMI://小米 + Xiaomi(activity); + break; + case MANUFACTURER_SONY://索尼 + Sony(activity); + break; + case MANUFACTURER_OPPO://oppo + OPPO(activity); + break; + case MANUFACTURER_LG://lg + LG(activity); + break; + case MANUFACTURER_LETV://乐视 + Letv(activity); + break; + default://其他 + try {//防止应用详情页也找不到,捕获异常后跳转到设置,这里跳转最好是两级,太多用户也会觉得麻烦,还不如不跳 + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } catch (Exception e) { + SystemConfig(activity); + } + break; + } + } + + /** + * 华为跳转权限设置页 + * @param activity + */ + public static void Huawei(Activity activity) { + try { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("packageName", activity.getPackageName()); + ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity"); + intent.setComponent(comp); + activity.startActivityForResult(intent, ACTIVITY_RESULT_APP_SETTINGS); + isAppSettingOpen = false; + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + + /** + * 魅族跳转权限设置页,测试时,点击无反应,具体原因不明 + * @param activity + */ + public static void Meizu(Activity activity) { + try { + Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC"); + intent.addCategory(Intent.CATEGORY_DEFAULT); + intent.putExtra("packageName", activity.getPackageName()); + activity.startActivity(intent); + isAppSettingOpen = false; + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + + /** + * 小米,功能正常 + * @param activity + */ + public static void Xiaomi(Activity activity) { + try { //MIUI 8 9 + Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR"); + localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity"); + localIntent.putExtra("extra_pkgname", activity.getPackageName()); + activity.startActivityForResult(localIntent, ACTIVITY_RESULT_APP_SETTINGS); + isAppSettingOpen = false; + //activity.startActivity(localIntent); + } catch (Exception e) { + try { //MIUI 5/6/7 + Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR"); + localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity"); + localIntent.putExtra("extra_pkgname", activity.getPackageName()); + activity.startActivityForResult(localIntent, ACTIVITY_RESULT_APP_SETTINGS); + isAppSettingOpen = false; + //activity.startActivity(localIntent); + } catch (Exception e1) { //否则跳转到应用详情 + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + //这里有个问题,进入活动后需要再跳一级活动,就检测不到返回结果 + //activity.startActivity(getAppDetailSettingIntent()); + } + } + } + + /** + * 索尼,6.0以上的手机非常少,基本没看见 + * @param activity + */ + public static void Sony(Activity activity) { + try { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("packageName", activity.getPackageName()); + ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity"); + intent.setComponent(comp); + activity.startActivity(intent); + isAppSettingOpen = false; + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + + /** + * OPPO + * @param activity + */ + public static void OPPO(Activity activity) { + try { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("packageName", activity.getPackageName()); + ComponentName comp = new ComponentName("com.color.safecenter", "com.color.safecenter.permission.PermissionManagerActivity"); + intent.setComponent(comp); + activity.startActivity(intent); + isAppSettingOpen = false; + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + + /** + * LG经过测试,正常使用 + * @param activity + */ + public static void LG(Activity activity) { + try { + Intent intent = new Intent("android.intent.action.MAIN"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("packageName", activity.getPackageName()); + ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity"); + intent.setComponent(comp); + activity.startActivity(intent); + isAppSettingOpen = false; + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + + /** + * 乐视6.0以上很少,基本都可以忽略了,现在乐视手机不多 + * @param activity + */ + public static void Letv(Activity activity) { + try { + Intent intent = new Intent(); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("packageName", activity.getPackageName()); + ComponentName comp = new ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.PermissionAndApps"); + intent.setComponent(comp); + activity.startActivity(intent); + isAppSettingOpen = false; + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + + /** + * 只能打开到自带安全软件 + * @param activity + */ + public static void _360(Activity activity) { + try { + Intent intent = new Intent("android.intent.action.MAIN"); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.putExtra("packageName", activity.getPackageName()); + ComponentName comp = new ComponentName("com.qihoo360.mobilesafe", "com.qihoo360.mobilesafe.ui.index.AppEnterActivity"); + intent.setComponent(comp); + activity.startActivity(intent); + } catch (Exception e) { + openAppDetailSetting(activity); + //activity.startActivityForResult(getAppDetailSettingIntent(activity), PERMISSION_SETTING_FOR_RESULT); + } + } + /** + * 系统设置界面 + * @param activity + */ + public static void SystemConfig(Activity activity) { + Intent intent = new Intent(Settings.ACTION_SETTINGS); + activity.startActivity(intent); + } + /** + * 获取应用详情页面 + * @return + */ + private static Intent getAppDetailSettingIntent(Activity activity) { + Intent localIntent = new Intent(); + localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //if (Build.VERSION.SDK_INT >= 9) { + localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); + localIntent.setData(Uri.fromParts("package", activity.getPackageName(), null)); + /*} else if (Build.VERSION.SDK_INT <= 8) { + localIntent.setAction(Intent.ACTION_VIEW); + localIntent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); + localIntent.putExtra("com.android.settings.ApplicationPkgName", activity.getPackageName()); + }*/ + return localIntent; + } + + public static void openAppDetailSetting(Activity activity) { + activity.startActivityForResult(getAppDetailSettingIntent(activity), ACTIVITY_RESULT_APP_SETTINGS); + isAppSettingOpen = true; + } +} From eb8d37c340bbb2d31dd4b895ebff21a0bfe44b0c Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 27 Sep 2025 15:23:51 +0800 Subject: [PATCH 02/11] APK 15.3.17 release Publish. --- contacts/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index 5a022a94..fc971ce7 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Sep 27 07:17:15 GMT 2025 -stageCount=17 +#Sat Sep 27 15:23:51 HKT 2025 +stageCount=18 libraryProject= baseVersion=15.3 -publishVersion=15.3.16 -buildCount=12 -baseBetaVersion=15.3.17 +publishVersion=15.3.17 +buildCount=0 +baseBetaVersion=15.3.18 From 46ede050e126dd3accc99c563981029cc8dcdb34 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 12:43:40 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E7=BC=96=E8=BE=91=E8=B7=B3=E8=BD=AC=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 6 +- contacts/build.properties | 4 +- .../contacts/adapters/CallLogAdapter.java | 3 + .../contacts/adapters/ContactAdapter.java | 6 +- .../contacts/fragments/CallLogFragment.java | 3 +- .../studio/contacts/utils/ContactUtils.java | 96 +++++++++++++++++++ .../res/menu/toolbar_calllog_phonenumber.xml | 3 + .../res/menu/toolbar_contact_phonenumber.xml | 3 + 8 files changed, 116 insertions(+), 8 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index f30c00a5..eecf57de 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -18,13 +18,13 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 32 - buildToolsVersion "32.0.0" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { applicationId "cc.winboll.studio.contacts" minSdkVersion 24 - targetSdkVersion 30 + targetSdkVersion 28 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 diff --git a/contacts/build.properties b/contacts/build.properties index fc971ce7..a5e68d31 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Sep 27 15:23:51 HKT 2025 +#Sat Oct 18 04:38:02 GMT 2025 stageCount=18 libraryProject= baseVersion=15.3 publishVersion=15.3.17 -buildCount=0 +buildCount=6 baseBetaVersion=15.3.18 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java index 58444bb0..13edc1e6 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java @@ -76,6 +76,9 @@ public class CallLogAdapter extends RecyclerView.Adapter { @@ -69,6 +70,9 @@ public class ContactAdapter extends RecyclerView.Adapter 0) { + // 构建联系人的Uri(格式:content://contacts/people/[contactId],系统标准格式) + Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); + intent.setData(contactUri); + } + // 场景B:未知ID,通过电话号码匹配(需系统支持号码匹配,小米机型兼容) + else if (phoneNumber != null && !phoneNumber.isEmpty()) { + // 方式1:小米等机型兼容的“通过号码定位联系人”参数(部分系统认此参数) + //intent.putExtra(ContactsContract.Intents.Insert.PHONE_NUMBER, phoneNumber); + // 方式2:补充系统标准的“数据Uri”,强化匹配(避免参数被定制系统忽略) + Uri phoneUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); + intent.setData(phoneUri); + } else { + LogUtils.d(TAG, "编辑联系人失败:电话号码和联系人ID均为空"); + return; + } + + // 可选:预填最新号码(覆盖原有号码,若用户修改了号码,编辑时自动更新) + if (phoneNumber != null && !phoneNumber.isEmpty()) { + intent.putExtra(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber); + intent.putExtra(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); + } + + // 启动活动(加防护,避免无联系人应用崩溃) + if (intent.resolveActivity(context.getPackageManager()) != null) { + // 小米机型在Service/非Activity中调用,需加NEW_TASK标志,否则可能无法启动 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } else { + LogUtils.d(TAG, "编辑联系人失败:设备未安装联系人应用"); + } + } + + /** + * 通过电话号码查询联系人ID(适配小米机型,解决编辑时匹配不稳定问题) + * @param context 上下文 + * @param phoneNumber 待查询的电话号码 + * @return 联系人ID(无匹配时返回-1) + */ + public static Long getContactIdByPhone(Context context, String phoneNumber) { + if (phoneNumber == null || phoneNumber.isEmpty()) { + return -1L; + } + + ContentResolver cr = context.getContentResolver(); + // 1. 构建电话查询Uri(系统标准:通过号码过滤联系人数据) + Uri queryUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); + // 2. 只查询“联系人ID”字段(高效,避免冗余数据) + String[] projection = {ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; + Cursor cursor = null; + + try { + cursor = cr.query(queryUri, projection, null, null, null); + if (cursor != null && cursor.moveToFirst()) { + // 3. 读取联系人ID(返回Long类型,避免int溢出) + return cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); + } + } catch (Exception e) { + LogUtils.d(TAG, "查询联系人ID失败。" + e); + } finally { + if (cursor != null) { + cursor.close(); // 关闭游标,避免内存泄漏 + } + } + return -1L; // 无匹配联系人 + } + } diff --git a/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml b/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml index 1160161f..429c45f1 100644 --- a/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml +++ b/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml @@ -5,5 +5,8 @@ + diff --git a/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml b/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml index b646763a..3e4a9e93 100644 --- a/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml +++ b/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml @@ -5,5 +5,8 @@ + From 9511b594aa3d7155ef3086406be6956ad26ba241 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 12:57:07 +0800 Subject: [PATCH 04/11] APK 15.3.18 release Publish. --- contacts/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index a5e68d31..e679e4f4 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Oct 18 04:38:02 GMT 2025 -stageCount=18 +#Sat Oct 18 12:57:07 HKT 2025 +stageCount=19 libraryProject= baseVersion=15.3 -publishVersion=15.3.17 -buildCount=6 -baseBetaVersion=15.3.18 +publishVersion=15.3.18 +buildCount=0 +baseBetaVersion=15.3.19 From da7329ffb39bad5aebd39e7c0c25ff54e42d4a86 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 13:04:07 +0800 Subject: [PATCH 05/11] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E9=80=82=E9=85=8DAPI=2030?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index eecf57de..1b7291c7 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -18,13 +18,13 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { applicationId "cc.winboll.studio.contacts" minSdkVersion 24 - targetSdkVersion 28 + targetSdkVersion 30 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 From b144d6d94c887e5cbb1fd0e1792565fef7ed7b6a Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 13:05:19 +0800 Subject: [PATCH 06/11] APK 15.3.19 release Publish. --- contacts/build.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index e679e4f4..27ee5f1a 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Oct 18 12:57:07 HKT 2025 -stageCount=19 +#Sat Oct 18 13:05:19 HKT 2025 +stageCount=20 libraryProject= baseVersion=15.3 -publishVersion=15.3.18 +publishVersion=15.3.19 buildCount=0 -baseBetaVersion=15.3.19 +baseBetaVersion=15.3.20 From 72cbe4f0664f8d9ebe99636f988b2cd19e58438d Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 13:14:14 +0800 Subject: [PATCH 07/11] =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E5=90=90=E5=8F=B8?= =?UTF-8?q?=E7=B1=BB=E5=BC=95=E7=94=A8=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 2 +- contacts/build.properties | 4 ++-- contacts/src/main/java/cc/winboll/studio/contacts/App.java | 4 ++-- .../studio/contacts/activities/SettingsActivity.java | 2 +- .../winboll/studio/contacts/adapters/CallLogAdapter.java | 2 +- .../winboll/studio/contacts/adapters/ContactAdapter.java | 7 ++++--- .../studio/contacts/adapters/PhoneConnectRuleAdapter.java | 4 +--- .../java/cc/winboll/studio/contacts/bobulltoon/TomCat.java | 2 +- .../studio/contacts/fragments/ContactsFragment.java | 2 +- .../cc/winboll/studio/contacts/fragments/LogFragment.java | 1 - .../cc/winboll/studio/contacts/receivers/MainReceiver.java | 2 +- .../winboll/studio/contacts/widgets/APPStatusWidget.java | 3 +-- 12 files changed, 16 insertions(+), 19 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index 1b7291c7..9278e0ee 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -66,7 +66,7 @@ dependencies { // 应用介绍页类库 api 'io.github.medyo:android-about-page:2.0.0' // 吐司类库 - api 'com.github.getActivity:ToastUtils:10.5' + //api 'com.github.getActivity:ToastUtils:10.5' // 网络连接类库 api 'com.squareup.okhttp3:okhttp:4.4.1' diff --git a/contacts/build.properties b/contacts/build.properties index e679e4f4..97246ad4 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Oct 18 12:57:07 HKT 2025 +#Sat Oct 18 05:13:11 GMT 2025 stageCount=19 libraryProject= baseVersion=15.3 publishVersion=15.3.18 -buildCount=0 +buildCount=3 baseBetaVersion=15.3.19 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/App.java b/contacts/src/main/java/cc/winboll/studio/contacts/App.java index 9c255ae8..2bd4287d 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/App.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/App.java @@ -7,8 +7,8 @@ package cc.winboll.studio.contacts; */ import android.view.Gravity; import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager; -import com.hjq.toast.ToastUtils; public class App extends GlobalApplication { @@ -30,7 +30,7 @@ public class App extends GlobalApplication { // 设置 Toast 布局样式 //ToastUtils.setView(R.layout.toast_custom_view); //ToastUtils.setStyle(new WhiteToastStyle()); - ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); + //ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java index 0e8e1bc0..9639f61a 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java @@ -36,8 +36,8 @@ import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.views.DuInfoTextView; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; -import com.hjq.toast.ToastUtils; import java.lang.reflect.Field; import java.util.List; diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java index 13edc1e6..1f282638 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java @@ -23,7 +23,7 @@ import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.beans.CallLogModel; import cc.winboll.studio.contacts.utils.ContactUtils; import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; -import com.hjq.toast.ToastUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; import java.text.SimpleDateFormat; import java.util.List; import java.util.Locale; diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java index a0230c40..f6866156 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java @@ -21,10 +21,10 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.beans.ContactModel; -import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; -import com.hjq.toast.ToastUtils; -import java.util.List; import cc.winboll.studio.contacts.utils.ContactUtils; +import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; +import cc.winboll.studio.libappbase.utils.ToastUtils; +import java.util.List; public class ContactAdapter extends RecyclerView.Adapter { @@ -71,6 +71,7 @@ public class ContactAdapter extends RecyclerView.Adapter Date: Sat, 18 Oct 2025 13:40:15 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E7=BC=96=E8=BE=91=E7=95=8C=E9=9D=A2=E6=9C=AA=E5=BC=B9?= =?UTF-8?q?=E5=87=BA=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.properties | 4 ++-- .../contacts/adapters/ContactAdapter.java | 1 + .../contacts/fragments/ContactsFragment.java | 2 +- .../studio/contacts/utils/ContactUtils.java | 22 ++++++++----------- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index 97246ad4..dbf29894 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Oct 18 05:13:11 GMT 2025 +#Sat Oct 18 05:39:08 GMT 2025 stageCount=19 libraryProject= baseVersion=15.3 publishVersion=15.3.18 -buildCount=3 +buildCount=15 baseBetaVersion=15.3.19 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java index f6866156..cbc0f875 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/ContactAdapter.java @@ -73,6 +73,7 @@ public class ContactAdapter extends RecyclerView.Adapter(); - contactAdapter = new ContactAdapter(getContext(), contactList); + contactAdapter = new ContactAdapter(getActivity(), contactList); recyclerView.setAdapter(contactAdapter); // 初始隐藏列表,数据加载后显示 recyclerView.setVisibility(View.GONE); diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/utils/ContactUtils.java b/contacts/src/main/java/cc/winboll/studio/contacts/utils/ContactUtils.java index 5107a3b0..7b04c439 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/utils/ContactUtils.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/utils/ContactUtils.java @@ -13,6 +13,7 @@ import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; import java.util.HashMap; import java.util.Map; @@ -136,7 +137,7 @@ public class ContactUtils { intent.putExtra(android.provider.ContactsContract.Intents.Insert.PHONE, phoneNumber); mContext.startActivity(intent); } - + /** * 跳转至系统编辑联系人界面(适配小米等定制机型) * @param context 上下文(Activity/Service/Fragment) @@ -153,9 +154,8 @@ public class ContactUtils { // 构建联系人的Uri(格式:content://contacts/people/[contactId],系统标准格式) Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); intent.setData(contactUri); - } - // 场景B:未知ID,通过电话号码匹配(需系统支持号码匹配,小米机型兼容) - else if (phoneNumber != null && !phoneNumber.isEmpty()) { + //ToastUtils.show("1"); + } else if (phoneNumber != null && !phoneNumber.isEmpty()) { // 方式1:小米等机型兼容的“通过号码定位联系人”参数(部分系统认此参数) //intent.putExtra(ContactsContract.Intents.Insert.PHONE_NUMBER, phoneNumber); // 方式2:补充系统标准的“数据Uri”,强化匹配(避免参数被定制系统忽略) @@ -173,15 +173,11 @@ public class ContactUtils { } // 启动活动(加防护,避免无联系人应用崩溃) - if (intent.resolveActivity(context.getPackageManager()) != null) { - // 小米机型在Service/非Activity中调用,需加NEW_TASK标志,否则可能无法启动 - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); - } else { - LogUtils.d(TAG, "编辑联系人失败:设备未安装联系人应用"); - } + // 小米机型在Service/非Activity中调用,需加NEW_TASK标志,否则可能无法启动 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); } - + /** * 通过电话号码查询联系人ID(适配小米机型,解决编辑时匹配不稳定问题) * @param context 上下文 @@ -215,5 +211,5 @@ public class ContactUtils { } return -1L; // 无匹配联系人 } - + } From 7e061d18bb5c36b8bcf0fbb46bbe55e0bef9eb3d Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 13:43:14 +0800 Subject: [PATCH 09/11] APK 15.3.20 release Publish. --- contacts/build.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index 27ee5f1a..4c19f689 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Oct 18 13:05:19 HKT 2025 -stageCount=20 +#Sat Oct 18 13:43:14 HKT 2025 +stageCount=21 libraryProject= baseVersion=15.3 -publishVersion=15.3.19 +publishVersion=15.3.20 buildCount=0 -baseBetaVersion=15.3.20 +baseBetaVersion=15.3.21 From 1d0a9e468bbe4ac5f009d1e67e342b7ebd494bc8 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 3 Nov 2025 11:59:43 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=8B=E8=BD=BDBoBul?= =?UTF-8?q?lToon=E6=95=B0=E6=8D=AE=E6=97=B6=E4=BD=BF=E7=94=A8=E5=90=90?= =?UTF-8?q?=E5=8F=B8=E6=8F=90=E7=A4=BA=E4=BC=9A=E5=87=BA=E7=8E=B0=E5=BC=82?= =?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.properties | 4 ++-- .../main/java/cc/winboll/studio/contacts/MainActivity.java | 6 ++++-- .../studio/contacts/activities/SettingsActivity.java | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index 4c19f689..b07a75bf 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Oct 18 13:43:14 HKT 2025 +#Mon Nov 03 03:55:54 GMT 2025 stageCount=21 libraryProject= baseVersion=15.3 publishVersion=15.3.20 -buildCount=0 +buildCount=6 baseBetaVersion=15.3.21 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java index 3f3d2229..433eaed0 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/MainActivity.java @@ -32,8 +32,6 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import androidx.viewpager.widget.ViewPager; -import // 新增:导入 AppGoToSettingsUtil 工具类(确保包路径与项目实际一致) -cc.winboll.studio.contacts.utils.AppGoToSettingsUtil; import cc.winboll.studio.contacts.R; import cc.winboll.studio.contacts.activities.SettingsActivity; import cc.winboll.studio.contacts.beans.MainServiceBean; @@ -41,8 +39,10 @@ import cc.winboll.studio.contacts.fragments.CallLogFragment; import cc.winboll.studio.contacts.fragments.ContactsFragment; import cc.winboll.studio.contacts.fragments.LogFragment; import cc.winboll.studio.contacts.services.MainService; +import cc.winboll.studio.contacts.utils.AppGoToSettingsUtil; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogView; +import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; import com.google.android.material.tabs.TabLayout; import java.util.ArrayList; @@ -104,6 +104,8 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct } else { initUIAndLogic(savedInstanceState); } + + //ToastUtils.show("onCreate"); } // 权限检查方法(无需修改,自动包含新增的 READ_CALL_LOG) diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java index 9639f61a..56f813aa 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/activities/SettingsActivity.java @@ -263,7 +263,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv @Override public void run() { if (tomCat.downloadBoBullToon()) { - ToastUtils.show("BoBullToon downlaod OK!"); + LogUtils.d(TAG, "BoBullToon downlaod OK!"); MainService.restartMainService(SettingsActivity.this); Rules.getInstance(SettingsActivity.this).reload(); } From 74240104b978883566c747dfb365dfa68b616bf2 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 3 Nov 2025 12:01:02 +0800 Subject: [PATCH 11/11] APK 15.3.21 release Publish. --- contacts/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contacts/build.properties b/contacts/build.properties index b07a75bf..3a77541f 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Nov 03 03:55:54 GMT 2025 -stageCount=21 +#Mon Nov 03 12:01:02 HKT 2025 +stageCount=22 libraryProject= baseVersion=15.3 -publishVersion=15.3.20 -buildCount=6 -baseBetaVersion=15.3.21 +publishVersion=15.3.21 +buildCount=0 +baseBetaVersion=15.3.22