优化铃声设置

This commit is contained in:
ZhanGSKen 2025-02-25 00:15:48 +08:00
parent 63c10e6dc9
commit 2cc3850c95
9 changed files with 130 additions and 30 deletions

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Fri Feb 21 12:18:00 HKT 2025 #Mon Feb 24 16:11:50 GMT 2025
stageCount=1 stageCount=1
libraryProject=winboll-shared libraryProject=winboll-shared
baseVersion=1.0 baseVersion=1.0
publishVersion=1.0.0 publishVersion=1.0.0
buildCount=0 buildCount=32
baseBetaVersion=1.0.1 baseBetaVersion=1.0.1

View File

@ -27,6 +27,11 @@
<!-- 此应用可显示在其他应用上方 --> <!-- 此应用可显示在其他应用上方 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 更改您的音频设置 -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<application <application
android:name=".App" android:name=".App"
android:allowBackup="true" android:allowBackup="true"

View File

@ -4,30 +4,35 @@ package cc.winboll.studio.contacts.activities;
* @Author ZhanGSKen@AliYun.Com * @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/21 05:37:42 * @Date 2025/02/21 05:37:42
*/ */
import android.app.NotificationManager;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.media.AudioManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings; import android.provider.Settings;
import android.view.View; import android.view.View;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.Switch;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.contacts.R;
import com.hjq.toast.ToastUtils;
import java.lang.reflect.Field;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.contacts.R;
import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.libappbase.IWinBollActivity; 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 java.lang.reflect.Field;
public class SettingsActivity extends AppCompatActivity implements IWinBollActivity { public class SettingsActivity extends AppCompatActivity implements IWinBollActivity {
public static final String TAG = "SettingsActivity"; public static final String TAG = "SettingsActivity";
Toolbar mToolbar; Toolbar mToolbar;
Switch swSilent;
@Override @Override
public APPInfo getAppInfo() { public APPInfo getAppInfo() {
@ -72,13 +77,13 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} }
getSupportActionBar().setSubtitle(getTag()); getSupportActionBar().setSubtitle(getTag());
} }
public void onDefaultPhone(View view) { public void onDefaultPhone(View view) {
Intent intent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS); Intent intent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);
startActivity(intent); startActivity(intent);
} }
public void onCanDrawOverlays(View view) { public void onCanDrawOverlays(View view) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
&& !Settings.canDrawOverlays(this)) { && !Settings.canDrawOverlays(this)) {

View File

@ -0,0 +1,74 @@
package cc.winboll.studio.contacts.beans;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/02/24 18:47:11
* @Describe 手机铃声设置参数类
*/
import cc.winboll.studio.libappbase.BaseBean;
import android.util.JsonWriter;
import java.io.IOException;
import android.media.AudioManager;
import android.util.JsonReader;
public class RingTongBean extends BaseBean {
public static final String TAG = "AudioRingTongBean";
// 模式
int ringerMode;
public RingTongBean() {
this.ringerMode = AudioManager.RINGER_MODE_NORMAL;
}
public RingTongBean(int ringerMode) {
this.ringerMode = ringerMode;
}
public void setRingerMode(int ringerMode) {
this.ringerMode = ringerMode;
}
public int getRingerMode() {
return ringerMode;
}
@Override
public String getName() {
return RingTongBean.class.getName();
}
@Override
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
super.writeThisToJsonWriter(jsonWriter);
jsonWriter.name("ringerMode").value(getRingerMode());
}
@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());
} else {
return false;
}
}
return true;
}
@Override
public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException {
jsonReader.beginObject();
while (jsonReader.hasNext()) {
String name = jsonReader.nextName();
if (!initObjectsFromJsonReader(jsonReader, name)) {
jsonReader.skipValue();
}
}
// 结束 JSON 对象
jsonReader.endObject();
return this;
}
}

View File

@ -13,22 +13,16 @@ import android.telecom.Call;
import android.telecom.InCallService; import android.telecom.InCallService;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import cc.winboll.studio.contacts.ActivityStack; import cc.winboll.studio.contacts.ActivityStack;
import cc.winboll.studio.contacts.beans.PhoneBlackRuleBean; import cc.winboll.studio.contacts.beans.RingTongBean;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import java.util.ArrayList; import cc.winboll.studio.libappbase.LogUtils;
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
public class PhoneCallService extends InCallService { public class PhoneCallService extends InCallService {
@Override public static final String TAG = "PhoneCallService";
public void onCreate() {
super.onCreate();
} private volatile int originalRingVolume;
private int originalRingVolume;
private final Call.Callback callback = new Call.Callback() { private final Call.Callback callback = new Call.Callback() {
@Override @Override
@ -69,13 +63,24 @@ public class PhoneCallService extends InCallService {
// 记录原始铃声音量 // 记录原始铃声音量
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
// 检查电话接收规则
if (!Rules.getInstance(this).isAllowed(phoneNumber)) { if (!Rules.getInstance(this).isAllowed(phoneNumber)) {
// 预先静音 // 预先静音
audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0); audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);
// 断开电话
call.disconnect(); call.disconnect();
// 停顿1秒预防第一声铃声响动
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
LogUtils.d(TAG, "");
}
// 恢复铃声音量
audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0);
// 屏蔽电话结束
return; return;
} }
// 正常接听电话
PhoneCallActivity.actionStart(this, phoneNumber, callType); PhoneCallActivity.actionStart(this, phoneNumber, callType);
} }
} }

View File

@ -9,19 +9,19 @@ 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.net.Uri;
import android.util.Log;
import cc.winboll.studio.contacts.services.MainService; import cc.winboll.studio.contacts.services.MainService;
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 {
public static final String TAG = "MainReceiver"; public static final String TAG = "MainReceiver";
public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED"; public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
WeakReference<MainService> mwrService; WeakReference<MainService> mwrService;
// 存储电量指示值
// 用于校验电量消息时的电量变化
static volatile int _mnTheQuantityOfElectricityOld = -1;
static volatile boolean _mIsCharging = false;
public MainReceiver(MainService service) { public MainReceiver(MainService service) {
mwrService = new WeakReference<MainService>(service); mwrService = new WeakReference<MainService>(service);

View File

@ -28,6 +28,8 @@ import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.SOS; import cc.winboll.studio.libappbase.SOS;
import cc.winboll.studio.libappbase.bean.APPSOSBean; import cc.winboll.studio.libappbase.bean.APPSOSBean;
import cc.winboll.studio.contacts.dun.Rules; import cc.winboll.studio.contacts.dun.Rules;
import android.media.AudioManager;
import com.hjq.toast.ToastUtils;
public class MainService extends Service { public class MainService extends Service {
@ -47,6 +49,7 @@ public class MainService extends Service {
boolean isBound = false; boolean isBound = false;
MainReceiver mMainReceiver; MainReceiver mMainReceiver;
@Override @Override
public IBinder onBind(Intent intent) { public IBinder onBind(Intent intent) {
return new MyBinder(); return new MyBinder();
@ -69,6 +72,8 @@ public class MainService extends Service {
} }
mMainServiceHandler = new MainServiceHandler(this); mMainServiceHandler = new MainServiceHandler(this);
// 运行服务内容 // 运行服务内容
mainService(); mainService();
} }
@ -163,6 +168,7 @@ public class MainService extends Service {
// 停止主要进程 // 停止主要进程
MainServiceThread.getInstance(this, mMainServiceHandler).setIsExit(true); MainServiceThread.getInstance(this, mMainServiceHandler).setIsExit(true);
} }
super.onDestroy(); super.onDestroy();

View File

@ -18,6 +18,11 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1.0"> android:layout_weight="1.0">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="应用权限设置:"/>
<LinearLayout <LinearLayout
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Fri Feb 21 12:18:00 HKT 2025 #Mon Feb 24 16:11:50 GMT 2025
stageCount=1 stageCount=1
libraryProject=winboll-shared libraryProject=winboll-shared
baseVersion=1.0 baseVersion=1.0
publishVersion=1.0.0 publishVersion=1.0.0
buildCount=0 buildCount=32
baseBetaVersion=1.0.1 baseBetaVersion=1.0.1