从零开始在安卓保存联系人到txt文件

最近爸爸需要我将联系人全部用纸写下来,老人家怕手机容易出问题,他的联系人就没了,保存在纸上最安全,怎么可能,要我写字是不可能的(滑稽脸),想了一下当然是搞个安卓软件保存一下,保存txt再打印,快速还不出错,好了说正题。

很久没有玩过安卓了,首先当然是安装流弊的IDE==》Android studio,话说迅雷下载是真的快,复制一下 Android studio的http下载链接,迅雷下载一下,5mb/s,672mb一分钟不到搞定,接下来当然是next,next,接下来会提示安装sdk,sdk不能保存在Android studio的安装目录下,需要新建目录,安装后运行自带demo,遇到问题,只是安装一些工具,IDE只需要你确认点一下就ok了,跑起demo,接下来就是真正的编程了。

界面很简单,就一个按钮


布局代码


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView android:id="@+id/lv_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <Button android:id="@+id/btn_contacts"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="导出联系人"/>
</LinearLayout>



设置按钮的监听事件

怎样获取联系人是我在随便网上找的,不要介意,为了只是快速开发小工具。
使用线程是因为操作比较耗时


mGetContactsButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        

        new Thread(new Runnable() {
            @Override
            public void run() {
                getContacts();
            }
        }).start();
}


//获取联系人 姓名与电话

private String[] getContacts() {
    final List<Contact> list=new LinkedList<>();
    //联系人的Uri,也就是content://com.android.contacts/contacts
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    //指定获取_id和display_name两列数据,display_name即为姓名
    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME
    };
    //根据Uri查询相应的ContentProvider,cursor为获取到的数据集
    Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null);
    int i = 0;
    if (cursor != null && cursor.moveToFirst()) {
        do {
            Long id = cursor.getLong(0);
            //获取姓名
            String name;
            name=cursor.getString(1);
            String number = "";

            //指定获取NUMBER这一列数据
            String[] phoneProjection = new String[] {
                    ContactsContract.CommonDataKinds.Phone.NUMBER
            };
            //根据联系人的ID获取此人的电话号码
            Cursor phonesCusor = this.getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    phoneProjection,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id,
                    null,
                    null);

            //因为每个联系人可能有多个电话号码,所以需要遍历
            if (phonesCusor != null && phonesCusor.moveToFirst()) {
                do {
                    number +="\n                    " +phonesCusor.getString(0);
                }while (phonesCusor.moveToNext());
                list.add(new Contact(name,number));
            }

        } while (cursor.moveToNext());
    }
    Collections.sort(list);
    String[] arr=new String[list.size()];
    int index=0;
    for (Contact contact:list)
        arr[index++]=contact.toString();
    writeFile(list);

    return arr;
}


//写入文件保存在根目录下面
public void writeFile(List<Contact> list){
        int index=0;
        String filename = Environment.getExternalStorageDirectory()+"/联系人.txt";
        FileOutputStream outputStream;
        try {
            new File(filename);
            outputStream=new FileOutputStream(filename);
//            outputStream = openFileOutput(filename, MODE_PRIVATE);

            Log.e("test",filename);
           for(Contact contact:list)
              outputStream.write(("\n序号"+(++index)+"\n"+contact.toString()).getBytes());

            Log.e("path",filename);
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }



    }
}



//conmtact是联系人的表示,改变tostring就可以改变输出格式
class Contact implements Comparable<Contact> {
    String name;
    String number;
    public Contact(String name,String number){
        this.number=number;
        this.name=name;
    }

    @Override
    public String toString() {
        return "\n"+"姓名:"+name+"\n"+"电话号码: "+number+"\n";
    }


    @Override
    public int compareTo(@NonNull Contact contact) {
        return this.name.compareTo(contact.name);
    }



}

最后当然是权限


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

高版本android可能需要自己去设置应用的权限,我的就是。

低版本应该是不需要的。


运行结果


从零开始在安卓保存联系人到txt文件







文件结果



从零开始在安卓保存联系人到txt文件