实时对讲语音功能代码分析.doc_第1页
实时对讲语音功能代码分析.doc_第2页
实时对讲语音功能代码分析.doc_第3页
实时对讲语音功能代码分析.doc_第4页
实时对讲语音功能代码分析.doc_第5页
免费预览已结束,剩余19页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实时对讲:MainService.javapublic class MainService extends Service private ServiceBinder sBinder = new ServiceBinder();/服务绑定器private AlertDialog dialog = null;private boolean isPaused = false;/判断本身是不是可见private boolean isRemoteUserClosed = false; /是否远程用户已经关闭了通话。 private SharedPreferences pre = null;private SharedPreferences.Editor editor = null;private WifiManager wifiManager = null;private ServiceBroadcastReceiver receiver = null;public InetAddress localInetAddress = null;private String localIp = null;private byte localIpBytes = null; private byte regBuffer = new byteConstant.bufferSize;/本机网络注册交互指令private byte msgSendBuffer = new byteConstant.bufferSize;/信息发送交互private byte fileSendBuffer = new byteConstant.bufferSize;/文件发送交互指令private byte talkCmdBuffer = new byteConstant.bufferSize;/通话指令private static Person me = null;/用来保存自身的相关信息private CommunicationBridge comBridge = null;/通讯与协议解析模块Overridepublic void onStart(Intent intent, int startId) initCmdBuffer();/初始化指令缓存wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);new CheckNetConnectivity().start();/侦测网络状态,获取IP地址comBridge = new CommunicationBridge();/启动socket连接comBridge.start();pre = PreferenceManager.getDefaultSharedPreferences(this);editor = pre.edit();regBroadcastReceiver();/注册广播接收器getMyInfomation();/获得自身信息new UpdateMe().start();/向网络发送心跳包,并注册new CheckUserOnline().start();/检查用户列表是否有超时用户sendPersonHasChangedBroadcast();/通知有新用户加入或退出System.out.println(Service started.); /更新通话命令用户数据 System.arraycopy(ByteAndI2ByteArray(myId), 0, talkCmdBuffer, 6, 4); System.arraycopy(ByteAndI2ByteArray(iconId), 0, talkCmdBuffer, 10, 4); for(int i=14;i44;i+)talkCmdBufferi = 0;/把原来的昵称内容清空 System.arraycopy(nickeNameBytes, 0, talkCmdBuffer, 14, nickeNameBytes.length);for(int i=0;iConstant.bufferSize;i+)talkCmdBufferi=0;System.arraycopy(Constant.pkgHead, 0, talkCmdBuffer, 0, 3);talkCmdBuffer3 = Constant.CMD83;talkCmdBuffer4 = Constant.CMD_TYPE1;talkCmdBuffer5 = Constant.OPR_CMD1;/开始语音呼叫public void startTalk(int personId)comBridge.startTalk(personId);/结束语音呼叫public void stopTalk(int personId)comBridge.stopTalk(personId);/接受远程语音呼叫public void acceptTalk(int personId)comBridge.acceptTalk(personId);private class CommunicationBridge extends Threadprivate MulticastSocket multicastSocket = null;private byte recvBuffer = new byteConstant.bufferSize;private boolean isStopTalk = false;/通话结束标志private AudioHandler audioHandler = null;/音频处理模块,用来收发音频数据public CommunicationBridge()audioHandler = new AudioHandler();audioHandler.start();/打开组播端口,准备组播通讯Overridepublic void run() super.run();try multicastSocket = new MulticastSocket(Constant.PORT);multicastSocket.joinGroup(InetAddress.getByName(Constant.MULTICAST_IP);System.out.println(Socket started.);while (!multicastSocket.isClosed() & null!=multicastSocket) for (int i=0;i0 & length%2=0)/for(int i=0;i0 & length%2=0)os.write(readBuffer,0,length);/写入到输出流,把音频数据通过网络发送给对方recorder.stop();os.close();socket.close(); catch (IOException e) e.printStackTrace();public void release() try System.out.println(Audio handler socket closed .);if(null!=sSocket)sSocket.close(); catch (IOException e) e.printStackTrace();/=TCP语音传输模块结束= FlyPigeonMainActivity.javaExpandableListView数据适配器 private class ExListAdapter extends BaseExpandableListAdapter implements OnLongClickListener private Context context = null; public ExListAdapter(Context context) this.context = context; /*当用户列表被长时间按下时会触发该事件*/Overridepublic boolean onLongClick(View view) person = (Person)view.getTag();AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setTitle(person.personNickeName);builder.setMessage(R.string.pls_select_opr);builder.setIcon(person.personHeadIconId);View vi = getLayoutInflater().inflate(R.layout.person_long_click_layout, null);builder.setView(vi);dialog = builder.show();Button callBtn = (Button)vi.findViewById(R.id.long_click_call);callBtn.setTag(person);=ExpandableListView数据适配器结束=长按long_click_call 这个ButtonOverridepublic void onClick(View view) switch(view.getId()case R.id.long_click_call:person = (Person)view.getTag();AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(me.personNickeName);String title = String.format(getString(R.string.talk_with), person.personNickeName);builder.setMessage(title);builder.setIcon(me.personHeadIconId);builder.setNegativeButton(getString(R.string.close), new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface cdialog, int which) cdialog.dismiss(););final AlertDialog callDialog = builder.show();callDialog.setOnDismissListener(new DialogInterface.OnDismissListener() Overridepublic void onDismiss(DialogInterface arg0) mService.stopTalk(person.personId););mService.startTalk(person.personId);break;/长按long_click_call 这个Button结束/ /=广播接收器= private class MyBroadcastRecv extends BroadcastReceiver Overridepublic void onReceive(Context context, Intent intent) if(intent.getAction().equals(Constant.receivedTalkRequestAction)if(!isPaused)isRemoteUserClosed = false;final Person psn = (Person)intent.getExtras().get(person);String title = String.format(getString(R.string.talk_with), psn.personNickeName);AlertDialog.Builder builder = new AlertDialog.Builder(FlyPigeonMainActivity.this);builder.setTitle(me.personNickeName);builder.setMessage(title);builder.setIcon(me.personHeadIconId);View vi = getLayoutInflater().inflate(R.layout.request_talk_layout, null);builder.setView(vi);final AlertDialog revTalkDialog = builder.show();revTalkDialog.setOnDismissListener(new DialogInterface.OnDismissListener() Overridepublic void onDismiss(DialogInterface arg0) mService.stopTalk(psn.personId););Button talkOkBtn = (Button)vi.findViewById(R.id.receive_talk_okbtn);talkOkBtn.setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View okBtn) if(!isRemoteUserClosed)/如果远程用户未关闭通话,则向对方发送同意接收通话指令mService.acceptTalk(psn.personId);okBtn.setEnabled(false););Button talkCancelBtn = (Button)vi.findViewById(R.id.receive_talk_cancel);talkCancelBtn.setOnClickListener(new View.OnClickListener() Overridepublic void onClick(View cancelBtn) revTalkDialog.dismiss(););else if(intent.getAction().equals(Constant.remoteUserClosedTalkAction)isRemoteUserClosed = true;/如果接收到远程用户关闭通话指令则把该标记置为trueelse if(intent.getAction().equals(Constant.remoteUserRefuseReceiveFileAction)Toast.makeText(FlyPigeonMainActivity.this, getString(R.string.refuse_receive_file), Toast.LENGTH_SHORT).show();else if(intent.getAction().equals(Constant.personHasChangedAction)children = mService.getChildren();personKeys = mService.getPersonKeys();if(null=adapter)adapter = new ExListAdapter(FlyPigeonMainActivity.this); ev.setAdapter(adapter); ev.expandGroup(0); ev.setGroupIndicator(getResources().getDrawable(R.drawable.all_bird); adapter.notifyDataSetChanged();=广播接收器结束=/广播接收器注册private void regBroadcastRecv() broadcastRecv = new MyBroadcastRecv(); bFilter = new IntentFilter(); bFilter.addAction(Constant.receivedTalkRequestAction); bFilter.addAction(Constant.remoteUserClosedTalkAction); registerReceiver(broadcastRecv, bFilter);=FlyPigeonMainActivity.java结束ChartMsgActivity.javaprivate LinearLayout chartMsgPanel = null;private MainService mService = null;private Intent mMainServiceIntent = null;private MyBroadcastRecv broadcastRecv = null;private IntentFilter bFilter = null;private ScrollView chartMsgScroll = null;private boolean isPaused = false;/判断本身是否可见private boolean isRemoteUserClosed = false; /是否远程用户已经关闭了通话。 private ServiceConnection sConnection = new ServiceConnection()Overridepublic void onServiceConnected(ComponentName name, IBinder service) mService = (MainService.ServiceBinder)service).getService();showMsg(person.personId);/如果服务连接成功则获取该用户的消息并显示System.out.println(Service connected to activity.);Overridepublic void onServiceDisconnected(ComponentName name) mService = null;System.out.println(Service disconnected to activity.);/当前Activity与后台MainService进行绑定 mMainServiceIntent = new Intent(this,MainService.class); bindService(mMainServiceIntent, sConnection, BIND_AUTO_CREATE); regBroadcastRecv(); Override public boolean onOptionsItemSelected(MenuItem item) switch(item.getOrder()case 2: AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle(me.personNickeName);String title = String.format(getString(R.string.talk_with), person.personNickeName);builder.setMessage(title);builder.setIcon(me.personHeadIconId);builder.setNegativeButton(getString(R.string.close), new DialogInterface.OnClickListener() Overridepublic void onClick(DialogInterface tdialog, int which) tdialog.dismiss(););final AlertDialog talkDialog = builder.show();talkDialog.setOnDismissListener(new DialogInterface.OnDismissListener() Overridepublic void onDismiss(DialogInterface arg0) mService.stopTalk(person.personId););mService.startTalk(person.personId); break; return super.onOptionsItemSelected(item); /广播接收器 private class MyBroadcastRecv extends BroadcastReceiverOverridepublic void onReceive(Context context, Intent intent) if(intent.getAction().equals(Constant.receivedTalkRequestAction)if(!isPaused)isRemoteUserClosed = false;final P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论