4,导入导出
单卡的导入导出界面如下,
导出到SIM卡的过程界面如下,
在联系人主界面(PeopleActivity)点击右上角的导入导出菜单, 就会出现界面1, PeopleActivity 的onOptionsItemSelected方法对导入导出菜单的点击事件处理如下,
case R.id.menu_import_export: {
ImportExportDialogFragment.show(getFragmentManager(), areContactsAvailable(),
PeopleActivity.class);
return true;
ImportExportDialogFragment继承自AnalyticsDialogFragment,继承自DialogFragment,其static的show方法逻辑如下,
1,构造ImportExportDialogFragment对象,
final ImportExportDialogFragment fragment = new ImportExportDialogFragment();
2,显示DialogFragment,就是界面2,
fragment.show(fragmentManager, ImportExportDialogFragment.TAG);
在ImportExportDialogFragment的onCreateDialog方法中,会控制显示内容,对内容的点击监听事件分别处理如下,
1,从SIM卡中导入,
case R.string.import_from_sim: {
handleImportFromSimRequest(resId);
break;
}
2,从存储设备导入,
case R.string.import_from_vcf_file: {
handleImportRequest(resId);
break;
}
3,导出到SIM卡,
case R.string.export_to_sim: {
handleExportToSimRequest(resId);
break;
}
4,导出到存储设备
case R.string.export_to_vcf_file: {
Intent exportIntent = new Intent(SimContactsConstants.ACTION_MULTI_PICK,
Contacts.CONTENT_URI);
exportIntent.putExtra(SimContactsConstants.IS_CONTACT, true);
ContactListFilter filter = ContactListFilter.restoreDefaultPreferences(
•••
5,分享联系人
case R.string.share_visible_contacts: {
doShareVisibleContacts();
break;
}
这几个导入导出的过程几乎完全相同,就论述SIM卡导入导出过程。
4.1从SIM卡导入
从SIM卡导入联系人到本地是调用handleImportFromSimRequest方法,该方法调用流程图如下,
handleImportFromSimRequest方法逻辑如下,
1,手机上面有2张SIM卡,
if (MoreContactUtils.getEnabledSimCount() > 1) {
displayImportExportDialog(R.string.import_from_sim_select,null);
} else {
AccountSelectionUtil.setImportSubscription(getEnabledIccCard());
handleImportRequest(Id);
}
2,手机上面只有一张SIM卡,
handleImportRequest(Id);
其实,双卡和单卡的导入流程完全相同,只是双卡多了一些选择的过程,实质是完全相同的。
handleImportRequest方法如下,
AccountSelectionUtil.doImport(mActivity, resId, (size == 1 ? accountList.get(0) : null));
AccountSelectionUtil的doImport方法如下,
switch (resId) {
case R.string.import_from_sim: { //从SIM卡导入
doImportFromSim(context, account);
break;
}
case R.string.import_from_vcf_file: { // 从存储设备导入
doImportFromVcfFile(context, account);
break;
}
}
根据id分别进行处理, doImportFromSim方法如下,
Intent importIntent = new Intent(SimContactsConstants.ACTION_MULTI_PICK_SIM);
•••
context.startActivity(importIntent);
启动联系人界面(MultiPickContactActivity),加载SIM卡上面的所有联系人,然后选择导入的SIM卡联系人导入到本地。
4.2导出到SIM卡
将本地联系人可以通过调用handleExportToSimRequest方法导入到SIM卡,该方法如下,
1,如果是双卡,弹出界面进行选择,
displayImportExportDialog(Id, null).show();
2,如果是单卡,跳到联系人选择界面选择需要导出的联系人,
mExportSub = getEnabledIccCard();
Intent pickPhoneIntent = new Intent(SimContactsConstants.ACTION_MULTI_PICK,
Contacts.CONTENT_URI);
// do not show the contacts in SIM card
pickPhoneIntent.putExtra(AccountFilterActivity.KEY_EXTRA_CONTACT_LIST_FILTER,
ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
•••
mActivity.startActivityForResult(pickPhoneIntent, SUBACTIVITY_MULTI_PICK_CONTACT);
启动联系人界面(MultiPickContactActivity),加载本地的所有联系人,然后选择联系人,导出到SIM卡。