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

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

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);
           }
       });
*/
   }
}

错误提示:

04-21 10:20:45.194 28100-32606/? W/System.err: java.io.IOException: Connection refused

        at android.net.LocalSocketImpl.connectLocal(Native Method)

        at android.net.LocalSocketImpl.connect(LocalSocketImpl.java:290)

        at android.net.LocalSocket.connect(LocalSocket.java:130)

        at com.cleanmaster.hpsharelib.base.ipc.client.SocketBinderClient.TransferBufferClient(SocketBinderClient.java:114)

        at com.cleanmaster.hpsharelib.base.ipc.client.SocketBinderClient.transact(SocketBinderClient.java:72)

        at com.cleanmaster.hpsharelib.synipc.ICloudConfigGetter$Stub$Proxy.getBooleanValue(ICloudConfigGetter.java:283)

        at com.cleanmaster.hpsharelib.recommendapps.CloudConfigDataGetter.getBooleanValue(CloudConfigDataGetter.java:131)

        at com.cleanmaster.applocklib.ui.lockscreen.m.e(ClosureLogic.java:92)

        at com.cleanmaster.applocklib.ui.lockscreen.m.b(ClosureLogic.java:80)

        at com.cleanmaster.applocklib.core.a.a(AppLocker.java:223)

        at com.cleanmaster.applocklib.core.service.b.a(AppLockMonitor.java:752)

        at com.cleanmaster.applocklib.core.service.p.onAppStateChanged(ServiceWrapper.java:74)

        at com.cleanmaster.applocklib.core.service.j.run(AppLockMonitor.java:724)

04-21 10:20:47.394 1528-1635/? W/System.err: Commons.readAssetsFileLineString :cn2错误

    java.io.FileNotFoundException: cn2

        at android.content.res.AssetManager.openAsset(Native Method)

        at android.content.res.AssetManager.open(AssetManager.java:323)

        at android.content.res.AssetManager.open(AssetManager.java:297)

        at com.cleanmaster.hpsharelib.base.Commons.readAssetsFileLineString(Commons.java:1932)

        at com.cleanmaster.hpsharelib.base.Commons.getChannelId2(Commons.java:2122)

        at com.cleanmaster.hpsharelib.base.Commons.getChannelId2String(Commons.java:2103)

        at com.cleanmaster.kinfocreporter.e.x(CMInfocCommon.java:349)

        at com.cleanmaster.kinfoc.u.m(KInfocPublicDataGetter.java:155)

        at com.cleanmaster.kinfoc.t.b(KInfocPublicDataBuilder.java:71)

        at com.cleanmaster.kinfoc.t.a(KInfocPublicDataBuilder.java:27)

        at com.cleanmaster.kinfoc.o.a(KInfocClient.java:120)

04-21 10:20:50.624 28100-32211/? W/System.err:     at android.net.LocalSocketImpl.connectLocal(Native Method)

        at android.net.LocalSocketImpl.connect(LocalSocketImpl.java:290)

        at android.net.LocalSocket.connect(LocalSocket.java:130)

        at com.cleanmaster.hpsharelib.base.ipc.client.SocketBinderClient.TransferBufferClient(SocketBinderClient.java:114)

        at com.cleanmaster.hpsharelib.base.ipc.client.SocketBinderClient.transact(SocketBinderClient.java:72)

        at com.cleanmaster.hpsharelib.synipc.ICloudConfigGetter$Stub$Proxy.getBooleanValue(ICloudConfigGetter.java:283)

        at com.cleanmaster.hpsharelib.recommendapps.CloudConfigDataGetter.getBooleanValue(CloudConfigDataGetter.java:131)

        at com.cleanmaster.base.plugin.bh.invoke(CMDHostCommonImpl.java:415)

        at com.cm.plugincluster.spec.BaseCommander.invoke(BaseCommander.java:48)

        at com.cm.plugincluster.spec.CommanderManager.invokeCommand(CommanderManager.java:29)

        at com.cleanmaster.hpsharelib.cloudconfig.CloudConfigDataGetterProxy.getBooleanValue(CloudConfigDataGetterProxy.java:40)

        at com.cleanmaster.hpsharelib.cloudconfig.BoostCloudConfig.getBooleanValue(BoostCloudConfig.java:15)

        at com.cleanmaster.hpsharelib.cloudconfig.BoostCubeCloudConfig$Common.getBooleanValue(BoostCubeCloudConfig.java:30)

        at com.cleanmaster.boost.util.BoostCloudConfig$BoostPowerCloud.isOEMEnable(BoostCloudConfig.java:278)


正在回答

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

2回答

老师下载的课堂源码getdatafromsystemdemo,用你的代码MainActivity整个替换的源码中的MainActivity,可以正常运行出结果并且没有报错

http://img1.sycdn.imooc.com//climg/5cbd27e4000140d812960896.jpg

  • 慕运维0750787 提问者 #1
    是的,用另一个手机运行也没有问题,不闪退,可能是手机问题,谢谢。
    2019-04-23 11:29:52
irista23 2019-04-21 13:01:22

FileNotFoundException异常可能是权限问题引起的,Android6.0+需要用到动态权限,你或者把目标平台改成23以下或者参考教辅资料添加动态权限申请

http://img1.sycdn.imooc.com//climg/5cbbf9180001a90f24461232.jpg

  • 提问者 慕运维0750787 #1
    如果没有权限,怎么能读取通讯录呢?读取是成功的,能在LogCat中一条一条显示,只是通讯录全部读取结束之后才闪退的?
    2019-04-21 16:56:48
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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