中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

北京政府網(wǎng)seo推廣話(huà)術(shù)

北京政府網(wǎng),seo推廣話(huà)術(shù),網(wǎng)站怎么做微博鏈接,湖北網(wǎng)站建設(shè)模板下載在人際互動(dòng)的手機(jī)APP中,增加語(yǔ)音視頻聊天功能是一個(gè)常見(jiàn)的需求。而現(xiàn)在,更進(jìn)一步,在某些場(chǎng)景下,我們需要能將自己的手機(jī)屏幕分享給他人,或者是觀看他人的手機(jī)屏幕。那么,這些常見(jiàn)的功能是如何實(shí)現(xiàn)的了&…

在人際互動(dòng)的手機(jī)APP中,增加語(yǔ)音視頻聊天功能是一個(gè)常見(jiàn)的需求。而現(xiàn)在,更進(jìn)一步,在某些場(chǎng)景下,我們需要能將自己的手機(jī)屏幕分享給他人,或者是觀看他人的手機(jī)屏幕。那么,這些常見(jiàn)的功能是如何實(shí)現(xiàn)的了?

我分享一個(gè)安卓版的Demo供大家參考。
一.功能介紹
1. 視頻聊天

(1)每個(gè)登錄的用戶(hù)都可向其他任意在線(xiàn)用戶(hù)發(fā)送視頻聊天請(qǐng)求。

(2)當(dāng)收到來(lái)自其他在線(xiàn)用戶(hù)的視頻聊天邀請(qǐng)時(shí),可接受或拒絕對(duì)方的請(qǐng)求。

(3)當(dāng)接受其他在線(xiàn)用戶(hù)的視頻聊天邀請(qǐng)時(shí),就啟動(dòng)視頻聊天。

2.屏幕分享

(1)每個(gè)登錄的用戶(hù)都可向其他任意在線(xiàn)用戶(hù)發(fā)送屏幕分享請(qǐng)求;當(dāng)對(duì)方未響應(yīng)時(shí),可主動(dòng)取消屏幕分享請(qǐng)求。

(2)當(dāng)收到來(lái)自其他在線(xiàn)用戶(hù)請(qǐng)求屏幕分享時(shí),可接受或拒絕對(duì)方的請(qǐng)求。

(3)當(dāng)發(fā)送方收到其他在線(xiàn)用戶(hù)同意屏幕分享時(shí),即可觀看其屏幕

(4)被控端和主控端都可主動(dòng)斷開(kāi)屏幕分享。

二.開(kāi)發(fā)環(huán)境

1.開(kāi)發(fā)工具:

Android Studio 4.0

2.開(kāi)發(fā)語(yǔ)言:

JAVA

3.主要框架:

Netty 、OMCS

三.具體實(shí)現(xiàn)

類(lèi)似視頻聊天或屏幕分享這樣的功能,一般是C/S架構(gòu)的。在這種應(yīng)用中,服務(wù)端相對(duì)簡(jiǎn)單,其主要是在客戶(hù)端之間轉(zhuǎn)發(fā)消息。本Demo提供了一個(gè)非常簡(jiǎn)易的C#服務(wù)端(開(kāi)發(fā)環(huán)境:VS 2022),直接運(yùn)行起來(lái)即可。下面我們將主要介紹安卓端的實(shí)現(xiàn)。

大家可以從文末下載安卓端的源碼,在閱讀本文時(shí)對(duì)照源碼,就會(huì)更清楚些。
首先,我們先要確定客戶(hù)端之間相互通信的消息類(lèi)型。

1.自定義消息類(lèi)型 InformationTypes

public class InformationTypes {/// <summary>/// 視頻請(qǐng)求 0/// </summary>public static final int VideoRequest = 0;/// <summary>/// 回復(fù)視頻請(qǐng)求的結(jié)果 1/// </summary>public static final int VideoResult = 1;/// <summary>/// 通知對(duì)方 掛斷 視頻連接 2/// </summary>public static final int CloseVideo = 2;/// <summary>/// 通知好友 網(wǎng)絡(luò)原因,導(dǎo)致 視頻中斷 3/// </summary>public static final int NetReasonCloseVideo = 3;/// <summary>/// 通知對(duì)方(忙線(xiàn)中) 掛斷 視頻連接 4/// </summary>public static final int BusyLine = 4;/// <summary>/// 屏幕分享請(qǐng)求 5/// </summary>public static final int DesktopRequest = 5;/// <summary>/// 回復(fù)屏幕分享請(qǐng)求的結(jié)果 6/// </summary>public static final int DesktopResult = 6;/// <summary>///  主動(dòng)取消屏幕分享請(qǐng)求/// </summary>public static final int CancelDesktop = 7;/// <summary>///  對(duì)方(主人端)主動(dòng)斷開(kāi)屏幕分享/// </summary>public static final int OwnerCloseDesktop = 8;/// <summary>/// 客人端斷開(kāi)屏幕分享/// </summary>public static final int GuestCloseDesktop = 9;
}

?

這里我們定義了為了實(shí)現(xiàn)第一部分“功能介紹”中的功能,所需要用到的消息類(lèi)型。

2. 獲取安卓系統(tǒng)權(quán)限

在安卓上進(jìn)行視頻聊天和屏幕分享,APP需要向安卓系統(tǒng)申請(qǐng)3個(gè)權(quán)限:麥克風(fēng)、攝像頭、屏幕錄制。

(1)獲取相機(jī)、麥克風(fēng)、存儲(chǔ)權(quán)限

private void getPermission() {List<PermissionItem> permissionItems = new ArrayList<PermissionItem>();permissionItems.add(new PermissionItem(Manifest.permission.CAMERA, "相機(jī)", R.drawable.permission_ic_camera));permissionItems.add(new PermissionItem(Manifest.permission.RECORD_AUDIO, "麥克風(fēng)", R.drawable.permission_ic_micro_phone));permissionItems.add(new PermissionItem(Manifest.permission.WRITE_EXTERNAL_STORAGE, "存儲(chǔ)", R.drawable.permission_ic_storage));permissionItems.add(new PermissionItem(Manifest.permission.READ_EXTERNAL_STORAGE, "", 0));try {HiPermission.create(LoginActivity.this).title("歡迎訪問(wèn)" + getString(R.string.app_name)).permissions(permissionItems).checkMutiPermission(new PermissionCallback() {String TAG = getString(R.string.app_name);@Overridepublic void onClose() {Log.i(TAG, "onClose");}@Overridepublic void onFinish() {Log.i(TAG, "onFinish");}@Overridepublic void onDeny(String permission, int position) {Log.i(TAG, "onDeny- permission:" + permission + "   position:" + position);}@Overridepublic void onGuarantee(String permission, int position) {Log.i(TAG, "onGuarantee");}});} catch (Exception ex) {ex.printStackTrace();}}

?

當(dāng)安卓手機(jī)首次進(jìn)入該Demo時(shí), 將彈窗提示獲取設(shè)備權(quán)限:


注:若禁止了這兩個(gè)權(quán)限,后續(xù)就無(wú)法進(jìn)行正常的視頻聊天了!

(2)屏幕錄制權(quán)限

CameraSurfaceView2 myView = null;
MultimediaManagerFactory.GetSingleton().getAudioMessageController().dispose();
AndroidUtil.OpenSpeaker(this);
try {MultimediaManagerFactory.GetSingleton().openCamera();
} catch (Exception e) {e.printStackTrace();
}
this.tv_nick = (TextView) findViewById(R.id.tv_nick);
myView = (CameraSurfaceView2) findViewById(R.id.local_surface);
myView.setSurfaceEventLister(new CameraSurfaceView2.SurfaceEventLister() {@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {setShowPreviewHolder(surfaceHolder);}
});
myView.setZOrderOnTop(true);
MultimediaManagerFactory.GetSingleton().setCameraDeviceIndex(1);//設(shè)置為前置攝像頭
//設(shè)置攝像頭打開(kāi)成功回調(diào)函數(shù)
MultimediaManagerFactory.GetSingleton().setCameraOpenCallBack(this);
if (StringHelper.isNullOrEmpty(userId)) {isSender = true;//我向?qū)Ψ桨l(fā)起視頻userId = getIntent().getStringExtra(TalkingID);if (StringHelper.isNullOrEmpty(userId)) {tv_nick.setText("未知requestID");} else {ll_to_callLayout.setVisibility(View.VISIBLE);coming_callLayout.setVisibility(View.GONE);hangup.setVisibility(View.VISIBLE);MainActivity.getInstance().sendMediaCommunicate(userId, CommunicateType.Request);tv_tips.setText("正在等待對(duì)方接受邀請(qǐng)");}
}

4. 回復(fù)對(duì)方視頻請(qǐng)求

當(dāng)收到對(duì)方的視頻聊天邀請(qǐng)時(shí),將進(jìn)入視頻預(yù)覽頁(yè)面,顯示視頻邀請(qǐng)。

當(dāng)點(diǎn)擊“接聽(tīng)”或“掛斷”按鈕時(shí),就會(huì)發(fā)送視頻聊天回復(fù)消息:

//接聽(tīng)
answer.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {MainActivity.getInstance().stopRingForCalling();coming_callLayout.setVisibility(View.GONE);ll_to_callLayout.setVisibility(View.VISIBLE);openConnector();MainActivity.getInstance().sendMediaCommunicate(userId, CommunicateType.Agree);} catch (Exception ex) {ex.printStackTrace();}}
});
//拒絕
refuse.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {MainActivity.getInstance().sendMediaCommunicate(userId, CommunicateType.Reject);MainActivity.getInstance().stopRingForCalling();finish();} catch (Exception ex) {ex.printStackTrace();}}
});

?

5. 相互連接對(duì)方的攝像頭、麥克風(fēng)

當(dāng)對(duì)方回復(fù)同意時(shí),自己和對(duì)方將相互連接到對(duì)方的麥克風(fēng)和攝像頭。

private void openConnector() {try {if (thread2 != null) {thread2.interrupt();}hangup.setVisibility(View.VISIBLE);switch_camera_layout.setVisibility(View.VISIBLE);ll_top_container.setVisibility(View.INVISIBLE);thread2 = new Thread(new Runnable() {Overridepublic void run() {//在這里關(guān)閉不能重新連接cameraConnector = new CameraConnector();cameraConnector.setOtherVideoPlayerSurfaceView(otherView);cameraConnector.setConnectorEventListener(new IConnectorEventListener() {@Overridepublic void connectEnded(ConnectResult connectResult) {final String connectFailStr = MainActivity.getConnectFailStr(connectResult);if (!StringHelper.isNullOrEmpty(connectFailStr)) {mHandler.post(new Runnable() {@Overridepublic void run() {tv_camera_failure_cause.setText("攝像頭:" + connectFailStr);}});}boolean isMobilePhone = cameraConnector.getOwnerMachineType() == MachineType.Android || cameraConnector.getOwnerMachineType() == MachineType.IOS;cameraConnector.setVideoUniformScale(true, isMobilePhone); //false 表示小的那邊留黑邊,true表示裁剪大的那一邊}@Overridepublic void disconnected(ConnectorDisconnectedType connectorDisconnectedType) {}});cameraConnector.beginConnect(loginID);microphoneConnector = new MicrophoneConnector();microphoneConnector.setConnectorEventListener(new IConnectorEventListener() {@Overridepublic void connectEnded(final ConnectResult connectResult) {mHandler.post(new Runnable() {@Overridepublic void run() {if (connectResult == ConnectResult.Succeed) {startTimer(SystemClock.elapsedRealtime());} else {String connectFailStr = MainActivity.getConnectFailStr(connectResult);tv_mic_failure_cause.setText("麥克風(fēng):" + connectFailStr);}}});}@Overridepublic void disconnected(ConnectorDisconnectedType connectorDisconnectedType) {}});microphoneConnector.beginConnect(loginID);}});thread2.start();} catch (Exception ex) {ex.printStackTrace();}
}

當(dāng)攝像頭和麥克風(fēng)都連接成功后,就可以正常視頻聊天了。

http://www.risenshineclean.com/news/52322.html

相關(guān)文章:

  • 做淘寶網(wǎng)站的企業(yè)網(wǎng)站排名優(yōu)化方案
  • 局域網(wǎng)網(wǎng)站建設(shè)需要什么條件市場(chǎng)推廣和銷(xiāo)售的區(qū)別
  • 山東有哪些網(wǎng)絡(luò)公司優(yōu)化大師客服
  • 開(kāi)封網(wǎng)站建設(shè)百度商店應(yīng)用市場(chǎng)
  • 青海網(wǎng)站建設(shè)企業(yè)四川seo選哪家
  • 機(jī)械做網(wǎng)站好處百度推廣管家登錄
  • 企業(yè)網(wǎng)站需要注意什么搜索引擎營(yíng)銷(xiāo)是什么意思
  • 網(wǎng)站作用愛(ài)站網(wǎng)愛(ài)情電影網(wǎng)
  • 合肥網(wǎng)頁(yè)制作設(shè)計(jì)重慶網(wǎng)站排名優(yōu)化教程
  • 徐州建設(shè)網(wǎng)站公司建網(wǎng)站費(fèi)用
  • 做公司標(biāo)志用哪個(gè)網(wǎng)站網(wǎng)絡(luò)優(yōu)化需要哪些知識(shí)
  • 有口碑的企業(yè)網(wǎng)站建設(shè)專(zhuān)業(yè)的制作網(wǎng)站開(kāi)發(fā)公司
  • 網(wǎng)站的建設(shè)與維護(hù)工資平臺(tái)優(yōu)化是什么意思
  • 東莞網(wǎng)站設(shè)計(jì)公司軟文標(biāo)題大全
  • 德?tīng)柶站W(wǎng)絡(luò)做網(wǎng)站怎么樣淘寶搜索關(guān)鍵詞技巧
  • 電腦首頁(yè)wordpress公眾號(hào)排名優(yōu)化
  • 手機(jī)系統(tǒng)網(wǎng)站seo自動(dòng)優(yōu)化工具
  • 動(dòng)態(tài)h5網(wǎng)站開(kāi)發(fā)百度指數(shù)分析數(shù)據(jù)
  • 凡科快圖軟件下載南昌seo計(jì)費(fèi)管理
  • 網(wǎng)站聯(lián)盟怎么做青島關(guān)鍵詞排名哪家好
  • 泉州seo-泉州網(wǎng)站建設(shè)公司電商平臺(tái)的營(yíng)銷(xiāo)方式
  • 做銷(xiāo)售在那個(gè)網(wǎng)站找新鄭網(wǎng)絡(luò)推廣公司
  • 金融網(wǎng)站建設(shè)成功案例品牌關(guān)鍵詞優(yōu)化哪家便宜
  • 用ps做零食網(wǎng)站模板seo培訓(xùn)資料
  • 網(wǎng)站建設(shè)公司名字seo網(wǎng)站優(yōu)化師
  • 做網(wǎng)站什么字體網(wǎng)絡(luò)營(yíng)銷(xiāo)課程感悟
  • 怎么查看網(wǎng)站的安全性百度推廣優(yōu)化怎么做
  • 網(wǎng)站建設(shè)制作公司地址發(fā)軟文是什么意思
  • 網(wǎng)站開(kāi)發(fā)目的騰訊企點(diǎn)賬戶(hù)中心
  • 珠海高端網(wǎng)站制作公司怎么做網(wǎng)頁(yè)設(shè)計(jì)的頁(yè)面