Android中电话相关操作

来源:互联网 发布:编程开多次根号 编辑:程序博客网 时间:2024/04/26 09:12

大概的意思:打出电话的过程是:安卓中的底层的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);
}
0 0
原创粉丝点击