Android 对电话进行监听和挂断

Posted 不积跬步-无以至千里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 对电话进行监听和挂断相关的知识,希望对你有一定的参考价值。

1.添加权限

<!--拨打电话的权限-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<!--电话拦截-->
<receiver android:name=".receiver.PhoneBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<!-- 电话拦截服务 -->

<service android:name="com.lvshandian.menshen.service.PhoneService">
<intent-filter>
<action android:name="com.xinwang.telesms.PhoneReciever"></action>
<action android:name="com.xinwang.telesms.server.IMICHAT" />
</intent-filter>
</service>


package com.lvshandian.menshen.receiver;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
import android.util.Log;


import com.android.internal.telephony.ITelephony;
import com.lvshandian.menshen.service.PhoneService;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
* Created by zhang on 2016/11/3.
* 创建电话的监听
*/

public class PhoneBroadcastReceiver extends BroadcastReceiver {


String TAG = "tag";
TelephonyManager telMgr;

@Override
public void onReceive(Context context, Intent intent) {


telMgr = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
switch (telMgr.getCallState()) {
//来电
case TelephonyManager.CALL_STATE_RINGING:
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.v(TAG, "number:" + number);
Intent myintent = new Intent(context, PhoneService.class);
myintent.setAction("com.lvshandian.menshen.service.PhoneReciever");
context.startService(myintent);
// if (!getPhoneNum(context).contains(number)) {
// SharedPreferences phonenumSP = context.getSharedPreferences("in_phone_num", Context.MODE_PRIVATE);
// SharedPreferences.Editor editor = phonenumSP.edit();
// editor.putString(number, number);
// editor.commit();
// endCall();
// }
break;
//响铃
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
//挂断
case TelephonyManager.CALL_STATE_IDLE:
break;
}

}

/**
* 挂断电话
*/
private void endCall() {
Class<TelephonyManager> c = TelephonyManager.class;
try {
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = null;
Log.e(TAG, "End call.");
iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
iTelephony.endCall();
} catch (Exception e) {
Log.e(TAG, "Fail to answer ring call.", e);
}
}

private ArrayList<String> getPhoneNum(Context context) {
ArrayList<String> numList = new ArrayList<String>();
//得到ContentResolver对象
ContentResolver cr = context.getContentResolver();
//取得电话本中开始一项的光标
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while (cursor.moveToNext()) {
// 取得联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
// 取得电话号码(可能存在多个号码)
while (phone.moveToNext()) {
String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
numList.add(strPhoneNumber);
Log.v("tag", "strPhoneNumber:" + strPhoneNumber);
}

phone.close();
}
cursor.close();
return numList;
}


}

//进行过滤对比电话

package com.lvshandian.menshen.service;

import java.lang.reflect.Method;
import java.util.List;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

import com.android.internal.telephony.ITelephony;
import com.lvshandian.menshen.bean.PhoneBean;
import com.lvshandian.menshen.receiver.PhoneBroadcastReceiver;
import com.lvshandian.menshen.utils.TextUtils;
import com.lvshandian.menshen.utils.XUtils;

public class PhoneService extends Service {
String TAG = "tag";
TelephonyManager telManager;

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(new MyPhoneStateListener(),
PhoneStateListener.LISTEN_CALL_STATE);
}

/**
* 挂断电话
*/
private void endCall() {
Class<TelephonyManager> c = TelephonyManager.class;
try {
Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
getITelephonyMethod.setAccessible(true);
ITelephony iTelephony = null;
iTelephony = (ITelephony) getITelephonyMethod.invoke(telManager, (Object[]) null);
iTelephony.endCall();
} catch (Exception e) {
}
}

private class MyPhoneStateListener extends PhoneStateListener {
String phoneNumber;

public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: /* 接通 */
phoneNumber = incomingNumber;
List<PhoneBean> list = XUtils.findAll(PhoneBean.class);
for (int i = 0; i < list.size(); i++) {
if (TextUtils.isString(list.get(i).getDnseg(), phoneNumber)) {
endCall();
break;
}
}

}
super.onCallStateChanged(state, incomingNumber);
}

}


@Override
public void onDestroy() {
super.onDestroy();
Intent localIntent = new Intent();
localIntent.setClass(this, PhoneService.class); // 销毁时重新启动Service
this.startService(localIntent);
}

private int flags;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY_COMPATIBILITY;
}

@Override
public void onStart(Intent intent, int startId) {
// 再次动态注册广播
IntentFilter localIntentFilter = new IntentFilter("android.intent.action.USER_PRESENT");
localIntentFilter.setPriority(Integer.MAX_VALUE);// 整形最大值
myReceiver searchReceiver = new myReceiver();
registerReceiver(searchReceiver, localIntentFilter);
super.onStart(intent, startId);
}

public class myReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, PhoneBroadcastReceiver.class));
}
}
}



 
















































































































































































































































以上是关于Android 对电话进行监听和挂断的主要内容,如果未能解决你的问题,请参考以下文章

android 自动拨打电话和挂断电话(反射和intent方式)

android 自动拨打电话和挂断电话(反射和intent方式)

挂断电话demo

如何挂断Android中的拨出电话?

为啥使用 quickblox sdk 从网站到 Android 在挂断电话上无法访问更新的会话信息?

Android ITelephony EndCall Remove 各版本挂断拦截电话方法