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 @@
+
+
+
+
+
+
+
+
+
+