联系人读取成功,读取结束后,程序闪退?
联系人Log全部出现之后,程序就闪退,当时没有错误提示,等几秒钟出来的提示,但每次错误提示都不一样(怀疑不是这个程序运行的错误提示)。几种错误提示如下:
错误提示1:W/System.err: Commons.readAssetsFileLineString :cn2
java.io.FileNotFoundException: cn2
at android.content.res.AssetManager.openAsset(Native Method)
错误提示2:04-21 10:20:45.194 28100-32606/? W/System.err: java.io.IOException: Connection refused
at android.net.LocalSocketImpl.connectLocal(Native Method)
源程序:package com.example.getdatafromsystemdemo;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.MimeTypeMap;
public class MainActivity extends AppCompatActivity {
/*获取系统短信内容需要Manifest.xml添加以下权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
**/
/* 读取系统联系人信息需要Manifest.xml添加以下权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>*/
/*添加通讯录联系人需要Manifest.xml添加以下权限
* <uses-permission android:name="android.permission.WRITE_CONTACTS"/>*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.sms_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1.获取内容处理者
ContentResolver resolver = getContentResolver();
// 2.查询方法
// sms:short message service
// content://sms/inbox 收件箱
// content://sms/sent 发件箱
// content://sms/draft 草稿箱
Uri uri = Uri.parse("content://sms");
Cursor cursor = resolver.query(uri, null, null, null, null);
// 3.解析Cursor
// 遍历Cursor
while (cursor.moveToNext()) {
String str = "";
// 获得短信发件人地址(手机号),先通过列名获得其列索引index,再通过其列索引,获得该列值
String address = cursor.getString(cursor.getColumnIndex("address"));
str += address + ":";
// 获得短信内容
String body = cursor.getString(cursor.getColumnIndex("body"));
str += body;
/*
// 遍历该行记录的各列
for(int i=0;i<cursor.getColumnCount();i++){
str+=cursor.getString(i)+" ";
}*/
// 打印该行记录所有数据
Log.e("TAG", str);
}
}
});
findViewById(R.id.read_contact_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentResolver resolver = getContentResolver();
/* 手机联系人的姓名和其它内容(如电话号码)由不同的contentProvider操作的
* 两张表最直接的联系是id,即通过姓名表某行的ID,来查询其它内容所在表对应的(电话号码)*/
// 查询通讯录联系人
Cursor cursor1 = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
// 该遍历能查到姓名,无法查到电话号码,两个内容所属不同表
while (cursor1.moveToNext()) {
String msg = "";
// ContactsContract.Contacts.DISPLAY_NAME 姓名
// ContactsContract.Contacts._ID 主键
String name = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String _id = cursor1.getString(cursor1.getColumnIndex(ContactsContract.Contacts._ID));
msg += "name:" + name + ",ID:" + _id;
//已解析的另一Uri:ContactsContract.CommonDataKinds.Phone.CONTENT_URI
// 查询该ID对应的手机号,获得cursor2
String selections = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?";
Cursor cursor2 = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
selections,
new String[]{_id},
_id);
// 遍历该id对应的所有Phone.number
while (cursor2.moveToNext()) {
String number = cursor2.getString(cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
msg += ",number:" + number;
}
/*// 遍历每一行的所有列
for(int j=0;j<cursor1.getColumnCount();j++){
msg+=cursor1.getString(j);
}*/
Log.e("TAG", msg);
}
}
});
/*findViewById(R.id.add_contact_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentResolver resolver = getContentResolver();
ContentValues values = new ContentValues();
//1.往一个ContentProvider中插入空的ContentValues,获得新生的id
Uri uri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
// 解析获得新生的id
long id = ContentUris.parseId(uri);
//2.利用刚刚生成的id分别组合姓名和电话号码往另一个ContentProvider中插入数据
*//* 插入姓名,姓名需要和id绑定*//*
values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, "Tommy");
// 绑定姓名和ID
values.put(ContactsContract.RawContacts._ID, id);
// 指定姓名数据类型
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
resolver.insert(ContactsContract.Data.CONTENT_URI, values);
*//*插入电话号码,电话号码需要和ID绑定*//*
// 清空ContentValues对象
values.clear();
values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"13100000000");
// 绑定号码和ID
values.put(ContactsContract.RawContacts._ID,id);
// 指定该行数据类型
values.put(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
// 指定联系方式类型为:手机号码
values.put(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
resolver.insert(ContactsContract.Data.CONTENT_URI,values);
}
});
*/
}
}
正在回答 回答被采纳积分+1
- 参与学习 人
- 提交作业 307 份
- 解答问题 1613 个
本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星