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