From 4b69d90744d6d5ab7b3dee0a8580a46d553c6d39 Mon Sep 17 00:00:00 2001 From: TQCasey <494294315@qq.com> Date: Mon, 29 Jun 2026 01:59:49 +0800 Subject: [PATCH] fix --- .../java/com/rnpay/CallActionReceiver.java | 17 ++++-- .../java/com/rnpay/IncomingCallActivity.java | 56 ++++++++++++++++--- android/app/src/main/res/values/styles.xml | 1 + 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/android/app/src/main/java/com/rnpay/CallActionReceiver.java b/android/app/src/main/java/com/rnpay/CallActionReceiver.java index 7b734c5..5b83bd4 100644 --- a/android/app/src/main/java/com/rnpay/CallActionReceiver.java +++ b/android/app/src/main/java/com/rnpay/CallActionReceiver.java @@ -6,7 +6,7 @@ import android.content.Intent; import com.rnwalletman.IncomingCallNotificationHelper; -/** 处理来电通知里的接听 / 挂断广播 */ +/** 处理来电通知 Accept / Decline 广播(通知 action 广播,系统允许 startActivity)*/ public class CallActionReceiver extends BroadcastReceiver { public static final String ACTION_ACCEPT = "com.rnpay.CALL_ACCEPT"; @@ -15,12 +15,19 @@ public class CallActionReceiver extends BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { String action = intent.getAction(); + if (!ACTION_ACCEPT.equals(action) && !ACTION_DECLINE.equals(action)) return; + + IncomingCallNotificationHelper.cancelRingThread(); IncomingCallNotificationHelper.cancel(ctx); - if (ACTION_ACCEPT.equals(action)) { - IncomingCallNotificationHelper.deliverCallResult(ctx, "accept"); - } else if (ACTION_DECLINE.equals(action)) { - IncomingCallNotificationHelper.deliverCallResult(ctx, "decline"); + String result = ACTION_ACCEPT.equals(action) ? "accept" : "decline"; + IncomingCallNotificationHelper.deliverCallResult(ctx, result); + + Intent launch = ctx.getPackageManager().getLaunchIntentForPackage(ctx.getPackageName()); + if (launch != null) { + launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_SINGLE_TOP); + ctx.startActivity(launch); } } } diff --git a/android/app/src/main/java/com/rnpay/IncomingCallActivity.java b/android/app/src/main/java/com/rnpay/IncomingCallActivity.java index 1e80fbf..0e1f84d 100644 --- a/android/app/src/main/java/com/rnpay/IncomingCallActivity.java +++ b/android/app/src/main/java/com/rnpay/IncomingCallActivity.java @@ -32,6 +32,10 @@ public class IncomingCallActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + if (getIntent().getBooleanExtra("auto_accept", false) + || getIntent().getBooleanExtra("auto_decline", false)) { + setTheme(android.R.style.Theme_Translucent_NoTitleBar); + } super.onCreate(savedInstanceState); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { @@ -67,19 +71,22 @@ public class IncomingCallActivity extends Activity { String caller = getIntent().getStringExtra("caller"); int ringDuration = getIntent().getIntExtra("ringDuration", 30); - boolean autoAccept = getIntent().getBooleanExtra("auto_accept", false); + boolean autoAccept = getIntent().getBooleanExtra("auto_accept", false); + boolean autoDecline = getIntent().getBooleanExtra("auto_decline", false); if (caller == null || caller.isEmpty()) caller = "Unknown"; - // 全屏模式由 setFullScreenIntent 触发,Activity 起来后立即取消通知,下拉栏不残留 + // 立即打断 ring 线程(防止振动重启),再取消通知+停振动 + IncomingCallNotificationHelper.cancelRingThread(); IncomingCallNotificationHelper.cancel(this); - // 通知栏 Answer 按钮直接触发:跳过 UI,deliver accept 后进 app - if (autoAccept) { + // 通知栏 Accept / Decline 按钮:透明 Activity,deliver 结果后进 app,用户无感知 + if (autoAccept || autoDecline) { resultDelivered = true; - IncomingCallNotificationHelper.cancel(this); - IncomingCallNotificationHelper.deliverCallResult(this, "accept"); + IncomingCallNotificationHelper.deliverCallResult(this, autoAccept ? "accept" : "decline"); launchMainApp(caller); + overridePendingTransition(0, 0); finish(); + overridePendingTransition(0, 0); return; } @@ -217,10 +224,13 @@ public class IncomingCallActivity extends Activity { private void launchMainApp(String caller) { Intent launch = getPackageManager().getLaunchIntentForPackage(getPackageName()); if (launch != null) { - launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + launch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); launch.putExtra("from_call", true); launch.putExtra("caller", caller); - startActivity(launch); + // 跨 Task 切换用 ActivityOptions 禁动画,overridePendingTransition 对此无效 + android.app.ActivityOptions opts = + android.app.ActivityOptions.makeCustomAnimation(this, 0, 0); + startActivity(launch, opts.toBundle()); } } @@ -298,6 +308,36 @@ public class IncomingCallActivity extends Activity { } } + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + boolean autoAccept = intent.getBooleanExtra("auto_accept", false); + boolean autoDecline = intent.getBooleanExtra("auto_decline", false); + if ((autoAccept || autoDecline) && !resultDelivered) { + resultDelivered = true; + if (countDown != null) countDown.cancel(); + stopRingtone(); + stopVibrate(); + IncomingCallNotificationHelper.cancelRingThread(); + IncomingCallNotificationHelper.cancel(this); + String caller = intent.getStringExtra("caller"); + if (caller == null || caller.isEmpty()) caller = "Unknown"; + IncomingCallNotificationHelper.deliverCallResult(this, autoAccept ? "accept" : "decline"); + launchMainApp(caller); + overridePendingTransition(0, 0); + finish(); + overridePendingTransition(0, 0); + } + } + + @Override + protected void onStop() { + super.onStop(); + stopRingtone(); + stopVibrate(); + } + @Override protected void onDestroy() { if (countDown != null) countDown.cancel(); diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index 792db86..3f5b042 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -12,6 +12,7 @@ false #6a6b6f false + true