联通用户可登录中国联通APP查询通话详单,打开中国联通APP点击“服务>查询>话费/详单>详单查询”即可查询。
温馨提示:目前可提供近6个月(含当月)的详单信息查询。
您好,目前运营商为用户保留最新六个月的通话记录供用户查询,时间过久的是不能查询到的。
用户可以通过营业厅,运营商的网上营业厅等渠道查询通话记录的,以电信为例,通过电信网上营业厅查询电信的通话记录的步骤如下:
1、首先打开浏览器,输入中国电信网上营业厅然后搜索,然后点击进入中国电信网上营业厅并且登录自己的电信手机号。
2、登录后,进入个人中心,然后左侧有业务导航,点击通话短信详单查询
3、然后根据提示获取相应的验证码就可以查询通话记录了,如图
联通手机卡用户可通过以下方式查询通话记录:
1、登录中国联通网上营业厅,点击菜单“查询--话费/详单--通话详单”查询通话详单。
2、登录中国联通APP,点击菜单“服务--查询--话费/详单--详单查询”查询通话详单。
3、机主本人带上有效证件原件到当地联通自有营业厅查询通话详单。
温馨提醒:目前可提供最近六个月(含本月)的详单信息查询。
最近采用phonegap做一个APP,需要在应用内实现拨打 *** ,通话结束後能反馈通话相关状态,查看了一番phonegap官方文档,似乎没有跟 *** 相关的api,在互联网上也大概搜了一下,好像没找到相关的内容。其实html5是支持直接在网页上拨打 *** 的,只要加入如下html代码即可:
[html] view plaincopy
打 *** a href="tel:10086" 移动 *** /a
发短信a href=" *** s:10086" 发短信/a
但这中方式只能实现拨打 *** 和发送短信,不能反馈结果,比如我想在应用能实现拨打 *** ,通话结束後自动保存通话的 *** 号码、通话时间、时长等,默认的html功能就不能满足了。
phonegap官方不提供的功能,我们只有自己通过开发插件了实现了
下面我们通过代码来简单介绍下phonegap插件开发步骤:
一、定义 *** 插件API
[javascript] view plaincopy
var Phone = function() {
};
Phone.prototype.call = function (successCallback, failureCallback,number) {
cordova.exec(successCallback, failureCallback, "Phone", "call", [number]);
};
window.Phone = new Phone();
上面的代码我们定义了一个Phone插件,插件有一个call API,我们传入
[javascript] view plaincopy
successCallback
failureCallback
分别做为 *** 拨打成功和失败的回调函数
传入
[javascript] view plaincopy
number
做为 *** 号码
在 *** 裏边调用
phonegap的cordova.exec()
[javascript] view plaincopy
cordova.exec(successCallback, failureCallback, "Phone", "call", [number]);
就是在这个 *** 裏将执行到native端的功能调用
最後我们new一个Phone对象,把他附件到window对象上,方便以後调用。
这样,插件的 *** 代码完成。
二、native端代码(以android平台为例)
先直接上代码
[java] view plaincopy
package com.juhuibao.PhoneGapPlugin;
import java.util.Date;
import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.apache.cordova.api.PluginResult;
import org.json. *** ONArray;
import org.json. *** ONException;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.CallLog.Calls;
import android.telephony.PhoneNumberUtils;
public class Phone extends CordovaPlugin {
private static final int PHONE_CALL = 0; // 拨打 ***
private static final int PHONE_ABORT = 1; // 挂断 ***
private Date start_time;
private CallbackContext callbackContext;
private String phonenumber;
@Override
public boolean execute(String action, *** ONArray args, CallbackContext callbackContext) throws *** ONException {
try{
this.callbackContext = callbackContext;
if ("call".equals(action)) {
this.phonenumber=args.getString(0);
this.call(args.getString(0),callbackContext);
return true;
}
if ("abort".equals(action)) {
this.abort(callbackContext);
return true;
}
return false;
}
catch(Exception e){
callbackContext.error(e.getMessage());
}
return false;
}
//拨打 ***
private void call(String phonenumber, CallbackContext callbackContext) {
if (phonenumber != null phonenumber.length() 0) {
if(PhoneNumberUtils.isGlobalPhoneNumber(phonenumber)){
Intent i = new Intent();
i.setAction(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:"+phonenumber));
start_time=new Date();
this.cordova.startActivityForResult(this, i,PHONE_CALL);
}
else{
callbackContext.error(phonenumber+"不是有效的 *** 号码。");
}
} else {
callbackContext.error(" *** 号码不能为空.");
}
}
//中断 ***
private void abort(CallbackContext callbackContext) {
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
Date end_time=new Date();
if (resultCode == Activity.RESULT_OK) {
if (requestCode == PHONE_CALL) {
this.callbackContext.error("未知状态");
}
}
else if (resultCode == Activity.RESULT_CANCELED) {
try{
if (requestCode == PHONE_CALL) {
long duration=GetLastCallDuration();
PhoneResult result=new PhoneResult();
result.setNumber(Phone.this.phonenumber);
result.setStartTime(Phone.this.start_time);
result.setEndTime(end_time);
result.setDuration(duration);
this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result.to *** ONObject()));
}
}
catch(Exception e){
this.callbackContext.error(e.getMessage());
}
}
else {
this.callbackContext.error("其他错误!");
}
}
long delayTime=0;
long timeOut=2000;
long GetLastCallDuration() throws InterruptedException{
Activity activity = this.cordova.getActivity();
Cursor cursor = activity.getContentResolver().query(Calls.CONTENT_URI,
new String[] {Calls.NUMBER,Calls.DATE, Calls.DURATION, Calls.TYPE, Calls.DATE },
"number=?and type=?",
new String[]{this.phonenumber,"2"},
Calls.DEFAULT_SORT_ORDER);
activity.startManagingCursor(cursor);
boolean hasRecord = cursor.moveToFirst();
if (hasRecord) {
long endTime=cursor.getLong(cursor.getColumnIndex(Calls.DATE));
Date date = new Date(endTime);
long duration = cursor.getLong(cursor.getColumnIndex(Calls.DURATION));
long dif=this.start_time.getTime()-date.getTime();
long second=dif/1000;
if(second2second-2){
return duration;
}else{
if(delayTime=timeOut){
return 0;
}
Thread.sleep(200);
delayTime+=200;
return GetLastCallDuration();
}
}else{
if(delayTime=timeOut){
return 0;
}
Thread.sleep(200);
delayTime+=200;
return GetLastCallDuration();
}
}
}
然後调用具体实现拨打 *** 功能的 *** call *** ,在call *** 内我们首先判断 *** 号码合法性,不合法直接调用callbackContext.error("不是有效的 *** 号码。"),这个 *** 将触发 *** 端的error回调函数执行,并传入一个字符串参数,比如以上的failureCallback
如果 *** 号码合法则弹出呼叫界面,如下代码
[java] view plaincopy
if(PhoneNumberUtils.isGlobalPhoneNumber(phonenumber)){
Intent i = new Intent();
i.setAction(Intent.ACTION_CALL);
i.setData(Uri.parse("tel:"+phonenumber));
start_time=new Date();
this.cordova.startActivityForResult(this, i,PHONE_CALL);
}
else{
callbackContext.error(phonenumber+"不是有效的 *** 号码。");
}
在代码中我们通过变量start_time记录开始时间,然後使用this.cordova.startActivityForResult(this, i,PHONE_CALL);启动Activity。
在终止拨号或挂断 *** 时将执行onActivityResult *** ,我们将在此 *** 内实现通话状态信息的反馈。主要看一下这段代码
[java] view plaincopy
else if (resultCode == Activity.RESULT_CANCELED) {
try{
if (requestCode == PHONE_CALL) {
long duration=GetLastCallDuration();
PhoneResult result=new PhoneResult();
result.setNumber(Phone.this.phonenumber);
result.setStartTime(Phone.this.start_time);
result.setEndTime(end_time);
result.setDuration(duration);
this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result.to *** ONObject()));
}
}
catch(Exception e){
this.callbackContext.error(e.getMessage());
}
}
不管 *** 有没有接通,resultCode总是等於Activity.RESULT_CANCELED。
我们通过GetLastCallDuration() *** 获得通话时长,原理就是读取通话记录裏边的duration字段,由於通话刚结束时通话记录可能还没出现记录,所以我们要反复调用该 *** ,直到有记录或到超时时间为止。
取得了时长我们通过this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result.to *** ONObject()));把结果反馈给 *** 端。
附 PhoneResult.java
[java] view plaincopy
package com.juhuibao.PhoneGapPlugin;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.json. *** ONException;
import org.json. *** ONObject;
public class PhoneResult {
private String number = "";
private Date startTime;
private Date endTime;;
private long duration = 0;
public *** ONObject to *** ONObject() throws *** ONException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss:S");
return new *** ONObject(
"{number:" + *** ONObject.quote(number) +
",startTime:" + *** ONObject.quote(sdf.format(startTime)) +
",endTime:" + *** ONObject.quote(sdf.format(endTime)) +
",duration:" + duration + "}");
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
}
这样native端的代码完成。
三、客户端调用
[javascript] view plaincopy
window.Phone.call(function (obj) { alert( *** ON.stringify(obj));
}, function (err) { alert(err); }, "13401100000");
四、配置插件
在config.xml文件中注册插件
[html] view plaincopy
plugin name="Phone" value="com.juhuibao.PhoneGapPlugin.Phone"/
在AndroidManifest.xml文件中增加权限
[html] view plaincopy
uses-permission android:name="android.permission.CALL_PHONE" /
uses-permission android:name="android.permission.READ_CALL_LOG" /
uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /
uses-permission android:name="android.permission.READ_PHONE_STATE"/
您好,通话记录需通过运营商查通话内容呢。
可以利用运营商APP查询,也可以拨打 *** 至运营商,或者带上身份证,亲自去营业厅查询。
以利用移动运营商APP查询为例,1、打开中国移动,进入首页向左滑动。
2、点击详单查询,进行身份认证。
3、选择查询的时间,点击通话详单。
4、打开后即可查看记录。
中国移动怎样打电话清单? 第一步:进入中国移动网上营业厅,网址:第二步:输入你的手机号码和服务密码并登陆。如果不知道服务密码可以打电话10086客服重置密码,用动态密码来登陆。第三步:登陆成功以后点击...
QQ怎么查看群通话回放 用鼠标点击查看按钮。就可以查看到之前录制下来的通话音频数据,双击打开后就可以回放微信或QQ语音通话内容。打开软件,登陆自己的QQ号码;电脑上安装并运行“楼月语音聊天录音软件”;...
苹果通话记录怎么p图 首先要把你手机所有的通话记录截一张图,把需要截图的需要p的这张截图。发到你的QQ我的电脑上。在电脑上下载此照片以后用ps打开,因为都是宋体字,但是大小可能会有变化。所以建议你把想...
你好我的华为手机通话记录怎么找不见了? 华为找回通话记录的方法是:首先打开手机桌面的“设置”,点击上方的华为账号,在账号中心选择云空间。然后在云空间里面,选择云备份。将手机联上网,再点击打开“设置”。...
父母该不该翻查孩子的聊天记录,和通话记录? 当然不应该翻查!每个人都是有隐私的!但是如果你还是未成年的,父母就有一定的权利监管你,因为你出了什么事,父母都是要负责任的! 很赞成你说那个人是脑残的! 其...
vivo手机单卡通话记录前面显示卡1怎么弄点掉? 通话记录显示卡1,说明你储存的联系人全部都是存在手机卡里的,你可以在设置里面把电话号码从卡1里全部导出至手机里,这样手机卡里面就没有存的电话号码了,都...