android来电处理

部分转自:http://blog.csdn.net/GEOLO/article/details/6090264

          http://blog.csdn.net/GEOLO/article/details/6090303

1. 在src下新建一个包:com.android.internal.telephony(和ITelephony.aidl 中 package 声明的包名一样);

2. 然后从系统源码中把ITelephony.aidl文件拷贝到 com.android.internal.telephony包下。(也可以先新建一个ITelephony.aidl, 然后再把内容拷贝进去(ITelephony.aidl文件内容可以在 http://www.netmite.com/android/mydroid/1.5/frameworks/base/telephony/java/com/android/internal/telephony/ITelephony.aidl  找到,这个方法适合没有SDK源码文件的开发者));
3. 在src下新建一个包:android.telephony, 然后新建一个NeighboringCellInfo.aidl,其内容为:
package android.telephony;
parcelable NeighboringCellInfo;

4.接收来电状态。

package com.geolo.pcp.android;
import java.lang.reflect.Method;
import com.android.internal.telephony.ITelephony;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log; 
public class PhoneCallActivity extends Activity{
	private PhoneCallListener mPhoneCallListener; 
	private TelephonyManager mTelephonyManager;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mPhoneCallListener = new PhoneCallListener();
		mTelephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
		mTelephonyManager.listen(mPhoneCallListener, PhoneCallListener.LISTEN_CALL_STATE);
	}
	public class PhoneCallListener extends PhoneStateListener{
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			switch (state)  { 
			case TelephonyManager.CALL_STATE_IDLE: 
				break; 
			case TelephonyManager.CALL_STATE_OFFHOOK: 
				//CALL_STATE_OFFHOOK; 
				break; 
			case TelephonyManager.CALL_STATE_RINGING: 
				break; 
			default: 
				break; 
			} 
			super.onCallStateChanged(state, incomingNumber);
		}
		@Override
		public void onDataConnectionStateChanged(int state) {
			Log.v(this.getClass().getName(), "onDataConnectionStateChanged-state: " + state);
			super.onDataConnectionStateChanged(state);
		}
		@Override
		public void onDataConnectionStateChanged(int state, int networkType) {
			Log.v(this.getClass().getName(), "onDataConnectionStateChanged-state: " + state);
			Log.v(this.getClass().getName(), "onDataConnectionStateChanged-networkType: " + networkType);
			super.onDataConnectionStateChanged(state, networkType);
		}
		@Override
		public void onServiceStateChanged(ServiceState serviceState) {
			Log.v(this.getClass().getName(), "onServiceStateChanged-ServiceState: " + serviceState);
			super.onServiceStateChanged(serviceState);
		}
		@Override
		public void onSignalStrengthChanged(int asu) {
			Log.v(this.getClass().getName(), "onSignalStrengthChanged-asu: " + asu);
			super.onSignalStrengthChanged(asu);
		}
		@Override
		public void onSignalStrengthsChanged(SignalStrength signalStrength) {
			Log.v(this.getClass().getName(), "onSignalStrengthsChanged-signalStrength: " + signalStrength);
			super.onSignalStrengthsChanged(signalStrength);
		}
	} 
}

5. 自动挂断

private void endCall()
    {  
		Log.d(TAG, "end call ");

		Class<TelephonyManager> c = TelephonyManager.class;
		try {
			Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
			getITelephonyMethod.setAccessible(true);
			ITelephony iTelephony = null;
			iTelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null);
			iTelephony.endCall();
                         // 去掉通知栏通知
			iTelephony.cancelMissedCallsNotification();
		} catch (Exception e) {
			Log.e(TAG, "Fail to end call.", e);
		}
    } 


6. 自动接听(以前博客中整理的)

见:http://blog.csdn.net/wonengxing/article/details/28423427

7. 删除历史记录

	private boolean deleteCallHistory(String phoneNumber)
	{
		Log.i(TAG, "cancel notification");
		
		Class<TelephonyManager> c = TelephonyManager.class;
		try {
			Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
			getITelephonyMethod.setAccessible(true);
			ITelephony iTelephony = null;
			iTelephony = (ITelephony) getITelephonyMethod.invoke(mTelephonyManager, (Object[]) null);
			iTelephony.cancelMissedCallsNotification();
		} catch (Exception e) {
			Log.e(TAG, "Fail to cancel missed call notification", e);
		}
		
		Log.i(TAG, "deleteCallHistory");
		
		ContentResolver resolver = getContentResolver();
		Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, new String[]{"_id"}, "number=?", new String[]{phoneNumber}, "_id desc limit 1");


		if(cursor.moveToFirst())
		{
			Log.i(TAG, "get one entry");
			int id = cursor.getInt(0);
			resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id + ""});
			
			cursor.close();
			return true;
		}
		cursor.close();
		return false;
	}

8. 将已接电话变成未接电话,没有在通知栏通知

	private boolean updateCallHistorytoUnseen(String phoneNumber)
	{
		Log.d(TAG, "updateCallHistorytoUnseen");
		
		ContentResolver resolver = getContentResolver();
		Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, new String[]{"_id"}, "number=? and type=1", new String[]{phoneNumber}, "_id desc limit 1");
		
		if(cursor.moveToFirst())
		{
			Log.d(TAG, "get one entry");
			int id = cursor.getInt(0);
			
			ContentValues values = new ContentValues();
			values.put(CallLog.Calls.TYPE, CallLog.Calls.MISSED_TYPE);
			values.put(CallLog.Calls.NEW, "1");
			
			resolver.update(CallLog.Calls.CONTENT_URI, values, "_id=?", new String[]{id + ""});
			
			cursor.close();
			return true;
		}
		cursor.close();
		
		return false;
	}

有关电话的其他操作:

http://www.eoeandroid.com/forum.php?mod=viewthread&tid=166448


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值