android项目 之 来电管家(3) ----- 添加与删除黑名单

现在就实现具体的功能-----添加黑名单

先看图:

从图中也可以看出整个逻辑,就是:

1.  点击底部的添加按钮

2.  转到联系人选择界面选择联系人(这里调用的是系统的联系人界面,每次只能选择一个联系人,当然了,要实现每次选择多个联系人也可以,可以自定义选择联系人界面)

3. 返回选择的联系人并插入到数据库中。

4. 遍历数据库中的黑名单表,将所有的黑名单显示在ListView中

5. 删除联系人

6. 刷新黑名单显示列表

主要代码(BlackListActivity.java):

	private Button btn_add;
	btn_add = (Button)findViewById(R.id.btn_add);
         btn_add.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

				startActivityForResult(intent, 1);

			}
	});

这里的Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI是跳转到系统的选择联系人界面,因为要返回选择的联系人信息,所以要startActivityForResult,其中1,指是requestCode即请求代码,自然也要实现onActivityResult方法了,如下所示:

     protected void onActivityResult (int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){

        	if(requestCode == 1){
        		System.out.println("-------------------");
        		Uri uri = data.getData();
        		create_db();
        		Cursor cursor = managedQuery(uri, null, null, null, null);
        		cursor.moveToFirst();
        		String result[] = this.getContactPhone(cursor);
        		insert_db(result[0], result[1]);//这里是用的是数据库,当然,可以用List来保存联系人的姓名与电话
        		showBlackList();
        		db.close();

        	}
        }
    } 

    private String[] getContactPhone(Cursor cursor){
    	int phoneColum = cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
    	int phoneNum = cursor.getInt(phoneColum);
    	String result[]= new String[2];
    	if(phoneNum > 0){
    		//取得联系人的ID号
    		int idColum = cursor.getColumnIndex(ContactsContract.Contacts._ID);
    		String contactId = cursor.getString(idColum);

    		//取出联系人电话
    		Cursor phone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
    				ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);

    		if(phone.moveToFirst()){
    			for(;!phone.isAfterLast();phone.moveToNext()){
    				int index = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
    				int typeindex = phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
    				int name = phone.getColumnIndex(PhoneLookup.DISPLAY_NAME);

    				String phoneNumber = phone.getString(index);
    				String phoneName = phone.getString(name);
    				result[0] = phoneName;
    				result[1] = phoneNumber;
    			}
    		}
    	}
    	return result;
    }

通过getContactPhone(Cursor cursor)方法 就可以返回选择的联系人的姓名与号码,这里将返回的联系人信息保存在数据库中,并遍历数据库中的表,将其显示在界面中。

既然用到了数据库,当然少不了数据库的创建与关闭,以及数据库的增删改查,下面为数据库相关代码

 	private List<Person> array = new ArrayList<Person>();
	private SQLiteDatabase db;
   //创建或打开数据库
    public void create_db(){
    	//创建或打开数据库
    	db = SQLiteDatabase.openOrCreateDatabase(BlackListActivity.this.getFilesDir().toString()+"/list.db3", null);
    	//db.execSQL("DROP TABLE IF EXISTS blackList");  

    	if(db == null){
    		Toast.makeText(BlackListActivity.this,"数据库创建不成功",Toast.LENGTH_LONG).show();
    	}
    	else{
    		//Toast.makeText(MainActivity.this,"数据库创建成功",Toast.LENGTH_LONG).show();
    		/*
    		//创建表
    		db.execSQL("create table if not exists blackList(_id integer primary key autoincrement," +
    				"name varchar(50)," +
    				"number varchar(15));");*/
    	}
    }
   
   //插入
    public void insert_db(String name,String number){
    	number = number.replaceAll("-","");
    	Cursor cursor = db.rawQuery("select * from blackList where number = "+number,null);
    	if(cursor.getCount() == 0){
    		db.execSQL("insert into blackList(name,number) values('"+ name+ "','" + number +"');");
    	}
    	else{
    		Toast.makeText(BlackListActivity.this, "该号码已在黑名单中", Toast.LENGTH_SHORT).show();

    	}
    	cursor.close();
    }<br abp="823" /><br abp="824" />
   //删除
    public void delete_db(int item_ID){
    	db.execSQL("delete from blackList where _id='" + item_ID+"'");
    }
    //显示黑名单
    public void showBlackList(){
    	Cursor cursor = db.rawQuery("select * from blackList",null);
    	array.clear();
    	if(cursor.getCount() > 0){
    		cursor.moveToFirst();

    		for(int i = 0;i < cursor.getCount();i++){
    			int idIndex = cursor.getColumnIndex("_id");
    			int nameIndex = cursor.getColumnIndex("name");
    			int numberIndex = cursor.getColumnIndex("number");

    			int id = cursor.getInt(idIndex);
    			String name = cursor.getString(nameIndex);
    			String number = cursor.getString(numberIndex);
    			Person person = new Person(id,name,number);
    			array.add(person);
    			cursor.moveToNext();
    		}

    	}
    	cursor.close();
    	adapter = new Adapter(BlackListActivity.this,tv_count);
	lv_show.setAdapter(adapter);

    }

添加联系人并显示的功能,已经实现了,那么剩下的就是删除联系人了,当长按listView中的item时,会弹出多选控件以及底部的删除与返回按钮控件,关于如何弹出这些控件,在上一节专门写了,这里只是在上节的基础上实现删除联系人。

private List<Person> selectid = new ArrayList<Person>();
private boolean isMulChoice = false;
private Adapter adapter;
private ListView lv_show;
private RelativeLayout add_layout;
private RelativeLayout delete_layout;
private Button btn_delete;
private Button btn_cancel;
        btn_delete = (Button)findViewById(R.id.btn_delete);
        btn_delete.setOnClickListener(new ClickEvent());
        btn_cancel = (Button)findViewById(R.id.btn_cancel);
        btn_cancel.setOnClickListener(new ClickEvent());
      class ClickEvent implements OnClickListener{

		@Override
		public void onClick(View v) {
			 switch (v.getId()) {
		        case R.id.btn_cancel:
		            isMulChoice = false;
		            selectid.clear();
		            adapter = new Adapter(BlackListActivity.this,tv_count);
		            lv_show.setAdapter(adapter);
		            delete_layout.setVisibility(View.GONE);
		            add_layout.setVisibility(View.VISIBLE);
		            break;
		        case R.id.btn_delete:
		            isMulChoice =false;
		            create_db();
		            for(int i=0;i<selectid.size();i++){
		                for(int j=0;j<array.size();j++){
		                    if(selectid.get(i).equals(array.get(j))){

		                    	delete_db(array.get(j).id);
		                        array.remove(j);
		                    }
		                }
		            }
		            selectid.clear();

		            showBlackList();
		            db.close();

		            adapter = new Adapter(BlackListActivity.this,tv_count);
		            lv_show.setAdapter(adapter);
		            delete_layout.setVisibility(View.GONE);
		            add_layout.setVisibility(View.VISIBLE);
		            break;
		        default:
		            break;
		        }

		}

    }

删除的思路就是当点击删除按钮时,将选中的联系从数据库中删除,并调用showBlackList来刷新显示黑名单列表。

最后,用到了选择联系人,那么就要有读取联系人信息的权限,在AndroidManifest.xml添加:

	<uses-permission android:name="android.permission.READ_CONTACTS"/> <br abp="855" />
时间: 2024-12-30 00:01:54

android项目 之 来电管家(3) ----- 添加与删除黑名单的相关文章

android项目 之 来电管家(5) ----- 添加监听服务

上面四节,已经实现了界面设计,黑名单(白名单的添加与删除与黑名单同理,不再赘述),启用监听开关,定时拦截开关,及拦截模式选择等功能,下面就要实现来电管家最核心的功能,也就是拦截功能.   主要思路: 1.  制定拦截模式,这里主要有两个,一个是黑名单模式,也就是只拦截在黑名单中的号码:另一个就是白名单模式,拦截除了白名单以外的号码. 2.  根据用户自定义设置信息,制定正则表达式,判断拦截的标准. 3.  使用对应的类实现挂断电话的功能. 监听模块主要是利用service实现功能,为了实现电话挂

android项目 之 来电管家(8) ----- 添加开机自启动监听服务

现在大多数的应用都会开机自启动,来电管家更是如此,添加了开机自启动监听服务后,开机后即使你没有打开来电管家应用程序,一样可以拦截来电信息. 开机自启动Activity或Service的方法: 主要步骤: 1.  要有开机要启动的service或activity(这里开机要启动的当然就是ListenService了) 2. 编写一个BroadcastReceiver用以捕获ACTION_BOOT_COMPLETED这条广播,并在捕获之后启动我们要启动的Activity或service. BootC

android项目 之 来电管家(1) ----- 界面设计

因为需要,最近几天忙着写来电管家这个小软件,现在已经基本写的差不多了,基本的功能也都已实现,就剩下后续的完善了,而之前的记事本项目最近几天没写,但是肯定还是会完成的. 来电管家的基本功能,这里主要做的是拦截. 1.    添加黑白名单 2.    选择拦截模式 3.    启用拦截时间段 4.    拦截开关 主要功能,就是通过用户选择开启拦截,并选择拦截模式,这时就会启动后台监听服务,监听来电,判断是否挂断,并且,用户可以自由选择拦截时间段,也就是在该时间段内才启用监听服务. 先来看界面:  

android项目 之 来电管家(7) ----- 加载用户设置并启监听用服务

因为我们用的是SharedPreferences来存储用户设置信息,那么在初次进入来电管家时,会有一些默认的设置,后续根据用户的设置,更新设置信息文件的内容. 打开应用程序,首先启动的是ActivityGroupDemo,并默认显示黑名单界面,这时,需要在ActivityGroupDemo.java中添加代码,判断用户是否是第一次进入该应用,如果是第一次,则写入默认的设置信息. 这里判断用户是否为第一次进入该应用程序,采用的思路为: 1)因为SharedPreferences会在应用程序目录下的

android项目 之 来电管家(2) ----- ListView+CheckBox的使用

上一节,已经完成了来电管家的界面设计,那么下面就要实现具体的功能了,如何将添加的黑白名单显示呢?这里用到了ListView,那么,如果需要删除黑白名单呢,是一个个长按弹出菜单删除,还是将所的黑白名单清空呢,这都不符合用户的需求,往往,都是删除多个,这就有个问题了,如何在ListView中删除指定的多个item呢??可能大家想到了,要用到CheckBox. 先看图: 可以看出,当处于删除模式时,底部按钮也变成了删除与返回,中间也显示了当前共选择了多少项,而且在ListView的每一个Item右边也

android项目 之 来电管家(4) ----- 添加拦截时间段

在大多数的骚扰拦截类的软件中都会有定时拦截这个实用的的功能,其实,也不难实现. 看图: 在未选中启用时间段时,下面的两个开始时间和结束时间呈灰色状态,并且单击无响应,启用时间段后,下面则变成了可以单击的状态,通过单击可以弹出选择日期与时间的对话框,用于选择开始时间和结束时间. 主要思路: 1.  启用时间段,将下面的控件变成可获得焦点状态 2.  添加单击事件,弹出日期时间选择对话框 3.  选择时间,并显示在相应的位置 4.  通过SharedPrefresence将相关设置保存,以便下次启动

android项目自定义组合控件添加属性

首先要在values文件下新建立一个文件arrts.xml,这个文件就是用来说明键名称是做什么的,和值的类型 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SeetingView"> <attr name="up" format="string" /> &

android ListView内数据的动态添加与删除

main.xml 文件: [java] view plaincopy <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height=&q

电力项目十七--数据字典首页JS添加和删除表格

知识点:jQuery是一个JavaScript函数库. JS代码: function insertRows(){ //获取表格对象 var tb1 = $("#dictTbl"); var tempRow = $("#dictTbl tr").size();//获取表格的行数 var $tdNum = $("<td align='center'></td>"); $tdNum.html(tempRow); var $tdN