极客学院Android12案例---案例2--通讯录

1.通讯录
  • 通讯录以数据库的形式存储在手机中
  • ContactsContract.CommonDataKinds.Phone.NUMBER和ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME分别是字段名
  • Manifest文件中写入权限
  • 在主activity中请求权限
  • 获取请求权限后接受onRequestPermissionsResult回调,来进行业务逻辑
    需要在
    1、创建业务逻辑类GetNumber
package com.fengray.ex039contacts;

import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.Toast;

public class GetNumber {
    public static String getNumber(Context context){
    //通讯录以数据库的形式存储在手机中,需要从数据库中获得结果集
       Cursor cursor= context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
       //创建用来接受电话号码和姓名
       String phonenumber,phoneName;
       //循环读取数据库的记录
       while (cursor.moveToNext()){   
       //根据记录集的索引来取值
           phonenumber=cursor.getString(cursor.getColumnIndex((ContactsContract.CommonDataKinds.Phone.NUMBER)));
           phoneName=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
           Log.d("JIAN", phoneName+":"+phonenumber);
       }
       return null;
    }

}

2、Manifest文件中写入权限

<uses-permission android:name="android.permission.READ_CONTACTS"/>
 <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

3、主activity

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    //回调方法,无论哪种结果,最终都会回调该方法,之后在判断用户是否授权,
    // 用户同意则调用 GetNumber.getNumber()方法,失败则会弹窗提示失败
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1005:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    GetNumber.getNumber(this);
                } else {
                    Toast.makeText(this, "获取联系人权限失败", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取手机通讯录读取权限
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS//通话录
                }, 1005);

    }
}

打印:
2020-08-11 16:07:47.950 13791-13791/com.fengray.ex039contacts D/JIAN: 王五:1 381-698-4258
2020-08-11 16:07:47.950 13791-13791/com.fengray.ex039contacts D/JIAN: 燕小六:1 586-542-5481
2020-08-11 16:07:47.951 13791-13791/com.fengray.ex039contacts D/JIAN: 李四:1 856-657-8587
2020-08-11 16:07:47.951 13791-13791/com.fengray.ex039contacts D/JIAN: 张三:1 861-485-2458

参考实例

2.封装模型及优化

文件结构

  • 1、GetNumber:数据模型加载
  • 2、PhoneInfo:数据模型
  • 3、MyAdapter:自定义适配器
  • 4、MainActivity:程序入口
  • 5、cell.xml:自定义布局
  • 6、main.xml:主布局

1、GetNumber:

package com.fengray.ex039contacts;

import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class GetNumber {
    //创建一个电话号码的集合
    public static List<PhoneInfo> lists=new ArrayList<PhoneInfo>();

    //创建获取电话号码的类方法
    public static String getNumber(Context context){
        //创建结果集
       Cursor cursor= context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
      //字符串姓名和号码
       String phonenumber,phoneName;
       while (cursor.moveToNext()){
            phonenumber=cursor.getString(cursor.getColumnIndex((ContactsContract.CommonDataKinds.Phone.NUMBER)));
           phoneName=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
           //创建数据模型
           PhoneInfo modelPhoneInfo=new PhoneInfo(phoneName, phonenumber);
           lists.add(modelPhoneInfo);
           Log.d("JIAN", modelPhoneInfo.getName()+":"+modelPhoneInfo.getPhoneNumber());
       }
        return null;
    }
}

2、PhoneInfo:

package com.fengray.ex039contacts;

public class PhoneInfo {
    private String name;
    private String phoneNumber;

    public PhoneInfo(String name, String phoneNumber) {
        this.name = name;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

3、MyAdapter

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;

public class MyAdapter extends BaseAdapter {
    private List<PhoneInfo> phoneInfoLists;
    private Context context;
    //创建一个布局文件,因为要作为参数被引用,上同
    private LinearLayout linearLayout;
    public MyAdapter(List<PhoneInfo> phoneInfoLists, Context context) {
        this.phoneInfoLists =  phoneInfoLists;
        this.context = context;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //加载linnearLayout,从上下文中获取布局转换器
//        LayoutInflater inflater=LayoutInflater.from(context);
//        //用转换器从layout布局文件中读取布局,别忘了强转
//        linearLayout=(LinearLayout) inflater.inflate(R.layout.cell,null);
//
//        //获取布局文件中的控件
//        TextView phoneName=linearLayout.findViewById(R.id.phoneName);
//        TextView phoneNumber=linearLayout.findViewById(R.id.phoneNumber);
//        //从集合中抽取模型对象,并读取对象中的属性
//        phoneName.setText(phoneInfoLists.get(position).getName());
//        phoneNumber.setText(phoneInfoLists.get(position).getPhoneNumber());

        //Log.d("JIAN", "getView: "+phoneInfoLists.get(position).getName());
        ViewHolder viewHolder;
        if (convertView==null){
            convertView=LayoutInflater.from(context).inflate(R.layout.cell, null);
            viewHolder=new ViewHolder();
            viewHolder.nametv=convertView.findViewById(R.id.phoneName);
            viewHolder.numbertv=convertView.findViewById(R.id.phoneNumber);

            viewHolder.nametv.setText(phoneInfoLists.get(position).getName());
            viewHolder.numbertv.setText(phoneInfoLists.get(position).getPhoneNumber());
            //存储一下covertView的标签
            convertView.setTag(viewHolder);
        }else {
            viewHolder=(ViewHolder) convertView.getTag();
            viewHolder.nametv.setText(phoneInfoLists.get(position).getName());
            viewHolder.numbertv.setText(phoneInfoLists.get(position).getPhoneNumber());
        }

        return convertView;
    }

    private static  class ViewHolder{
        TextView nametv;
        TextView numbertv;
    }
}

4、MainActivity

package com.fengray.ex039contacts;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private ListView lv;
    //需要是用adpter适配
    private MyAdapter adapter;

    //回调方法,无论哪种结果,最终都会回调该方法,之后在判断用户是否授权,
    // 用户同意则调用 GetNumber.getNumber()方法,失败则会弹窗提示失败
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1005:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    GetNumber.getNumber(this);
                    readList();
                } else {
                    Toast.makeText(this, "获取联系人权限失败", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取手机通讯录读取权限
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_CONTACTS//通话录
                }, 1005);


    }

    public void readList(){
        //获取list控件
        lv=findViewById(R.id.phoneList);
        //创建adapter适配器
        adapter=new MyAdapter(GetNumber.lists,this);//传入集合(联系人数据集合)
        //将list控件设置适配器
        lv.setAdapter(adapter);
    }
}

manifest

 <uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值