TelephoneManager学习之二,添加黑名单并自动挂断电话

             首先要在项目的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"/>
就可以了



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值