部分转自: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