从零开始在安卓保存联系人到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可能需要自己去设置应用的权限,我的就是。
低版本应该是不需要的。
运行结果
文件结果