1.5 详情

点击通话记录的item,下面会弹出一些选项,例如,为该通话记录新建一个联系人,添加一个联系人,发送短信,或者查看通话详情。在此主要看通话详情的实现。

5.1 intent

添加通话详情的intent调用流程图如下,

CallLogListItemViewHolder的showActions方法主要逻辑如下,

1,设置界面可见,

inflateActionViewStub();
actionsView.setVisibility(View.VISIBLE);
actionsView.setAlpha(1.0f);

2,显示界面的详细信息,

updatePrimaryActionButton(show);

inflateActionViewStub方法主要逻辑如下,

1,添加新建联系人等的监听事件,

ViewStub stub = (ViewStub) rootView.findViewById(R.id.call_log_entry_actions_stub);
•••
callButtonView = actionsView.findViewById(R.id.call_action);
callButtonView.setOnClickListener(this); //拨号监听事件
videoCallButtonView = actionsView.findViewById(R.id.video_call_action);
videoCallButtonView.setOnClickListener(this); //视频通话监听事件
createNewContactButtonView = actionsView.findViewById(R.id.create_new_contact_action);
createNewContactButtonView.setOnClickListener(this);//新建联系人监听事件
addToExistingContactButtonView =actionsView.findViewById(R.id.add_to_existing_contact_action);
addToExistingContactButtonView.setOnClickListener(this); //添加到已有联系人监听事件
sendMessageView = actionsView.findViewById(R.id.send_message_action);
sendMessageView.setOnClickListener(this); //发送短信监听事件
detailsButtonView = actionsView.findViewById(R.id.details_action);
detailsButtonView.setOnClickListener(this); //通话详情监听事件
•••

2,调用bindActionButtons方法为监听事件添加intent,

bindActionButtons();

bindActionButtons方法逻辑如下,

1,调用IntentProvider的getReturnCallIntentProvider方法添加拨号的intent

callButtonView.setTag(IntentProvider.getReturnCallIntentProvider(number));

2,调用IntentProvider的getReturnVideoCallIntentProvider方法添加视频拨号的intent,

videoCallButtonView.setTag(IntentProvider.getReturnVideoCallIntentProvider(number));

3,调用IntentProvider的getCallDetailIntentProvider方法为通话详情添加intent,

detailsButtonView.setTag(IntentProvider.getCallDetailIntentProvider(rowId, callIds, null));

4,添加 新建一个联系人/添加到联系人  的intent,并确定是否显示这2个view,

if (info != null && UriUtils.isEncodedContactUri(info.lookupUri)) {createNewContactButtonView.setTag(IntentProvider.getAddContactIntentProvider(info.lookupUri, info.name, info.number, info.type, true /* isNewContact */));createNewContactButtonView.setVisibility(View.VISIBLE);
addToExistingContactButtonView.setTag(IntentProvider.getAddContactIntentProvider(info.lookupUri, info.name, info.number, info.type, false /* isNewContact */));addToExistingContactButtonView.setVisibility(View.VISIBLE);
} else {createNewContactButtonView.setVisibility(View.GONE);addToExistingContactButtonView.setVisibility(View.GONE);
}

如果通话号码可以在联系人里面查询到,当然就不显示了;否则就显示。

5, 调用IntentProvider的getSendSmsIntentProvider方法添加发送短信的intent,

sendMessageView.setTag(IntentProvider.getSendSmsIntentProvider(number));

在此主要论述的是通话详情,因此主要看IntentProvider的getCallDetailIntentProvider方法,如下,

return new IntentProvider() {@Override
public Intent getIntent(Context context) {Intent intent = new Intent(context, CallDetailActivity.class);// Check if the first item is a voicemail.if (voicemailUri != null) {intent.putExtra(CallDetailActivity.EXTRA_VOICEMAIL_URI, Uri.parse(voicemailUri));}
if (extraIds != null && extraIds.length > 0) {// 包含多条通话信息intent.putExtra(CallDetailActivity.EXTRA_CALL_LOG_IDS, extraIds);} else {
// If there is a single item, use the direct URI for it.    //单条通话信息intent.setData(ContentUris.withAppendedId(TelecomUtil.getCallLogUri(context), id));}return intent;
}
};

IntentProvider只是一个abstract类,有一个抽象的getIntent方法,

public abstract Intent getIntent(Context context);

在获取每个intent的方法中,都是返回一个匿名IntentProvider类,并且实现了getIntent方法。

这只是初始化步骤。

在CallLogAdapter的createCallLogEntryViewHolder方法中,会调用CallLogListItemViewHolder的create方法获取CallLogListItemViewHolder对象,会将mExpandCollapseListener监听器做为参数传入, CallLogListItemViewHolder的构造方法部分如下,

primaryActionView.setOnClickListener(mExpandCollapseListener);

并且在CallLogListItemViewHolder的onClick方法中,

1,当点击通话记录item时,

mExpandCollapseListener.onClick(primaryActionView);

就会回调CallLogAdapter的mExpandCollapseListener监听器的onClick方法。

这样才可以展示如下界面,

2,点击如上界面之后的onclick方法逻辑如下,

首先调用view的getTag方法获取IntentProvider对象,存储的时候就是调用setTag方法进行的。然后调用IntentProvider的getIntent方法获取Intent对象;最后调用DialerUtils的startActivityWithErrorToast方法完成处理。

final IntentProvider intentProvider = (IntentProvider) view.getTag();
if (intentProvider != null) {final Intent intent = intentProvider.getIntent(mContext);// See IntentProvider.getCallDetailIntentProvider() for why this may be null.if (intent != null) {DialerUtils.startActivityWithErrorToast(mContext, intent);}
}

DialerUtils的startActivityWithErrorToast方法主要逻辑如下,

1,处理拨号,

if ((IntentUtil.CALL_ACTION.equals(intent.getAction())&& context instanceof Activity)) {

2,处理其他请求,

context.startActivity(intent);

CallLogAdapter的mExpandCollapseListener是View.OnClickListener匿名实现类,其onClick方法如下,

if (viewHolder.getAdapterPosition() == mCurrentlyExpandedPosition) {// Hide actions, if the clicked item is the expanded item.viewHolder.showActions(false);
mCurrentlyExpandedPosition = RecyclerView.NO_POSITION;mCurrentlyExpandedRowId = NO_EXPANDED_LIST_ITEM;
} else {expandViewHolderActions(viewHolder);
}

如果显示菜单已打开,就调用CallLogListItemViewHolder的showActions方法将其隐藏;

如果未显示,就调用expandViewHolderActions方法显示,该方法如下,

viewHolder.showActions(true);
mCurrentlyExpandedPosition = viewHolder.getAdapterPosition();
mCurrentlyExpandedRowId = viewHolder.rowId;

也是调用CallLogListItemViewHolder的showActions方法将其显示。

CallLogListItemViewHolder的showActions方法有一个boolean参数,如果参数为true就显示,否则就隐藏。

通话记录分析 --- 通话详情 之一相关推荐

  1. android 通话记录分析,Android中联系人和通话记录详解(1)

    由于项目开发需要用到手机联系人和通话记录的详细信息,于是对联系人和通话记录的表及各字段以及具体实现做了详细分析. 首先,通过模拟器或者Root过的手机,在/data/data/com.android. ...

  2. 安卓随机通话记录_Android 通话记录

    查询通话记录 private static final String[] CALLLOGS_PROJECTION = new String[]{CallLog.Calls._ID, CallLog.C ...

  3. 一分钟告诉你通话记录能查到多久前的!

    案例:通话记录能查到一年前的吗? [朋友们,苹果通话记录可以查询到一年前的吗?保存时间大概是多久?] 通话记录是可以查到一定时间范围内的,不同的手机系统和运营商对于通话记录的保存时间也有所不同.通话记 ...

  4. 宿主手机联系人、通话记录、短信工具类(不断完善中。。。)

    对于系统手机的联系人.短信.通话记录的一些列的方法,着实需要总结下了 我公司最近在做跟这相关的项目,这个博客后续会完善这3个模块的工具类方法 1.查询contacts表获取contactId, 通过c ...

  5. 怎样查删掉的通话记录

    怎样查删掉的通话记录?通话记录对于我们很多的人来说只是一个手机上带的无用工具而已,但是有的时候,他真的是无用的,答案是否定的,有的时候我们会因为没保存联系人,而会急需要它. 那么若是在我们急需要它的时 ...

  6. 手机通话记录重复显示怎么处理_当手机出现陌生号码,且有通话记录后,我恐慌了...

    如果不是无意中点开通话记录,我不会发现这一个现象,到最后也没有人帮我解开.在发现了手机里存在陌生号码,且有聊天时长后,我担心自己的信息被泄露了.在前几天,手机突然弹出一个消息,关联一个电话号码.我一看 ...

  7. 这可能是全网唯一的免费数据恢复软件,支持电脑和手机恢复,支持通话记录,信息,图片,视频等数据恢复!

    自己不小心把电脑和手机中的文件给删除了,有个不少小伙伴遇到过吧,那么有没有方法找回这些删除的资料 有,你只需要今天小七提供的这款数据恢复软件,即可轻松的恢复手机和电脑中删除的文件 小七给大家提供了两个 ...

  8. 大数据项目(二)————某电信公司通话记录改造

    1.项目介绍 某互联网公司面向APP应用开发者提供的,以品牌互推.流量互导.广告分账为主的一站式服务平台. 将通话记录数据由原来的oracle系统改造成使用大数据架构解决方案.主要使用hbase做通话 ...

  9. request获取int类型的值_获取通话记录或通讯录的数量为负值

    安卓源码避坑指南5--获取通话记录或通讯录的数量为负值 通过蓝牙PBAP协议同步通讯录.通话记录时,想必对其数量大小也是很感兴趣的,因此一般的设计思路都是先获取到同步对象的总大小,然后再同步该对象的具 ...

最新文章

  1. POJ1466 最大点权独立集
  2. 阿里云配置tornado无法访问
  3. AtCoder AGC035D Add and Remove (状压DP)
  4. php热门标签,PHP显示最流行的标签
  5. HTML怎么让正方形转动,第十讲:html5中canvas实现正方体的动态旋转
  6. 小程序点击调转带参数_带你走遍苏大的每个角落,校园导览小程序上线!
  7. cloudstack java api_CloudStack API编程指引
  8. #20175201张驰 实验三 敏捷开发与XP实践
  9. SCCM2012系列之六,SCCM2012部署前的WDS准备
  10. 有很多种方法来解决八数码
  11. 如何用SolidWorks软件绘制三维模型?
  12. Android 自定义搜索框(带搜索图标、清除图标、语音图标)
  13. Windows 7 安装时候提示,无法更改启动项安装失败,以及msr分区
  14. unity -- 存档与读档
  15. 深度学习 GAN生成对抗网络-1010格式数据生成简单案例
  16. 如何入门现代控制理论
  17. 数模第五次作业:自己实现斯皮尔曼相关系数
  18. Verilog设计的原则和技巧和IP核的使用
  19. 645 - 2007通信协议报文解析
  20. 2023 小微支付服务商系统开源源码

热门文章

  1. 《BIO、NIO、AIO非阻塞通信实例》
  2. ASEMI代理FGH60N60SMD安森美ON原装原厂IGBT
  3. 批量删除-获取页面id-字符串拼接做法
  4. DNA Sorting(OpenJ_Bailian - 1007)
  5. 阿里元境携手西安博物院共创文旅元宇宙未来
  6. 无人驾驶/智能驾驶/环境感知
  7. 设计模式详解:建造者模式
  8. 新手跑通3D地图demo
  9. 快来看看这三款好用的数据可视化软件哪个戳中了你的心巴
  10. c语言等要空心梯形代码,C语言空心菱形 *号打印图形