From b9f740c386bf424be57e545e84629c61e5848322 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Wed, 26 Feb 2025 03:40:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=B3=BB=E7=BB=9F=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=9D=99=E9=9F=B3=E6=97=B6=E7=9A=84=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=9B=BA=E5=AE=9A=E7=9A=84=E5=BA=94=E7=94=A8=E9=93=83=E5=A3=B0?= =?UTF-8?q?=E9=9F=B3=E9=87=8F=E8=AE=BE=E7=BD=AE=E3=80=82=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E5=BA=94=E7=94=A8=E8=AE=BE=E7=BD=AE=E7=9A=84?= =?UTF-8?q?=E9=93=83=E5=A3=B0=E9=9F=B3=E9=87=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 8 +-- contacts/build.properties | 4 +- .../contacts/activities/SettingsActivity.java | 53 +++++++++++++++++ .../studio/contacts/beans/RingTongBean.java | 28 ++++----- .../phonecallui/PhoneCallService.java | 59 +++++++++++++++---- .../contacts/receivers/MainReceiver.java | 8 +-- .../src/main/res/layout/activity_settings.xml | 26 ++++++++ 7 files changed, 150 insertions(+), 36 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index 552a42a..7bf188e 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -18,13 +18,13 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 32 - buildToolsVersion "33.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { applicationId "cc.winboll.studio.contacts" - minSdkVersion 21 - targetSdkVersion 30 + minSdkVersion 26 + targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 diff --git a/contacts/build.properties b/contacts/build.properties index 86e2b57..61d13e3 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 25 00:17:29 HKT 2025 +#Tue Feb 25 19:32:36 GMT 2025 stageCount=2 libraryProject= baseVersion=1.0 publishVersion=1.0.1 -buildCount=0 +buildCount=34 baseBetaVersion=1.0.2 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 bc54d95..bad98bc 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 @@ -26,6 +26,8 @@ import cc.winboll.studio.libappbase.IWinBollActivity; import cc.winboll.studio.libappbase.bean.APPInfo; import com.hjq.toast.ToastUtils; import java.lang.reflect.Field; +import android.widget.SeekBar; +import android.widget.TextView; public class SettingsActivity extends AppCompatActivity implements IWinBollActivity { @@ -33,6 +35,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv Toolbar mToolbar; Switch swSilent; + SeekBar msbVolume; + TextView mtvVolume; + int mnStreamMaxVolume; + int mnStreamVolume; + @Override public APPInfo getAppInfo() { @@ -77,6 +84,52 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv getSupportActionBar().setDisplayHomeAsUpEnabled(true); } getSupportActionBar().setSubtitle(getTag()); + + msbVolume = findViewById(R.id.bellvolume); + mtvVolume = findViewById(R.id.tv_volume); + final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); + + // 设置SeekBar的最大值为系统铃声音量的最大刻度 + mnStreamMaxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING); + msbVolume.setMax(mnStreamMaxVolume); + // 获取当前铃声音量并设置为SeekBar的初始进度 + mnStreamVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); + msbVolume.setProgress(mnStreamVolume); + + updateStreamVolumeTextView(); + + msbVolume.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + // 设置铃声音量 + audioManager.setStreamVolume(AudioManager.STREAM_RING, progress, 0); + RingTongBean bean = RingTongBean.loadBean(SettingsActivity.this, RingTongBean.class); + if (bean == null) { + bean = new RingTongBean(); + } + bean.setStreamVolume(progress); + RingTongBean.saveBean(SettingsActivity.this, bean); + mnStreamVolume = progress; + updateStreamVolumeTextView(); + //Toast.makeText(SettingsActivity.this, "音量设置为: " + progress, Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + // 当开始拖动SeekBar时的操作 + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + // 当停止拖动SeekBar时的操作 + } + }); + } + + void updateStreamVolumeTextView() { + mtvVolume.setText(String.format("%d/%d", mnStreamVolume, mnStreamMaxVolume)); } public void onDefaultPhone(View view) { diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java b/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java index 792bce4..5db7262 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/beans/RingTongBean.java @@ -12,26 +12,26 @@ import android.media.AudioManager; import android.util.JsonReader; public class RingTongBean extends BaseBean { - + public static final String TAG = "AudioRingTongBean"; - - // 模式 - int ringerMode; + + // 铃声音量 + int streamVolume; public RingTongBean() { - this.ringerMode = AudioManager.RINGER_MODE_NORMAL; + this.streamVolume = 100; } - public RingTongBean(int ringerMode) { - this.ringerMode = ringerMode; + public RingTongBean(int streamVolume) { + this.streamVolume = streamVolume; } - public void setRingerMode(int ringerMode) { - this.ringerMode = ringerMode; + public void setStreamVolume(int streamVolume) { + this.streamVolume = streamVolume; } - public int getRingerMode() { - return ringerMode; + public int getStreamVolume() { + return streamVolume; } @Override @@ -42,15 +42,15 @@ public class RingTongBean extends BaseBean { @Override public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { super.writeThisToJsonWriter(jsonWriter); - jsonWriter.name("ringerMode").value(getRingerMode()); + jsonWriter.name("streamVolume").value(getStreamVolume()); } @Override public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { - if (name.equals("ringerMode")) { - setRingerMode(jsonReader.nextInt()); + if (name.equals("streamVolume")) { + setStreamVolume(jsonReader.nextInt()); } else { return false; } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java index 88eb69e..b60df64 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java @@ -21,8 +21,6 @@ import cc.winboll.studio.libappbase.LogUtils; public class PhoneCallService extends InCallService { public static final String TAG = "PhoneCallService"; - - private volatile int originalRingVolume; private final Call.Callback callback = new Call.Callback() { @Override @@ -61,39 +59,78 @@ public class PhoneCallService extends InCallService { String phoneNumber = details.getHandle().getSchemeSpecificPart(); // 记录原始铃声音量 + // AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); - originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); + + // 恢复铃声音量,预防其他意外条件导致的音量变化问题 + // + + // 读取应用配置,未配置就初始化配置文件 + RingTongBean bean = RingTongBean.loadBean(this, RingTongBean.class); + if (bean == null) { + // 初始化配置 + bean = new RingTongBean(); + RingTongBean.saveBean(this, bean); + } + // 如果当前音量和应用保存的不一致就恢复为应用设定值 + // 恢复铃声音量 + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + // 检查电话接收规则 if (!Rules.getInstance(this).isAllowed(phoneNumber)) { - // 预先静音 - audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0); + // 调低音量 + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0); + //audioManager.setMode(AudioManager.RINGER_MODE_SILENT); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } // 断开电话 call.disconnect(); // 停顿1秒,预防第一声铃声响动 try { - Thread.sleep(1000); + Thread.sleep(500); } catch (InterruptedException e) { LogUtils.d(TAG, ""); } // 恢复铃声音量 - audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0); + try { + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + //audioManager.setMode(AudioManager.RINGER_MODE_NORMAL); + } catch (java.lang.SecurityException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } // 屏蔽电话结束 return; } + // 正常接听电话 PhoneCallActivity.actionStart(this, phoneNumber, callType); } } + void resumeStreamVolume(AudioManager audioManager, int originalRingVolume) { + // 如果当前音量和应用保存的不一致就恢复为应用设定值 + RingTongBean bean = RingTongBean.loadBean(this, RingTongBean.class); + if (bean == null) { + bean = new RingTongBean(); + } + if (originalRingVolume != bean.getStreamVolume()) { + // 恢复铃声音量 + audioManager.setStreamVolume(AudioManager.STREAM_RING, bean.getStreamVolume(), 0); + } + } + @Override public void onCallRemoved(Call call) { super.onCallRemoved(call); - call.unregisterCallback(callback); PhoneCallManager.call = null; - AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); - // 恢复铃声音量 - audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0); } public enum CallType { diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java b/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java index d1dfb52..457a8e9 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/receivers/MainReceiver.java @@ -9,13 +9,11 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.media.RingtoneManager; -import android.net.Uri; -import android.util.Log; +import android.media.AudioManager; import cc.winboll.studio.contacts.services.MainService; +import cc.winboll.studio.libappbase.LogUtils; import com.hjq.toast.ToastUtils; import java.lang.ref.WeakReference; -import cc.winboll.studio.libappbase.LogUtils; public class MainReceiver extends BroadcastReceiver { @@ -43,7 +41,7 @@ public class MainReceiver extends BroadcastReceiver { public void registerAction(Context context) { IntentFilter filter=new IntentFilter(); filter.addAction(ACTION_BOOT_COMPLETED); - //filter.addAction(Intent.ACTION_BATTERY_CHANGED); + //filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION); context.registerReceiver(this, filter); } } diff --git a/contacts/src/main/res/layout/activity_settings.xml b/contacts/src/main/res/layout/activity_settings.xml index 2122230..6ce953a 100644 --- a/contacts/src/main/res/layout/activity_settings.xml +++ b/contacts/src/main/res/layout/activity_settings.xml @@ -45,6 +45,32 @@ + + + + + + + + + +