pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话(补充效果录像图)

pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话

经过几年的沉淀,我们已经将整个这个需求背景的架构与解决方案进行了高级的研发,将在下一个文档中进行概述。

电脑通过网页通过控制usb的安卓手机打电话,能快速的解决对接到常见的web系统上,一定程度上实现了效率的提升,并

打通了web系统客服服务环节。但要深度永久使用,问题也很明显,比如以下6点

1、客服人员只需要打电话,不应该知道看到客户的真实手机号码,而这个架构下能看到号码和通话记录。

2、客服人员需要能接电话,需要网页来电弹屏。

3、多个来电时,自动分配坐席,同一客户二次来电自动分配上次坐席。

3、通话录音的集中管理,打电话的绩效考核,管理员录间回放。

4、人员多起来,人员管理,权限,手机管理维护的麻烦,成本也上来了,安卓的兼容,操作系统维护等。

5、跨局域网的使用。

6、方便功能多的API对接到客户管理系统等各种。

本人将在下一篇文章中详细介绍,PHP+IPBPX的网页呼叫管理系统,从原来每人一台手机,变成每人或几个共用一条线路,一条线路只需要一张手机卡而非一台手机。耳机也从手机耳机换成了专业的电脑耳机。不再有烦人的电脑和USB维护,管理员可以集中式的对客服工作进行查看和管理。

正文继续:

 效果预览

分析与介绍

基于js/javascript通过usb数据线控制安卓手机打电话拔号或挂断的需求即浏览器通过usb数据线控制安卓手机打电话拔号或挂断的一键拔号。

技术构架: PC电脑(google浏览器,firefox浏览器,360浏览器) 的js/javascripts通过usb数据线连接安卓手机,控制安卓手机打电话拔号或挂断。

应用场景:CRM客户管理系统,产品订单系统 等需要大量对客户进行电话访问的工作,工作人员戴上耳机,通过网页按钮一键拔号和挂断,可直接不再需要工作人员拿起电话按键拔号 挂断电话等重复劳动。

特点:趋近于零成本,这年头安卓手机普及率非常高,即使没有,无游戏需求的通话型安卓手机,其价格也才几百元左右,客服团队增加十人,也只是加十台手机。

相对于租用传统电话呼叫中心,根据使用规模定义出 小型电话呼叫中心 中型电话呼叫中心 大型电话呼叫中心,其价格就几万至几十万不等每年。

时代背景:在以前,电脑就是电脑,电话就是电话,手机就是手机,而我们的大量客户资料管理。客户服务都是电脑端,如果不购买价格昂贵的电话呼叫中心,就需要重复的拿起电话,对着客户资料按键号码,按键呼叫,再挂断,放下电话。完成一次通话,固定得要付出1-2分钟用于非通话操作。而安卓手机时代,就改变了这样的格局,我们能够通过只是原来百分之一的成本,就能够实现原来的需求。

原始测试界面 (号码为随便书写 )

 

视频演示: http://www.meipai.com/media/861369712

开发技术组成

html+js+websocket ,在电脑上浏览器的权限是有限的,这是为了电脑安全而设定的规则,要在浏览器上与电脑通信与安卓通信,那么必然是使用websocket。

adb , adb全名AndoridDebug Bridge. 顾名思义, 这是一个Debug工具,是一个桥,实现usb连接电脑和手机的桥,在这里主要实现websocke端口转发。

websocketserver ,在手机端,安卓app实现websocket的服务端,实现对websocket客户端拔号,挂断的请求响应。

程序健壮性开发

adb的运行是基于usb数据库连通的情况下,如果用户拔出了usb数据线,在下次重新插上usb数据线,adb是不会重新运行的,这里则需要实现自动化重新运行。同时,端口转发也是需要实现usb断开后连接的自动重新设置。

app需要防止异常关闭异常退出,这里需要做监控,一旦app异常关闭,则马上自动启动,避免响应拔号请求失败。

开发代码段介绍

html+js+websocket 实现部分

function call(number){
	if(number != '10086' && number !='10010'&& number !='0'){
		var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
		if(!myreg.test(number)) {
			alert('手机号码格式错误');
			return;
		}
	}
	var ws = new WebSocket('ws://127.0.0.1:50000');
	ws.onopen = function(event) {
		ws.send(number)
	};
	ws.onerror = function(event){
		alert('手机连接失败,请检查USB连接是否拔除,如果已重新连接USB,请等待一小会');
	}
	ws.onmessage = function(event) { //监听中
		var content = event.data;
		//返回输入的号码
		console.log('即将拔打:'+content)
		//用完就关
		ws.close();
	};
	ws.onclose = function(event){
		console.log('关闭连接');
	}
}

电脑客户端需要安装有ADB驱动

adb桥代码实现部分

::检查USB连通性,通过端口转发监听是否存在
netstat -ano | findstr 127.0.0.1  | findstr 50000
IF ERRORLEVEL 1 (
	echo usb is not connect > debug.txt
	adb forward tcp:50000 tcp:8888
	adb start-server
	exit
)
::检查app是否已经安装
adb shell pm list packages telhelper | findstr "com.example.admin.telhelper"
IF ERRORLEVEL 1 (
	echo install and start > debug.txt
	::安装并启动
	adb install -f c:\android\app20170920.apk
	adb shell am start -n com.example.admin.telhelper/com.example.admin.telhelper.MainActivity
) else (
	::如果已经安装 检查是否运行
	adb shell "ps | grep u0_" | findstr "com.example.admin.telhelper"
	IF ERRORLEVEL 1 (
		echo install but not run > debug.txt
		adb shell am start -n com.example.admin.telhelper/com.example.admin.telhelper.MainActivity
	)
)
exit;
::-----------------------------------------

app响应电脑拔号请求或挂断请求代码

拔打电话
publicvoid call(){
        if(serverManager != null) {
            if (serverManager.tel != null) {
                String tel = serverManager.tel;
                if(tel.equals("0")){
                    serverManager.tel = null;
                    closeCall();
                }else {
                    serverManager.tel = null;
                    Intent intent = newIntent(Intent.ACTION_CALL, Uri.parse("tel:" + tel));
                    startActivity(intent);
                }
 
                //删除通话记录 功能已移动到通话状态监听事件中
                /**
                ContentResolver cResolver =getContentResolver();
                Uri callUri =Uri.parse("content://call_log/calls");
                cResolver.delete(callUri, null,null);
                 **/
 
            }
        }
        //call(serverManager);
    }
 
 
    //挂断电话
    private void closeCall()
    {
        try
        {
            //通过反射拿到android.os.ServiceManager里面的getService这个方法的对象
            Method method =Class.forName("android.os.ServiceManager").getMethod("getService",String.class);
            //通过反射调用这个getService方法,然后拿到IBinder对象
            IBinder iBinder = (IBinder)method.invoke(null, new Object[] {TELEPHONY_SERVICE});
            ITelephony telephony =ITelephony.Stub.asInterface(iBinder);
            telephony.endCall();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }


初始化websocket server并监听请求,自动下载 包 java-websocket-1.3.0.jar

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView t1 = (TextView)findViewById(R.id.t1);
        t1.setText("拔号服务运行中...");
        serverManager=new ServerManager();
        serverManager.Start(8888);
        Timer timer = new Timer();
        TimerTask  task = new TimerTask(){
            public void run() {
                call();
            }
        };
        timer.schedule (task, 100, 100);
        moveTaskToBack(true);

    }

解决模拟器冲突的ADB连接代码

有些用户电脑安装有安卓模拟器,导致USB拔号请求转发到模拟器上而非真实手机上,增加了检测模拟器的。

@ECHO ON
C:
cd C:\android
::功能描述
::通用服务调用,每秒实时检查 1. USB是否连接 2.app是否已安装/安装 3.app是否已启动/启动
::20180227增加对模拟器的识别,防止端口监听转到模拟器上而非真实手机
::检查USB连通性,通过端口转发监听是否存在
::海马模拟器设备名称127.0.0.1
for /f "tokens=*" %%i in ('adb devices ^| findstr /v List ^| findstr /v 127') do (
	set aa=%%i
)
set aa=%aa:device=%
set aa=%aa: =%
echo %aa% > device.txt 

netstat -ano | findstr 127.0.0.1  | findstr 50000
IF ERRORLEVEL 1 (
	echo usb is not connect > debug.txt
	adb -s %aa% forward tcp:50000 tcp:8888
	adb start-server
	exit
)
::检查app是否已经安装
adb shell pm list packages telhelper | findstr "com.example.admin.telhelper"
IF ERRORLEVEL 1 (
	echo install and start > debug.txt
	::安装并启动
	adb install -f c:\android\app20170920.apk
	adb shell am start -n com.example.admin.telhelper/com.example.admin.telhelper.MainActivity
) else (
	::如果已经安装 检查是否运行
	adb shell "ps | grep u0_" | findstr "com.example.admin.telhelper"
	IF ERRORLEVEL 1 (
		echo install but not run > debug.txt
		adb shell am start -n com.example.admin.telhelper/com.example.admin.telhelper.MainActivity
	)
)
exit;
::-----------------------------------------

  • 23
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值