Xamarin.Android实现自动拨打及挂断电话的功能
创始人
2025-06-01 20:52:15

目录

  • 1、说明
  • 2、具体实现
    • 2.1 效果
    • 2.2 原理说明
    • 2.3 具体代码实现
      • 2.3.1 layout
      • 2.3.3 广播接收器
      • 2.3.3 拨打电话的Activity
      • 2.3.4 主界面Activity
  • 3、代码下载
  • 4、参考资料

1、说明

这几天刚刚整理了两篇文章:Xamarin.Android实现拨打电话的功能 和 Xamarin.Android实现闹钟的功能。就和apple-pen的故事一样,于是两篇文章又攒出一个新的:定时打电话功能

本篇纯属技术交流,请务必正确使用。

2、具体实现

2.1 效果

在这里插入图片描述

2.2 原理说明

先定义一个广播接收器,监听闹钟的状态。当闹钟到点后,广播接收器接收到信息,于是启动拨打电话的activity(本篇中的PhoneActivity),在PhoneActivity中启用电话监听器(PhoneStateListener),当发现电话已接通时,进行如下动作:关闭电话、关闭PhoneActivity。然后继续循环以上。

2.3 具体代码实现

2.3.1 layout


=60)秒"android:inputType="numberDecimal" />

2.3.3 广播接收器

using Android.Content;
using Android.Widget;namespace AlarmDemo
{[BroadcastReceiver]public class MyReceiver : BroadcastReceiver{public override void OnReceive(Context context, Intent intent){Intent phoneIntent = new Intent(context, typeof(PhoneActivity));phoneIntent.AddFlags(ActivityFlags.NewTask); //新开一个线程承载活动phoneIntent.PutExtra("phoneNumber", intent.GetStringExtra("phoneNumber"));context.StartActivity(phoneIntent); //开启新活动,进行拨打电话}}
}

2.3.3 拨打电话的Activity

完成电话的拨打和挂断

using Android.App;
using Android.Content;
using Android.OS;
using Android.Telephony;
using Android.Widget;
using System;
using System.Threading;namespace AlarmDemo
{[Activity(Label = "PhoneActivity")]public class PhoneActivity : Activity{private Android.Telecom.TelecomManager telecomManager = null;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);// Create your application here//参数初始化//关掉电话的managertelecomManager = (Android.Telecom.TelecomManager)GetSystemService(Context.TelecomService);//调用系统方法(监听电话状态)MyPhoneStateListener phoneStateListener = new MyPhoneStateListener(telecomManager,this);TelephonyManager telephonyManager = (TelephonyManager)GetSystemService(Context.TelephonyService);telephonyManager.Listen(phoneStateListener, PhoneStateListenerFlags.CallState);try {var intent = new Intent(Intent.ActionCall);intent.SetData(Android.Net.Uri.Parse("tel:" + Intent.GetStringExtra("phoneNumber")));StartActivity(intent);}catch(Exception ex){Toast.MakeText(this, ex.Message, ToastLength.Long).Show();}}}public class MyPhoneStateListener : PhoneStateListener{private Android.Telecom.TelecomManager v_telecomManager;private PhoneActivity v_phoneActivity;public MyPhoneStateListener(Android.Telecom.TelecomManager v_telecomManager, PhoneActivity phoneActivity){this.v_telecomManager = v_telecomManager;this.v_phoneActivity = phoneActivity;}public override void OnCallStateChanged(CallState state, string incomingNumber){base.OnCallStateChanged(state, incomingNumber);switch (state){case CallState.Offhook: //若电话接通了,则进行挂断Thread.Sleep(3000);this.v_telecomManager.EndCall(); //关闭电话v_phoneActivity.Finish();break;default:break;}}}
}

2.3.4 主界面Activity

主要完成权限判断,并启动闹钟

using Android;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using AndroidX.AppCompat.App;
using AndroidX.CoordinatorLayout.Widget;
using AndroidX.Core.App;
using Google.Android.Material.Snackbar;
using Java.Lang;
using System;namespace AlarmDemo
{[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]public class MainActivity : AppCompatActivity{//DECLARE WIDGETSprivate Button startBtn;private EditText timeTxt,internalTxt,phoneNumberTxt;private CoordinatorLayout coordinatorLayout;private const int REQUEST_CALL = 1,STOP_CALL=2, ALL_ALLOW=3;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);Xamarin.Essentials.Platform.Init(this, savedInstanceState);// Set our view from the "main" layout resourceSetContentView(Resource.Layout.activity_main);this.initializeViews();}public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults){Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);if(requestCode== ALL_ALLOW){if ((grantResults.Length == 2) && (grantResults[0] == Permission.Granted) && (grantResults[1] == Permission.Granted)){go();//调用拨打电话的具体方法}else{Snackbar.Make(coordinatorLayout, "用户未能授予拨打电话的权限", Snackbar.LengthShort).Show();}}else{base.OnRequestPermissionsResult(requestCode, permissions, grantResults);}}private void initializeViews(){timeTxt = FindViewById(Resource.Id.timeTxt);internalTxt = FindViewById(Resource.Id.initTime);phoneNumberTxt = FindViewById(Resource.Id.phoneNumber);startBtn = FindViewById

3、代码下载

代码下载

4、参考资料

1、主要参考了这篇
2、这个是如何监听电话状态的
3、广播接收器的官网材料
4、如何通过程序停掉电话

相关内容

热门资讯

旧金山一片漆黑!马斯克宣布:特... 来源丨北美商业见闻自上周六突发的美国加州旧金山大停电,在周日下午仍未完全结束。Waymo的无人驾驶服...
以智能重构尊贵,尊界S800成... 华为与江淮联手打造尊界S800,以创新重新定义豪华,走出高端化破局之路。文|吴姝2025年12月,在...
中国移动委任陈忠岳为董事长,杨... 54岁陈忠岳正式出任中国移动董事长。12月22日,中国移动有限公司(中国移动,00941.HK)在港...
中方对日本高官拥核言论感到震惊 外交部发言人林剑22日在例行记者会上表示,中方对日本首相官邸高官公然宣称日本应该拥有核武器感到震惊。...