联系人读取成功,读取结束后,程序闪退?

联系人读取成功,读取结束后,程序闪退?

联系人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

登陆购买课程后可参与讨论,去登陆

1回答
irista23 2019-04-21 13:02:56

你可以参考这里给你的回复排除下权限问题

http://class.imooc.com/course/qadetail/110012

  • 提问者 慕运维0750787 #1
    我运行的两个真机是API 18、19,不存在权限问题
    2019-04-23 10:06:49
  • irista23 回复 提问者 慕运维0750787 #2
    你看下这里http://class.imooc.com/course/qadetail/110584
    2019-04-23 11:21:26
  • 提问者 慕运维0750787 #3
    权限问题已经排除了,因为已经加上动态申请权限代码。而且LogCat能打TAG出来,把所有通讯录全部TAG出来后才闪退的?共两个真机,其中一个运行正常不会闪退
    2019-04-23 15:50:46
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师