优化铃声设置
This commit is contained in:
		@@ -27,6 +27,11 @@
 | 
			
		||||
    <!-- 此应用可显示在其他应用上方 -->
 | 
			
		||||
    <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
 | 
			
		||||
        android:name=".App"
 | 
			
		||||
        android:allowBackup="true"
 | 
			
		||||
@@ -88,7 +93,7 @@
 | 
			
		||||
        </activity>
 | 
			
		||||
 | 
			
		||||
        <activity android:name="cc.winboll.studio.contacts.activities.SettingsActivity"/>
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        <service
 | 
			
		||||
            android:name="cc.winboll.studio.contacts.services.MainService"
 | 
			
		||||
            android:exported="true"/>
 | 
			
		||||
@@ -164,7 +169,7 @@
 | 
			
		||||
            </intent-filter>
 | 
			
		||||
 | 
			
		||||
        </receiver>
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        <provider
 | 
			
		||||
            android:name="androidx.core.content.FileProvider"
 | 
			
		||||
            android:authorities="${applicationId}.fileprovider"
 | 
			
		||||
 
 | 
			
		||||
@@ -4,30 +4,35 @@ package cc.winboll.studio.contacts.activities;
 | 
			
		||||
 * @Author ZhanGSKen@AliYun.Com
 | 
			
		||||
 * @Date 2025/02/21 05:37:42
 | 
			
		||||
 */
 | 
			
		||||
import android.app.NotificationManager;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.DialogInterface;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.media.AudioManager;
 | 
			
		||||
import android.net.Uri;
 | 
			
		||||
import android.os.Build;
 | 
			
		||||
import android.os.Bundle;
 | 
			
		||||
import android.provider.Settings;
 | 
			
		||||
import android.view.View;
 | 
			
		||||
import android.view.WindowManager;
 | 
			
		||||
import android.widget.Switch;
 | 
			
		||||
import android.widget.Toast;
 | 
			
		||||
import androidx.appcompat.app.AlertDialog;
 | 
			
		||||
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 cc.winboll.studio.contacts.R;
 | 
			
		||||
import cc.winboll.studio.contacts.beans.RingTongBean;
 | 
			
		||||
import cc.winboll.studio.libappbase.IWinBollActivity;
 | 
			
		||||
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 static final String TAG = "SettingsActivity";
 | 
			
		||||
 | 
			
		||||
    Toolbar mToolbar;
 | 
			
		||||
    Switch swSilent;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public APPInfo getAppInfo() {
 | 
			
		||||
@@ -38,7 +43,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
    public AppCompatActivity getActivity() {
 | 
			
		||||
        return this;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getTag() {
 | 
			
		||||
        return TAG;
 | 
			
		||||
@@ -58,7 +63,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
    public boolean isEnableDisplayHomeAsUp() {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    protected void onCreate(Bundle savedInstanceState) {
 | 
			
		||||
        super.onCreate(savedInstanceState);
 | 
			
		||||
@@ -72,13 +77,13 @@ public class SettingsActivity extends AppCompatActivity implements IWinBollActiv
 | 
			
		||||
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 | 
			
		||||
        }
 | 
			
		||||
        getSupportActionBar().setSubtitle(getTag());
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onDefaultPhone(View view) {
 | 
			
		||||
        Intent intent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);
 | 
			
		||||
        startActivity(intent);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void onCanDrawOverlays(View view) {
 | 
			
		||||
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
 | 
			
		||||
            && !Settings.canDrawOverlays(this)) {
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -13,22 +13,16 @@ import android.telecom.Call;
 | 
			
		||||
import android.telecom.InCallService;
 | 
			
		||||
import androidx.annotation.RequiresApi;
 | 
			
		||||
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 java.util.ArrayList;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
 | 
			
		||||
@RequiresApi(api = Build.VERSION_CODES.M)
 | 
			
		||||
public class PhoneCallService extends InCallService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onCreate() {
 | 
			
		||||
        super.onCreate();
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private int originalRingVolume;
 | 
			
		||||
    public static final String TAG = "PhoneCallService";
 | 
			
		||||
    
 | 
			
		||||
    private volatile int originalRingVolume;
 | 
			
		||||
 | 
			
		||||
    private final Call.Callback callback = new Call.Callback() {
 | 
			
		||||
        @Override
 | 
			
		||||
@@ -69,13 +63,24 @@ public class PhoneCallService extends InCallService {
 | 
			
		||||
            // 记录原始铃声音量
 | 
			
		||||
            AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
 | 
			
		||||
            originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
 | 
			
		||||
            // 检查电话接收规则
 | 
			
		||||
            if (!Rules.getInstance(this).isAllowed(phoneNumber)) {
 | 
			
		||||
                // 预先静音
 | 
			
		||||
                audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);
 | 
			
		||||
                // 断开电话
 | 
			
		||||
                call.disconnect();
 | 
			
		||||
                // 停顿1秒,预防第一声铃声响动
 | 
			
		||||
                try {
 | 
			
		||||
                    Thread.sleep(1000);
 | 
			
		||||
                } catch (InterruptedException e) {
 | 
			
		||||
                    LogUtils.d(TAG, "");
 | 
			
		||||
                }
 | 
			
		||||
                // 恢复铃声音量
 | 
			
		||||
                audioManager.setStreamVolume(AudioManager.STREAM_RING, originalRingVolume, 0);
 | 
			
		||||
                // 屏蔽电话结束
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 正常接听电话
 | 
			
		||||
            PhoneCallActivity.actionStart(this, phoneNumber, callType);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -9,19 +9,19 @@ 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 cc.winboll.studio.contacts.services.MainService;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
import java.lang.ref.WeakReference;
 | 
			
		||||
import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
 | 
			
		||||
public class MainReceiver extends BroadcastReceiver {
 | 
			
		||||
 | 
			
		||||
    public static final String TAG = "MainReceiver";
 | 
			
		||||
    public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";
 | 
			
		||||
    WeakReference<MainService> mwrService;
 | 
			
		||||
    // 存储电量指示值,
 | 
			
		||||
    // 用于校验电量消息时的电量变化
 | 
			
		||||
    static volatile int _mnTheQuantityOfElectricityOld = -1;
 | 
			
		||||
    static volatile boolean _mIsCharging = false;
 | 
			
		||||
 | 
			
		||||
    public MainReceiver(MainService service) {
 | 
			
		||||
        mwrService = new WeakReference<MainService>(service);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,8 @@ import cc.winboll.studio.libappbase.LogUtils;
 | 
			
		||||
import cc.winboll.studio.libappbase.SOS;
 | 
			
		||||
import cc.winboll.studio.libappbase.bean.APPSOSBean;
 | 
			
		||||
import cc.winboll.studio.contacts.dun.Rules;
 | 
			
		||||
import android.media.AudioManager;
 | 
			
		||||
import com.hjq.toast.ToastUtils;
 | 
			
		||||
 | 
			
		||||
public class MainService extends Service {
 | 
			
		||||
 | 
			
		||||
@@ -46,7 +48,8 @@ public class MainService extends Service {
 | 
			
		||||
    AssistantService mAssistantService;
 | 
			
		||||
    boolean isBound = false;
 | 
			
		||||
    MainReceiver mMainReceiver;
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public IBinder onBind(Intent intent) {
 | 
			
		||||
        return new MyBinder();
 | 
			
		||||
@@ -68,7 +71,9 @@ public class MainService extends Service {
 | 
			
		||||
            mMyServiceConnection = new MyServiceConnection();
 | 
			
		||||
        }
 | 
			
		||||
        mMainServiceHandler = new MainServiceHandler(this);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        
 | 
			
		||||
    
 | 
			
		||||
        // 运行服务内容
 | 
			
		||||
        mainService();
 | 
			
		||||
    }
 | 
			
		||||
@@ -163,6 +168,7 @@ public class MainService extends Service {
 | 
			
		||||
 | 
			
		||||
            // 停止主要进程
 | 
			
		||||
            MainServiceThread.getInstance(this, mMainServiceHandler).setIsExit(true);
 | 
			
		||||
            
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        super.onDestroy();
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,11 @@
 | 
			
		||||
		android:layout_height="0dp"
 | 
			
		||||
		android:layout_weight="1.0">
 | 
			
		||||
 | 
			
		||||
		<TextView
 | 
			
		||||
			android:layout_width="wrap_content"
 | 
			
		||||
			android:layout_height="wrap_content"
 | 
			
		||||
			android:text="应用权限设置:"/>
 | 
			
		||||
 | 
			
		||||
		<LinearLayout
 | 
			
		||||
			android:orientation="horizontal"
 | 
			
		||||
			android:layout_width="match_parent"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user