接收电话时预先静音模式调试完成
This commit is contained in:
parent
c590c96fa6
commit
c16c6bba74
@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Thu Feb 20 22:09:07 GMT 2025
|
#Fri Feb 21 01:46:02 GMT 2025
|
||||||
stageCount=0
|
stageCount=0
|
||||||
libraryProject=winboll-shared
|
libraryProject=winboll-shared
|
||||||
baseVersion=1.0
|
baseVersion=1.0
|
||||||
publishVersion=1.0.0
|
publishVersion=1.0.0
|
||||||
buildCount=126
|
buildCount=175
|
||||||
baseBetaVersion=1.0.1
|
baseBetaVersion=1.0.1
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:launchMode="singleTask"
|
|
||||||
android:exported="true">
|
android:exported="true">
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
@ -51,7 +50,6 @@
|
|||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.CallActivity"
|
android:name=".activities.CallActivity"
|
||||||
android:label="CallActivity"
|
android:label="CallActivity"
|
||||||
@ -89,6 +87,8 @@
|
|||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
<activity android:name="cc.winboll.studio.contacts.activities.SettingsActivity"/>
|
||||||
|
|
||||||
<service
|
<service
|
||||||
android:name="cc.winboll.studio.contacts.services.MainService"
|
android:name="cc.winboll.studio.contacts.services.MainService"
|
||||||
android:exported="true"/>
|
android:exported="true"/>
|
||||||
@ -177,8 +177,6 @@
|
|||||||
|
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<activity android:name="cc.winboll.studio.contacts.activities.SettingsActivity"/>
|
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package cc.winboll.studio.contacts.dun;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen@AliYun.Com
|
||||||
|
* @Date 2025/02/21 06:15:10
|
||||||
|
* @Describe 云盾防御规则
|
||||||
|
*/
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class Rules {
|
||||||
|
|
||||||
|
public static final String TAG = "Rules";
|
||||||
|
|
||||||
|
public static boolean isValidPhoneNumber(String phoneNumber) {
|
||||||
|
// 中国手机号码正则表达式,以1开头,第二位可以是3、4、5、6、7、8、9,后面跟9位数字
|
||||||
|
String regex = "^1[3-9]\\d{9}$";
|
||||||
|
return Pattern.matches(regex, phoneNumber);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isAllowed(String phoneNumber) {
|
||||||
|
return isValidPhoneNumber(phoneNumber);
|
||||||
|
}
|
||||||
|
}
|
@ -5,8 +5,8 @@ import android.media.AudioManager;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.telecom.Call;
|
import android.telecom.Call;
|
||||||
import android.telecom.VideoProfile;
|
import android.telecom.VideoProfile;
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
import androidx.annotation.RequiresApi;
|
||||||
|
import cc.winboll.studio.contacts.dun.Rules;
|
||||||
|
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||||
@ -19,7 +19,6 @@ public class PhoneCallManager {
|
|||||||
|
|
||||||
public PhoneCallManager(Context context) {
|
public PhoneCallManager(Context context) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
|
||||||
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28,6 +27,8 @@ public class PhoneCallManager {
|
|||||||
*/
|
*/
|
||||||
public void answer() {
|
public void answer() {
|
||||||
if (call != null) {
|
if (call != null) {
|
||||||
|
Call.Details details = call.getDetails();
|
||||||
|
String phoneNumber = details.getHandle().getSchemeSpecificPart();
|
||||||
call.answer(VideoProfile.STATE_AUDIO_ONLY);
|
call.answer(VideoProfile.STATE_AUDIO_ONLY);
|
||||||
openSpeaker();
|
openSpeaker();
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,5 @@
|
|||||||
package cc.winboll.studio.contacts.phonecallui;
|
package cc.winboll.studio.contacts.phonecallui;
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
import android.telecom.Call;
|
|
||||||
import android.telecom.InCallService;
|
|
||||||
|
|
||||||
import androidx.annotation.RequiresApi;
|
|
||||||
|
|
||||||
import cc.winboll.studio.contacts.ActivityStack;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监听电话通信状态的服务,实现该类的同时必须提供电话管理的 UI
|
* 监听电话通信状态的服务,实现该类的同时必须提供电话管理的 UI
|
||||||
*
|
*
|
||||||
@ -16,24 +7,32 @@ import cc.winboll.studio.contacts.ActivityStack;
|
|||||||
* @see PhoneCallActivity
|
* @see PhoneCallActivity
|
||||||
* @see android.telecom.InCallService
|
* @see android.telecom.InCallService
|
||||||
*/
|
*/
|
||||||
|
import android.media.AudioManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.telecom.Call;
|
||||||
|
import android.telecom.InCallService;
|
||||||
|
import androidx.annotation.RequiresApi;
|
||||||
|
import cc.winboll.studio.contacts.ActivityStack;
|
||||||
|
import cc.winboll.studio.contacts.dun.Rules;
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.M)
|
@RequiresApi(api = Build.VERSION_CODES.M)
|
||||||
public class PhoneCallService extends InCallService {
|
public class PhoneCallService extends InCallService {
|
||||||
|
|
||||||
|
private int originalRingVolume;
|
||||||
|
|
||||||
private final Call.Callback callback = new Call.Callback() {
|
private final Call.Callback callback = new Call.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void onStateChanged(Call call, int state) {
|
public void onStateChanged(Call call, int state) {
|
||||||
super.onStateChanged(call, state);
|
super.onStateChanged(call, state);
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case Call.STATE_ACTIVE: {
|
case Call.STATE_ACTIVE: {
|
||||||
|
break;
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
case Call.STATE_DISCONNECTED: {
|
case Call.STATE_DISCONNECTED: {
|
||||||
ActivityStack.getInstance().finishActivity(PhoneCallActivity.class);
|
ActivityStack.getInstance().finishActivity(PhoneCallActivity.class);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -45,7 +44,6 @@ public class PhoneCallService extends InCallService {
|
|||||||
|
|
||||||
call.registerCallback(callback);
|
call.registerCallback(callback);
|
||||||
PhoneCallManager.call = call;
|
PhoneCallManager.call = call;
|
||||||
|
|
||||||
CallType callType = null;
|
CallType callType = null;
|
||||||
|
|
||||||
if (call.getState() == Call.STATE_RINGING) {
|
if (call.getState() == Call.STATE_RINGING) {
|
||||||
@ -57,6 +55,17 @@ public class PhoneCallService extends InCallService {
|
|||||||
if (callType != null) {
|
if (callType != null) {
|
||||||
Call.Details details = call.getDetails();
|
Call.Details details = call.getDetails();
|
||||||
String phoneNumber = details.getHandle().getSchemeSpecificPart();
|
String phoneNumber = details.getHandle().getSchemeSpecificPart();
|
||||||
|
|
||||||
|
// 记录原始铃声音量
|
||||||
|
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
|
||||||
|
originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
|
||||||
|
if (!Rules.isAllowed(phoneNumber)) {
|
||||||
|
// 预先静音
|
||||||
|
audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0);
|
||||||
|
call.disconnect();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
PhoneCallActivity.actionStart(this, phoneNumber, callType);
|
PhoneCallActivity.actionStart(this, phoneNumber, callType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -67,6 +76,9 @@ public class PhoneCallService extends InCallService {
|
|||||||
|
|
||||||
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 {
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
package cc.winboll.studio.contacts.receivers;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author ZhanGSKen@AliYun.Com
|
|
||||||
* @Date 2025/02/20 17:54:55
|
|
||||||
* @Describe PhoneCallReceiver
|
|
||||||
*/
|
|
||||||
//import android.content.BroadcastReceiver;
|
|
||||||
//import android.content.Context;
|
|
||||||
//import android.content.Intent;
|
|
||||||
//import android.telephony.TelephonyManager;
|
|
||||||
//import android.util.Log;
|
|
||||||
//import cc.winboll.studio.contacts.services.PhoneCallService;
|
|
||||||
//
|
|
||||||
//public class PhoneReceiver extends BroadcastReceiver {
|
|
||||||
//
|
|
||||||
// public static final String TAG = "PhoneReceiver";
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void onReceive(Context context, Intent intent) {
|
|
||||||
// if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) {
|
|
||||||
// String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
|
|
||||||
// if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
|
|
||||||
// String phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
|
|
||||||
// Log.d(TAG, "Incoming call from: " + phoneNumber);
|
|
||||||
//
|
|
||||||
// // 启动服务来处理电话接听
|
|
||||||
// Intent serviceIntent = new Intent(context, PhoneCallService.class);
|
|
||||||
// serviceIntent.putExtra("phoneNumber", phoneNumber);
|
|
||||||
// context.startService(serviceIntent);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
@ -1,75 +0,0 @@
|
|||||||
package cc.winboll.studio.contacts.services;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Author ZhanGSKen@AliYun.Com
|
|
||||||
* @Date 2025/02/20 19:58:02
|
|
||||||
* @Describe MyPhoneCallService
|
|
||||||
*/
|
|
||||||
import android.telecom.Call;
|
|
||||||
import android.telecom.InCallService;
|
|
||||||
import cc.winboll.studio.contacts.PhoneCallManager;
|
|
||||||
|
|
||||||
public class PhoneCallService extends InCallService {
|
|
||||||
|
|
||||||
public static final String TAG = "PhoneCallService";
|
|
||||||
|
|
||||||
private Call.Callback callback = new Call.Callback() {
|
|
||||||
@Override
|
|
||||||
public void onStateChanged(Call call, int state) {
|
|
||||||
super.onStateChanged(call, state);
|
|
||||||
switch (state) {
|
|
||||||
case Call.STATE_ACTIVE: {
|
|
||||||
break; // 通话中
|
|
||||||
}
|
|
||||||
case Call.STATE_DISCONNECTED: {
|
|
||||||
break; // 通话结束
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// @Override
|
|
||||||
// public void onCallAdded(Call call) {
|
|
||||||
// super.onCallAdded(call);
|
|
||||||
//
|
|
||||||
// call.registerCallback(callback);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void onCallRemoved(Call call) {
|
|
||||||
// super.onCallRemoved(call);
|
|
||||||
//
|
|
||||||
// call.unregisterCallback(callback);
|
|
||||||
// }
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCallAdded(Call call) {
|
|
||||||
super.onCallAdded(call);
|
|
||||||
|
|
||||||
call.registerCallback(callback);
|
|
||||||
PhoneCallManager.call = call; // 传入call
|
|
||||||
|
|
||||||
// CallType callType = null;
|
|
||||||
//
|
|
||||||
// if (call.getState() == Call.STATE_RINGING) {
|
|
||||||
// callType = CallType.CALL_IN;
|
|
||||||
// } else if (call.getState() == Call.STATE_CONNECTING) {
|
|
||||||
// callType = CallType.CALL_OUT;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (callType != null) {
|
|
||||||
// Call.Details details = call.getDetails();
|
|
||||||
// String phoneNumber = details.getHandle().toString().substring(4)
|
|
||||||
// .replaceAll("%20", ""); // 去除拨出电话中的空格
|
|
||||||
// PhoneCallActivity.actionStart(this, phoneNumber, callType);
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCallRemoved(Call call) {
|
|
||||||
super.onCallRemoved(call);
|
|
||||||
|
|
||||||
call.unregisterCallback(callback);
|
|
||||||
PhoneCallManager.call = null;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Thu Feb 20 22:09:07 GMT 2025
|
#Fri Feb 21 01:46:02 GMT 2025
|
||||||
stageCount=0
|
stageCount=0
|
||||||
libraryProject=winboll-shared
|
libraryProject=winboll-shared
|
||||||
baseVersion=1.0
|
baseVersion=1.0
|
||||||
publishVersion=1.0.0
|
publishVersion=1.0.0
|
||||||
buildCount=126
|
buildCount=175
|
||||||
baseBetaVersion=1.0.1
|
baseBetaVersion=1.0.1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user