首先要在项目的src目录下复制进去三个包,这些文件中有个作用是用来挂断电话的,在这有用,在1.5版本以前其实是不用这么麻烦的 在TelephonyManager中就有endCall()方法,不过后来程序员为了安全,把它舍弃掉了,于是用.aidl文件封装起来,文件就不提供了网上有很多可以自己下载:
最好是把包相应的目录也复制进去,如果只负责文件会报错的。注意了
java代码:
TelephonyManager tm;
Button bt;
SharedPreferences sp;
ArrayList<String> blockNum = new ArrayList<String>();
PhoneStateListener psl = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
case TelephonyManager.CALL_STATE_RINGING:
if (isBlock(incomingNumber)) {// 查看该号码是不是黑名单里的
try {
Method method = Class.forName(
"android.os.ServiceManager").getMethod(
"getService", String.class);
// 获取远程TELEPHONE_SERVICE的IBinder对象的代理
IBinder binder = (IBinder) method.invoke(null,
new Object[] { TELEPHONY_SERVICE });
// 将IBinder对象的代理转换为ITelephony
ITelephony telephony = ITelephony.Stub
.asInterface(binder);
// 挂断电话
telephony.endCall();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} 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();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp=getSharedPreferences("config", this.MODE_PRIVATE);
tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(psl, PhoneStateListener.LISTEN_CALL_STATE);// 监听通话状态的改变
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 查询联系人的电话号码
final Cursor cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, null, null, null);
BaseAdapter adapter = new BaseAdapter() {
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
// TODO Auto-generated method stub
cursor.moveToPosition(position);
CheckBox cb = new CheckBox(MainActivity.this);
String number = cursor
.getString(
cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
;
String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
System.out.println(name+":"+number);
cb.setText(name+":"+number);
if (isBlock(number)) {
cb.setChecked(true);
}
return cb;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return cursor.getCount();
}
};
View selectView = getLayoutInflater().inflate(R.layout.dialog,
null);
final ListView lv = (ListView) selectView.findViewById(R.id.lv);
lv.setAdapter(adapter);
AlertDialog.Builder builder = new AlertDialog.Builder(
MainActivity.this);
builder.setView(selectView);
builder.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
// 清空blockList集合
blockNum.clear();
// 便利listview组件的每个列表项
for (int i = 0; i < lv.getCount(); i++) {
CheckBox check = (CheckBox) lv
.getChildAt(i);
if(check!=null){
System.out.println("返回所有位置的视图:"+check.isChecked()+","+check.getText());
// 如果改列表被勾选
if (check.isChecked()) {
// 添加该列表中的电话号码
blockNum.add(check.getText()
.toString());
}
}
}
System.out.println("黑名单:"+blockNum);
}
});
builder.create();
builder.show();
}
});
两个layout文件做的相当简单就省略了。
最后记得在清单文件中添加:
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
就可以了