This commit is contained in:
2026-06-29 01:59:49 +08:00
parent dab11edc9b
commit 4b69d90744
3 changed files with 61 additions and 13 deletions
@@ -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);
}
}
}
@@ -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 按钮直接触发:跳过 UIdeliver accept 后进 app
if (autoAccept) {
// 通知栏 Accept / Decline 按钮:透明 Activitydeliver 结果后进 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();
@@ -12,6 +12,7 @@
<item name="android:fitsSystemWindows">false</item>
<item name="android:statusBarColor">#6a6b6f</item>
<item name="android:windowLightStatusBar">false</item>
<item name="android:windowDisablePreview">true</item>
</style>
</resources>