添加系统设置静音时的权限异常处理,添加固定的应用铃声音量设置。忽略其他应用设置的铃声音量。
This commit is contained in:
		| @@ -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 | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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; | ||||
|             } | ||||
|   | ||||
| @@ -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 { | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -45,6 +45,32 @@ | ||||
|  | ||||
| 		</LinearLayout> | ||||
|  | ||||
| 		<TextView | ||||
| 			android:layout_width="wrap_content" | ||||
| 			android:layout_height="wrap_content" | ||||
| 			android:text="音量设置:"/> | ||||
|  | ||||
| 		<LinearLayout | ||||
| 			android:orientation="horizontal" | ||||
| 			android:layout_width="match_parent" | ||||
| 			android:layout_height="wrap_content" | ||||
| 			android:gravity="center_vertical"> | ||||
|  | ||||
| 			<TextView | ||||
| 				android:layout_width="wrap_content" | ||||
| 				android:layout_height="wrap_content" | ||||
| 				android:layout_marginLeft="10dp" | ||||
| 				android:id="@+id/tv_volume"/> | ||||
|  | ||||
| 			<SeekBar | ||||
| 				android:layout_width="match_parent" | ||||
| 				android:layout_height="wrap_content" | ||||
| 				android:layout_margin="10dp" | ||||
| 				android:max="100" | ||||
| 				android:id="@+id/bellvolume"/> | ||||
|  | ||||
| 		</LinearLayout> | ||||
|  | ||||
| 	</LinearLayout> | ||||
|  | ||||
| </LinearLayout> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 ZhanGSKen
					ZhanGSKen