添加系统设置静音时的权限异常处理,添加固定的应用铃声音量设置。忽略其他应用设置的铃声音量。
This commit is contained in:
parent
820574a4ba
commit
b9f740c386
@ -18,13 +18,13 @@ def genVersionName(def versionName){
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 32
|
compileSdkVersion 30
|
||||||
buildToolsVersion "33.0.3"
|
buildToolsVersion "30.0.3"
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "cc.winboll.studio.contacts"
|
applicationId "cc.winboll.studio.contacts"
|
||||||
minSdkVersion 21
|
minSdkVersion 26
|
||||||
targetSdkVersion 30
|
targetSdkVersion 29
|
||||||
versionCode 1
|
versionCode 1
|
||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#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
|
stageCount=2
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=1.0
|
baseVersion=1.0
|
||||||
publishVersion=1.0.1
|
publishVersion=1.0.1
|
||||||
buildCount=0
|
buildCount=34
|
||||||
baseBetaVersion=1.0.2
|
baseBetaVersion=1.0.2
|
||||||
|
@ -26,6 +26,8 @@ import cc.winboll.studio.libappbase.IWinBollActivity;
|
|||||||
import cc.winboll.studio.libappbase.bean.APPInfo;
|
import cc.winboll.studio.libappbase.bean.APPInfo;
|
||||||
import com.hjq.toast.ToastUtils;
|
import com.hjq.toast.ToastUtils;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import android.widget.SeekBar;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity {
|
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity {
|
||||||
|
|
||||||
@ -33,6 +35,11 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
|||||||
|
|
||||||
Toolbar mToolbar;
|
Toolbar mToolbar;
|
||||||
Switch swSilent;
|
Switch swSilent;
|
||||||
|
SeekBar msbVolume;
|
||||||
|
TextView mtvVolume;
|
||||||
|
int mnStreamMaxVolume;
|
||||||
|
int mnStreamVolume;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public APPInfo getAppInfo() {
|
public APPInfo getAppInfo() {
|
||||||
@ -77,6 +84,52 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
|
|||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
}
|
}
|
||||||
getSupportActionBar().setSubtitle(getTag());
|
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) {
|
public void onDefaultPhone(View view) {
|
||||||
|
@ -12,26 +12,26 @@ import android.media.AudioManager;
|
|||||||
import android.util.JsonReader;
|
import android.util.JsonReader;
|
||||||
|
|
||||||
public class RingTongBean extends BaseBean {
|
public class RingTongBean extends BaseBean {
|
||||||
|
|
||||||
public static final String TAG = "AudioRingTongBean";
|
public static final String TAG = "AudioRingTongBean";
|
||||||
|
|
||||||
// 模式
|
// 铃声音量
|
||||||
int ringerMode;
|
int streamVolume;
|
||||||
|
|
||||||
public RingTongBean() {
|
public RingTongBean() {
|
||||||
this.ringerMode = AudioManager.RINGER_MODE_NORMAL;
|
this.streamVolume = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RingTongBean(int ringerMode) {
|
public RingTongBean(int streamVolume) {
|
||||||
this.ringerMode = ringerMode;
|
this.streamVolume = streamVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setRingerMode(int ringerMode) {
|
public void setStreamVolume(int streamVolume) {
|
||||||
this.ringerMode = ringerMode;
|
this.streamVolume = streamVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getRingerMode() {
|
public int getStreamVolume() {
|
||||||
return ringerMode;
|
return streamVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -42,15 +42,15 @@ public class RingTongBean extends BaseBean {
|
|||||||
@Override
|
@Override
|
||||||
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
|
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
|
||||||
super.writeThisToJsonWriter(jsonWriter);
|
super.writeThisToJsonWriter(jsonWriter);
|
||||||
jsonWriter.name("ringerMode").value(getRingerMode());
|
jsonWriter.name("streamVolume").value(getStreamVolume());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
|
public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
|
||||||
if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
|
if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
|
||||||
if (name.equals("ringerMode")) {
|
if (name.equals("streamVolume")) {
|
||||||
setRingerMode(jsonReader.nextInt());
|
setStreamVolume(jsonReader.nextInt());
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,6 @@ import cc.winboll.studio.libappbase.LogUtils;
|
|||||||
public class PhoneCallService extends InCallService {
|
public class PhoneCallService extends InCallService {
|
||||||
|
|
||||||
public static final String TAG = "PhoneCallService";
|
public static final String TAG = "PhoneCallService";
|
||||||
|
|
||||||
private volatile int originalRingVolume;
|
|
||||||
|
|
||||||
private final Call.Callback callback = new Call.Callback() {
|
private final Call.Callback callback = new Call.Callback() {
|
||||||
@Override
|
@Override
|
||||||
@ -61,39 +59,78 @@ public class PhoneCallService extends InCallService {
|
|||||||
String phoneNumber = details.getHandle().getSchemeSpecificPart();
|
String phoneNumber = details.getHandle().getSchemeSpecificPart();
|
||||||
|
|
||||||
// 记录原始铃声音量
|
// 记录原始铃声音量
|
||||||
|
//
|
||||||
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
|
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)) {
|
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();
|
call.disconnect();
|
||||||
// 停顿1秒,预防第一声铃声响动
|
// 停顿1秒,预防第一声铃声响动
|
||||||
try {
|
try {
|
||||||
Thread.sleep(1000);
|
Thread.sleep(500);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
LogUtils.d(TAG, "");
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 正常接听电话
|
// 正常接听电话
|
||||||
PhoneCallActivity.actionStart(this, phoneNumber, callType);
|
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
|
@Override
|
||||||
public void onCallRemoved(Call call) {
|
public void onCallRemoved(Call call) {
|
||||||
super.onCallRemoved(call);
|
super.onCallRemoved(call);
|
||||||
|
|
||||||
call.unregisterCallback(callback);
|
call.unregisterCallback(callback);
|
||||||
PhoneCallManager.call = null;
|
PhoneCallManager.call = null;
|
||||||
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
|
|
||||||
// 恢复铃声音量
|
|
||||||
audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum CallType {
|
public enum CallType {
|
||||||
|
@ -9,13 +9,11 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.media.RingtoneManager;
|
import android.media.AudioManager;
|
||||||
import android.net.Uri;
|
|
||||||
import android.util.Log;
|
|
||||||
import cc.winboll.studio.contacts.services.MainService;
|
import cc.winboll.studio.contacts.services.MainService;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import com.hjq.toast.ToastUtils;
|
import com.hjq.toast.ToastUtils;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
|
||||||
|
|
||||||
public class MainReceiver extends BroadcastReceiver {
|
public class MainReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
@ -43,7 +41,7 @@ public class MainReceiver extends BroadcastReceiver {
|
|||||||
public void registerAction(Context context) {
|
public void registerAction(Context context) {
|
||||||
IntentFilter filter=new IntentFilter();
|
IntentFilter filter=new IntentFilter();
|
||||||
filter.addAction(ACTION_BOOT_COMPLETED);
|
filter.addAction(ACTION_BOOT_COMPLETED);
|
||||||
//filter.addAction(Intent.ACTION_BATTERY_CHANGED);
|
//filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
|
||||||
context.registerReceiver(this, filter);
|
context.registerReceiver(this, filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,32 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</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>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user