文档章节

android: 用ContentResolver读取自己应用的短信和手机通话记录(15)

f
 flyqilong
发布于 2016/01/24 20:42
字数 1185
阅读 60
收藏 0
//查询:   
//public final Cursor query(Uri uri, String[] projection,   
           String selection, String[] selectionArgs, String sortOrder);   
//新增   
//public final Uri insert(Uri url, ContentValues values)       
//更新   
/public final int update(Uri uri, ContentValues values, String where,   
             String[] selectionArgs)   
//删除   
//public final int delete(Uri url, String where, String[] selectionArgs)

//读取自己应用的短信记录程序

//读取手机内的短信内容,使用BaseAdapter适配器
public class MainActivity extends Activity {
	private ListView listview;
	private TextView empty;
	private Cursor cursor;
	private MybaseAdapter adapter;
	private ContentResolver resolver;
	// 短信数据库放在:手机的内存,/data/data/con.android.providers.telephony/databases/mmssms.db
	private String uri = "content://sms";// 对外暴露的短信格式
	private List<Map<String, String>> smsList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listview = (ListView) this.findViewById(R.id.listView_main_smslist);
		empty = (TextView) this.findViewById(R.id.text_main_empty);
		listview.setEmptyView(empty);
		// 内容提供者获取数据库操作链接和数据库内的数据
		// 通过Context类获取ContentResolver
		resolver = getContentResolver();
		//resolver.query(uri, projection, selection, selectionArgs, sortOrder)
		//参数projection:数据库的字段;selection:sql语句;selectionArgs:想让sql插入更新等传入的内容   sortOrder:排序
		cursor = resolver.query(Uri.parse(uri), new String[] { "_id",
				"address", "body", "date", "type" }, null, null, null);
		smsList = cursorToList(cursor);
		// 建一个baseAdapter类
		adapter = new MybaseAdapter(smsList);
		listview.setAdapter(adapter);

	}

	public List<Map<String, String>> cursorToList(Cursor cursor2) {
		List<Map<String, String>> list = new ArrayList<Map<String, String>>();
		while (cursor2.moveToNext()) {// 注意:这里是循环每一行的数据
			Map<String, String> smsItem = new HashMap<String, String>();
			for (int i = 0; i < cursor2.getColumnCount(); i++) {// 这里是循环每一行的列数
				smsItem.put(cursor2.getColumnName(i), cursor2.getString(i));// 键:key:存储每一行的字段,value:值就是内容
			}
			list.add(smsItem);
		}
		cursor2.close();
		return list;
	}

	class MybaseAdapter extends BaseAdapter {
		private List<Map<String, String>> smsList;

		public MybaseAdapter(List<Map<String, String>> smsList) {
			this.smsList = smsList;
		}

		@Override
		public int getCount() {
			return this.smsList.size();
		}

		@Override
		public Object getItem(int position) {
			return this.smsList.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if (convertView == null) {
				holder = new ViewHolder();
				convertView = getLayoutInflater().inflate(
						R.layout.item_listview, null);
				TextView text_address = (TextView) convertView
						.findViewById(R.id.text_item_address);
				TextView text_body = (TextView) convertView
						.findViewById(R.id.text_item_body);
				TextView text_date = (TextView) convertView
						.findViewById(R.id.text_item_date);
				ImageView image_type = (ImageView) convertView
						.findViewById(R.id.imageView_item_icon);

				holder.text_address = text_address;
				holder.text_body = text_body;
				holder.text_date = text_date;
				holder.image_type = image_type;
				convertView.setTag(holder);
			} else {
				holder = (ViewHolder) convertView.getTag();
			}
			// 设置UI控件的内容
			holder.text_address.setText(this.smsList.get(position).get(
					"address"));
			holder.text_body.setText(this.smsList.get(position).get("body"));
			long mills = Long.parseLong(this.smsList.get(position).get("date")
					.toString());
			SimpleDateFormat adf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			holder.text_date.setText(adf.format(new Date(mills)));
			int type = Integer.parseInt(this.smsList.get(position).get("type")
					.toString());
			switch (type) {
			case 1:
				holder.image_type.setImageResource(R.drawable.file);

				break;
			case 2:
				holder.image_type.setImageResource(R.drawable.folder);
				break;
			}
			return convertView;
		}

		class ViewHolder {
			private TextView text_address;
			private TextView text_body;
			private TextView text_date;
			private ImageView image_type;
		}
	}
}
//主布局
 <ListView
        android:id="@+id/listView_main_smslist"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

    <TextView
        android:id="@+id/text_main_empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="#00f"
        android:textSize="24sp"
        android:gravity="center"
        android:text="暂无短信信息!" />
    //适配器的布局
      <ImageView
        android:id="@+id/imageView_item_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/text_item_address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="30dp"
        android:layout_toRightOf="@+id/imageView_item_icon"
        android:text="TextView" />

    <TextView
        android:id="@+id/text_item_body"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView_item_icon"
        android:layout_alignLeft="@+id/text_item_address"
        android:text="TextView" />

    <TextView
        android:id="@+id/text_item_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="TextView" />   
        
 //读取电话的数据库记录的程序
 public class MainActivity extends Activity {
	private ListView listView;
	private TextView empty;
	private Cursor cursor;
	private SimpleAdapter adapter;
	private SimpleCursorAdapter cursorAdapter;
	private ContentResolver resolver;
	// 电话日志数据库放在:手机的内存,/data/data/con.android.providers.contacts/databases/contacts2.db
	// private String uri = "content://call_log//calls";//这个也得
	private String uri = "content://call_log/calls";// 对外暴露的电话记录格式,给外部程序调用

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView) this.findViewById(R.id.listView_main_calllist);
		empty = (TextView) this.findViewById(R.id.text_main_empty);
		listView.setEmptyView(empty);
		// 内容提供者获取数据库操作链接和数据库内的数据
		// 通过Context类获取ContentResolver
		resolver = getContentResolver();
		cursor = resolver.query(Uri.parse(uri), new String[] { "_id", "number",
				"date", "type" }, null, null, null);
		// 第一种:用SimpleAdapter
		// 格式化日期
		// SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		// List<Map<String, String>> data = new ArrayList<Map<String,
		// String>>();
		// while (cursor.moveToNext()) {
		// String number = cursor.getString(cursor.getColumnIndex("number"));
		// long mills = cursor.getInt(cursor.getColumnIndex("date"));
		// String date = sd.format(new Date(mills));
		// String type = cursor.getString(cursor.getColumnIndex("type"));
		// Map<String, String> itemMap = new HashMap<String, String>();
		// itemMap.put("number", number);
		// itemMap.put("date", date);
		// itemMap.put("type", type);
		// data.add(itemMap);
		// }
		//
		// adapter = new SimpleAdapter(this, data, R.layout.item_listview,
		// new String[] { "number", "date", "type" }, new int[] {
		// R.id.text_item_number, R.id.text_item_date,
		// R.id.text_item_type });
		// listView.setAdapter(adapter);

		// 第二种用:SimpleCursorAdapter
		cursorAdapter = new SimpleCursorAdapter(this, R.layout.item_listview,
				cursor, new String[] { "number", "date", "type" }, new int[] {
						R.id.text_item_number, R.id.text_item_date,
						R.id.text_item_type },
				cursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);// 观察者
		listView.setAdapter(cursorAdapter);
	}
}
 //主布局文件
     <ListView
        android:id="@+id/listView_main_calllist"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

    <TextView
        android:id="@+id/text_main_empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textColor="#00f"
        android:textSize="24sp"
        android:gravity="center"
        android:text="暂无通话记录信息!" />
        
//SimpleAdapter自定义的布局
 <TextView
        android:id="@+id/text_item_number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <TextView
        android:id="@+id/text_item_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <TextView
        android:id="@+id/text_item_type"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />


© 著作权归作者所有

f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
私信 提问
关于Android中Contact API的讲解

今日学习任务:实现读取手机中所有联系人的主要信息(名称和联系电话),并以ListView显示 涉及的主要内容:1) Contact API的结构和使用方法 2) ContentProvider组件作用,URI概念及使用方法...

大爱rails
2013/07/04
0
0
使用ContentProvider

一. 了解 ContentProvider 1. 什么是ContentProvider 让开发者在多个应用中操作数据,如存储,修改删除 的唯一方式 ,一个ContentProvider 实现 了下面的接口。 ContentProvider.insert( Ur...

chuiyuan
2014/04/24
0
0
谷歌宣布将加密 Android 9.0 用户的云端备份

Android 9.0 Pie带来了手势操纵、Android Dashboard、夜间模式、自适应电池用量、Shush勿扰功能与界面调整等诸多新特性。不过这并不是全部,谷歌还在不断为Android 9.0开发更多的新功能。 今...

达尔文
2018/10/15
1K
1
谷歌宣布为Android 9.0用户提供云端加密

Android 9.0 Pie带来了手势操纵、Android Dashboard、夜间模式、自适应电池用量、Shush勿扰功能与界面调整等诸多新特性。不过这并不是全部,谷歌还在不断为Android 9.0开发更多的新功能。 今...

linux-tao
2018/10/27
0
0
android 回拨电话删除手机中的私人号码

以前试过使用删除最近一条通话记录,发现会把手机里面的记录也给删除,不知道是代码写的有问题还是别的原因: ContentResolver resolver = context.getContentResolver(); Cursor cursor = r...

深圳_小白菜
2014/04/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java的战争

本文来自微信公众号: 金捷幡(ID:jin-jiefan) ,作者:金捷幡,封面:拉里·埃里森(东方IC) 2019年5月,彻底撕破脸的特朗普掀起对华为的战争,谷歌被迫吊销了华为的Android授权。开源软...

Java领航员
38分钟前
1
0
超详细的LM3414MRX/NOPB规格参数介绍就在这里

超详细的LM3414MRX/NOPB规格参数介绍就在这里 描述 LM3414和LM3414MRX/NOPB是具有1-A 60 W(1)共阳极功能的恒流降压LED驱动器。它们适用于驱动单串3-W HBLED,效率高达96%。它们可接受4.5...

不能吃肉的仙女
44分钟前
1
0
Eclipse国内镜像源配置方法

Table of Contents 我们在国内从官网下载Eclipse以及插件非常慢,那么,有没有方法变快呢? 有,那就是使用国内的公开镜像源替换官方源。 1 下载Eclipse 首先,我们看一个链接地址: http:/...

求神
今天
5
0
java 请求服务

一.第一种基于java web http 请求服务,必须用tomcat 容器启动才能对外提供服务 在maven 工程中pox 文件导入jar <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>h......

zaolonglei
今天
5
0
HDFS工作机制——自开发分布式数据采集系统

需求描述: 在业务系统的服务器上,业务程序会不断生成业务日志(比如网站的页面访问日志) 业务日志是用log4j生成的,会不断地切出日志文件,需要定期(比如每小时)从业务服务器上的日志目...

须臾之余
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部