大概的意思:打出电话的过程是:安卓中的底层的service 与手机所在地的电信,移动,或者联通的基站 时刻相连,基站又与网络运营商的服务器相连。你的手机与基站相连,再与服务器相连,再与所拨打的电话号码的手机所在地附近的基站相连,再与对方手机相连。这个过程。
Android中电话的通信机制
一,如何使用代码拨打电话?
1>创建隐式意图:
Intent intent=new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:133333"));
2>启动Activity:
startActivity(intent);
3>在清单文件中注册拨号权限
android.permission.CALL_PHONE
二,如何监听呼入电话(监听电话状态)
1>编写一个监听器类,该类继承自PhoneStateListener。
重写该类中的监听方法。
2>获取TelephonyManager电话管理器。
调用manager.listen(); 开始监听。
3>在清单文件中注册权限。
android.permisison.READ_PHONE_STATE
三,如何监听呼出电话
1>编写一个广播接收器,接收呼出电话的系统广播:
Intent.ACTION_NEW_OUTGOING_CALL
2>重写广播接收器的onReceive方法,获取呼出电话
的电话号码,做后续业务。(可能需要拦截)
3>注册广播接收器。
4>在清单文件中添加权限。
android.permission.PROCESS_OUTGOING_CALLS
---------------------------------------------------------------------------------------------------
实例,如何实现上面三个问题
layout 布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/etNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:hint="请输入电话号码"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/etNumber"
android:onClick="doClick"
android:text="打电话" />
</RelativeLayout>
------------------------------------------------------------------------------------------
一,如何使用代码拨打电话?
1>创建隐式意图:
Intent intent=new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:133333"));
2>启动Activity:
startActivity(intent);
3>在清单文件中注册拨号权限
android.permission.CALL_PHONE
/**
* 监听
* @param view
*/
public void doClick(View view){
switch (view.getId()) {
case R.id.button1:
//1. 创建隐式意图
Intent intent = new Intent(Intent.ACTION_CALL);
String number = etNumber.getText().toString();
intent.setData(Uri.parse("tel:"+number));
//2. 启动Activity
startActivity(intent);
//3. 添加权限
break;
}
}
在 AndroidManifest.xml 项目清单文件中添加权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
//拨打电话权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> //监听呼入电话状态权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> // 监听呼出电话权限
-----------------------------------------------------------------------------------------------------
二,
如何监听呼入电话(监听电话状态)
1>编写一个监听器类,该类继承自PhoneStateListener。
重写该类中的监听方法。
2>获取TelephonyManager电话管理器。
调用manager.listen(); 开始监听。
3>在清单文件中注册权限。
android.permisison.READ_PHONE_STATE
/**
* 监听电话的监听器
*/
class MyPhoneListener extends PhoneStateListener{
/**
* 当电话状态改变了 将会执行该方法
*/
@Override
public void onCallStateChanged(int state, String incomingNumber) {
Log.i("info", "incomingNumber:"+incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.i("info", "CALL_STATE_IDLE");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i("info", "CALL_STATE_OFFHOOK");
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.i("info", "CALL_STATE_RINGING");
break;
}
}
}
在onCreate()方法中
//监听电话状态
获取TelephonyManager电话管理器 这个是系统服务 所以用getSystemService
TelephonyManager manager = (TelephonyManager)
getSystemService(TELEPHONY_SERVICE);
//调用listen方法开启监听
manager.listen(new MyPhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
添加权限
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> //监听呼入电话状态权限
-----------------------------------------------------------------------------------------------------------------------
三 ,如何监听呼出电话
1>编写一个广播接收器,接收呼出电话的系统广播: Intent.ACTION_NEW_OUTGOING_CALL
2>重写广播接收器的onReceive方法,获取呼出电话 的电话号码,做后续业务。(可能需要拦截)
3>注册广播接收器。
4>在清单文件中添加权限。 android.permission.PRECESS_OUTGOING_CALLS
在OnCreate()方法中
//注册广播接收器
receiver = new MyPhoneReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
this.registerReceiver(receiver, filter);
/**
* 接收呼出电话系统广播的接收器
*/
class MyPhoneReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
//获取呼出电话的号码
String number=getResultData();
Log.i("info", "number:"+number);
if(number.equals("18888888888")){
//把电话号码置null
setResultData(null);
}
}
}
添加权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> // 监听呼出电话权限
最后在OnDestroy 中取消注册广播接收器
@Override
protected void onDestroy() {
super.onDestroy();
//取消注册广播接收器
this.unregisterReceiver(receiver);
}