1、接Android 电话秀(一)
2、捕获电话的状态:
package com.ray.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
/**
*
* [捕获电话,包括开机自动动]<BR>
* [功能详细描述]
*
* @author Administrator
* @version [ 2011-8-11]
*/
public class CallListener extends BroadcastReceiver
{
private static final String TAG = "ray";
private static String callInNumber;
private static String callOutNumber;
private static boolean outGoingflag = false;
@Override
public void onReceive(Context context, Intent arg1)
{
Log.e(TAG, arg1.getAction().toString());
// 拨号
if (arg1.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL))
{
Log.e(TAG, "2222222222222");
// incomingFlag = false;
callOutNumber = arg1.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i(TAG, "call OUT:" + callOutNumber);
String name = arg1.getStringExtra("name");
Log.i(TAG, "name" + name);
outGoingflag = true;
return;
}
TelephonyManager teleMgr = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
//响铃阶段
if (teleMgr.getCallState() == TelephonyManager.CALL_STATE_RINGING)
{
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e(TAG, "CALL_STATE_RINGING");
Bundle bundle = arg1.getExtras();
callInNumber = bundle.getString("incoming_number");
//这里可以加入根据incomingNumber判断是主叫还是被叫,根据当前主被叫选择启动不同的Activity。
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(context, TestCallActivity.class);
intent.putExtra("callInNumber", callInNumber);
context.startActivity(intent);
return;
}
// //摘机状态:播放显示通话过程动画
if (teleMgr.getCallState() == TelephonyManager.CALL_STATE_OFFHOOK)
{
if (outGoingflag)
{
Log.e(TAG, "phoneNumber " + callOutNumber);
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(context, TestCallActivity.class);
intent.putExtra("callOutNumber", callOutNumber);
Log.i(TAG, "66666666");
context.startActivity(intent);
}
return;
}
//
// //待机状态:回到电话振铃前的初始用户界面,
if (teleMgr.getCallState() == TelephonyManager.CALL_STATE_IDLE)
{
Log.e(TAG, "TelephonyManager.CALL_STATE_IDLE");
return;
}
}
}
3、展示界面:
package com.ray.test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.RemoteException;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import com.android.internal.telephony.ITelephony;
/***
*
* [电话秀界面]<BR>
* [功能详细描述]
*
* @author Administrator
* @version [ 2011-8-11]
*/
public class TestCallActivity extends Activity implements OnClickListener
{
private String callInNumber = "";
private String callOutNumber = "";
private TextView phoneName;
private TextView phoneNumber;
private Button callAnswer;
private Button callEnd;
private Button callcancel;
private ITelephony iTelephony;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.telshow);
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// number = getIntent().getExtras().getString("number");
initView();
// phoneNumber.setText(number);
// 打电话进入
callInNumber = getIntent().getExtras().getString("callInNumber");
Log.e("ray", "callInNumber" + callInNumber);
if (callInNumber != null)
{
phoneNumber.setText(callInNumber);
callAnswer.setVisibility(View.VISIBLE);
callcancel.setVisibility(View.VISIBLE);
callEnd.setVisibility(View.GONE);
}
callOutNumber = getIntent().getExtras().getString("callOutNumber");
Log.e("ray", "callOutNumber" + callOutNumber);
if (callOutNumber != null)
{
phoneNumber.setText(callOutNumber);
callAnswer.setVisibility(View.GONE);
callcancel.setVisibility(View.GONE);
callEnd.setVisibility(View.VISIBLE);
callEnd.setText("结束通话");
}
initialItelephony();
}
private void initView()
{
phoneName = (TextView) findViewById(R.id.phone_name);
phoneNumber = (TextView) findViewById(R.id.phone_number);
callAnswer = (Button) findViewById(R.id.call_answer);
callEnd = (Button) findViewById(R.id.call_end);
callcancel = (Button) findViewById(R.id.call_cancel);
callAnswer.setOnClickListener(this);
callcancel.setOnClickListener(this);
callEnd.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
// TODO Auto-generated method stub
switch (v.getId())
{
case R.id.call_end:
try
{
iTelephony.endCall();
}
catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.call_cancel:
try
{
iTelephony.endCall();
}
catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.call_answer:
try
{
iTelephony.answerRingingCall();
}
catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
default:
break;
}
}
public class MyPhoneCallListener extends PhoneStateListener
{
@Override
public void onCallStateChanged(int state, String incomingNumber)
{
// TODO Auto-generated method stub
//
switch (state)
{
// 挂断
case TelephonyManager.CALL_STATE_IDLE:
Log.e("ray", "CALL_STATE_IDLE");
callAnswer.setVisibility(View.GONE);
callcancel.setVisibility(View.GONE);
callEnd.setVisibility(View.VISIBLE);
callEnd.setText("通话已结束");
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finish();
break;
//响铃中
case TelephonyManager.CALL_STATE_RINGING:
Log.e("ray", "CALL_STATE_RINGING");
callAnswer.setVisibility(View.VISIBLE);
callcancel.setVisibility(View.VISIBLE);
callEnd.setVisibility(View.GONE);
break;
//通话中
case TelephonyManager.CALL_STATE_OFFHOOK:
callAnswer.setVisibility(View.GONE);
callcancel.setVisibility(View.GONE);
callEnd.setVisibility(View.VISIBLE);
callEnd.setText("结束通话");
Log.e("ray", "CALL_STATE_OFFHOOK");
break;
default:
break;
}
}
}
public void initialItelephony()
{
TelephonyManager teleMgr = (TelephonyManager) this
.getSystemService(Context.TELEPHONY_SERVICE);
MyPhoneCallListener myPhoneCallListener = new MyPhoneCallListener();
teleMgr.listen(myPhoneCallListener,
PhoneStateListener.LISTEN_CALL_STATE);
Class<TelephonyManager> c = TelephonyManager.class;
Method getITelephonyMethod = null;
try
{
getITelephonyMethod = c.getDeclaredMethod("getITelephony",
(Class[]) null);
getITelephonyMethod.setAccessible(true);
}
catch (SecurityException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (NoSuchMethodException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
iTelephony = (ITelephony) getITelephonyMethod.invoke(teleMgr,
(Object[]) null);
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (InvocationTargetException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.添加权限,及接收:
<receiver android:name="CallListener">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE">
</action>
<category android:name="android.intent.category.DEFAULT">
</category>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL">
</action>
<category android:name="android.intent.category.DEFAULT">
</category>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
<category android:name="android.intent.category.DEFAULT">
</category>
</intent-filter>
</receiver>
</application>
<!-- 新增撥出電話的權限 -->
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
4、页面XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<LinearLayout android:id="@+id/linearLayout1"
android:layout_alignParentTop="true" android:layout_height="wrap_content"
android:layout_width="fill_parent" android:orientation="vertical">
<TextView android:text="电话号码" android:id="@+id/phone_number"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"></TextView>
<TextView android:text="呢称" android:id="@+id/phone_name"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center"></TextView>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="horizontal"
android:id="@+id/call_bottom_layout" android:layout_alignParentBottom="true">
<Button android:layout_width="0dip" android:layout_weight="1"
android:id="@+id/call_answer " android:layout_height="wrap_content"
android:text="接听" android:visibility="gone"></Button>
<Button android:text="结束通话" android:id="@+id/call_end"
android:layout_width="0dip" android:layout_height="wrap_content"
android:layout_weight="1" android:visibility="gone"></Button>
<Button android:layout_width="0dip" android:layout_weight="1"
android:id="@+id/call_cancel" android:layout_height="wrap_content"
android:text="拒绝" android:visibility="gone"></Button>
</LinearLayout>
</RelativeLayout>