android投屏技術????:發(fā)現(xiàn)設備代碼實現(xiàn)

cover

關于 android 投屏技術系列:
一梢为、知識概念

這章主要講一些基本概念, 那些 DLNA 類庫都是基于這些概念來做的丑孩,了解這些概念能幫助你理清思路,同時可以提升開發(fā)效率灭贷,遇到問題也能有個解決問題的清晰思路温学。

二、手機與tv對接

這部分是通過Cling DLNA類庫來實現(xiàn)發(fā)現(xiàn)設備的甚疟。
內(nèi)容包括:

  1. 抽出發(fā)現(xiàn)設備所需接口
  2. 發(fā)現(xiàn)設備步驟的實現(xiàn)
  3. 原理的分析

三仗岖、手機與tv通信

這部分也是通過Cling DLNA類庫來實現(xiàn)手機對tv的控制。
內(nèi)容包括:

  1. 控制設備步驟
  2. 控制設備代碼實現(xiàn)
  3. 手機如何控制tv
  4. tv將自己的信息如何通知手機
  5. 原理的分析

前言

上篇文章古拴,我們聊了投屏技術所需的協(xié)議和概念箩帚。今天我們來實際操作。


神操作

何為發(fā)現(xiàn)設備黄痪?
android 手機投屏到 tv盒子 上,首先你要讓 tv盒子 跟你的手機在同一個局域網(wǎng)中盔然,然后要讓手機能搜索到當前局域網(wǎng)內(nèi)所有支持投屏的設備(如:tv盒子)這個過程 就是發(fā)現(xiàn)設備桅打。

噢了~ 這篇文章分兩部分:

  • 第一部分是 Cling庫 的使用以及里面基本概念。
  • 第二部分是 Cling庫 發(fā)現(xiàn)設備部分的源碼分析愈案。
action

行動前挺尾,先分析一下 我們的需求:

  1. 手機 & tv盒子 都連上局域網(wǎng)
  2. 手機需要隨時監(jiān)聽局域網(wǎng)中支持投屏設備的出現(xiàn)
  3. 手機跟支持投屏的 tv盒子 建立連接

首先,看 Cling庫 的介紹:

Cling

它主要由 core 和 support 兩個部分構成站绪。

  • core: 包含了發(fā)現(xiàn)設備部分
  • support: 包含的是控制設備部分

今天我們要用到的是 core 部分遭铺。
一切準備就緒,大哥恢准,我們開始實現(xiàn)發(fā)現(xiàn)設備功能好不好魂挂?
不好也得好,就是這么任性馁筐,略略略

打我啊

發(fā)現(xiàn)設備功能實現(xiàn)

首先我們要在 manifest 里加上以下權限(網(wǎng)絡相關權限):

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

在 Cling 中針對 android 定義了一個 Service 來操作------>AndroidUpnpServiceImpl
它有以下方法:

public UpnpServiceConfiguration getConfiguration();

public ControlPoint getControlPoint();

public ProtocolFactory getProtocolFactory();

public Registry getRegistry();

public Router getRouter();

public IBinder onBind(Intent intent);
  
public void onDestroy();

不懂沒關系涂召。
現(xiàn)在你只需要知道:

  • ControlPoint getControlPoint() 獲取到控制點,通過控制點執(zhí)行 search() 方法就可以發(fā)現(xiàn)設備了
  • 然后就是 我們可以根據(jù)需求在 activity 里 bind 或者 unbind AndroidUpnpServiceImpl 這個 Service

接下來我們要在 manifest 里面定義這個 Service

<service android:name="org.fourthline.cling.android.AndroidUpnpServiceImpl"/>

下面是 activity:

public class BrowserActivity extends ListActivity {

    private ArrayAdapter<DeviceDisplay> listAdapter;

   // 監(jiān)聽設備發(fā)現(xiàn)敏沉,當一個新設備出現(xiàn)在網(wǎng)絡時果正,會回調(diào)它
    private BrowseRegistryListener registryListener = new BrowseRegistryListener();

    private AndroidUpnpService upnpService;

    private ServiceConnection serviceConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className, IBinder service) {
            upnpService = (AndroidUpnpService) service;

            listAdapter.clear();

            // 添加監(jiān)聽
            upnpService.getRegistry().addListener(registryListener);

            // 添加已知的設備
            for (Device device : upnpService.getRegistry().getDevices()) {
                registryListener.deviceAdded(device);
            }

            // 搜索所有的設備
            upnpService.getControlPoint().search();
        }

        public void onServiceDisconnected(ComponentName className) {
            upnpService = null;
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        setListAdapter(listAdapter);

        // This will start the UPnP service if it wasn't already started
        getApplicationContext().bindService(
            new Intent(this, AndroidUpnpServiceImpl.class),
            serviceConnection,
            Context.BIND_AUTO_CREATE
        );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (upnpService != null) {
            upnpService.getRegistry().removeListener(registryListener);
        }
        // This will stop the UPnP service if nobody else is bound to it
        getApplicationContext().unbindService(serviceConnection);
    }
    // ...
}

這段代碼就實現(xiàn)了兩個功能:

  1. upnpService.getControlPoint().search(); 實現(xiàn)發(fā)現(xiàn)設備
  2. BrowseRegistryListener registryListener;
    upnpService.getRegistry().addListener(registryListener);
    實現(xiàn)了發(fā)現(xiàn)設備監(jiān)聽

其實 就這么簡單,<b>但</b>搜索到的 并不是我們想要的結果盟迟,我要篩選到支持投屏渲染的設備:

    public static final DeviceType DMR_DEVICE_TYPE = new UDADeviceType("MediaRenderer");

    /**
     * 獲取支持投屏的設備
     *
     * @return  設備列表
     */
    @Override
    @Nullable
    public Collection<Device> getDmrDevices() {
        if (Utils.isNull(mUpnpService))
            return null;

        Collection<Device> devices = upnpService.getRegistry().getDevices(DMR_DEVICE_TYPE);

        return devices;
    }

噢了~~

點擊查看詳細代碼

(* 詳細代碼里 做了一些封裝)

下面我們進入正式環(huán)節(jié)-源碼分析:
由于文章太長秋泳,我分開到下篇文章

android投屏技術:發(fā)現(xiàn)設備源碼分析

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市攒菠,隨后出現(xiàn)的幾起案子迫皱,更是在濱河造成了極大的恐慌,老刑警劉巖要尔,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舍杜,死亡現(xiàn)場離奇詭異新娜,居然都是意外死亡,警方通過查閱死者的電腦和手機既绩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門概龄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饲握,你說我怎么就攤上這事私杜。” “怎么了救欧?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵衰粹,是天一觀的道長。 經(jīng)常有香客問我笆怠,道長铝耻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任蹬刷,我火速辦了婚禮瓢捉,結果婚禮上,老公的妹妹穿的比我還像新娘办成。我一直安慰自己泡态,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布迂卢。 她就那樣靜靜地躺著某弦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪而克。 梳的紋絲不亂的頭發(fā)上靶壮,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音拍摇,去河邊找鬼亮钦。 笑死,一個胖子當著我的面吹牛充活,可吹牛的內(nèi)容都是我干的蜂莉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼混卵,長吁一口氣:“原來是場噩夢啊……” “哼映穗!你這毒婦竟也來了?” 一聲冷哼從身側響起幕随,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚁滋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辕录,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡睦霎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了走诞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片副女。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚣旱,靈堂內(nèi)的尸體忽然破棺而出碑幅,到底是詐尸還是另有隱情,我是刑警寧澤塞绿,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布沟涨,位于F島的核電站,受9級特大地震影響异吻,放射性物質(zhì)發(fā)生泄漏裹赴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一涧黄、第九天 我趴在偏房一處隱蔽的房頂上張望篮昧。 院中可真熱鬧,春花似錦笋妥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嫉你,卻和暖如春月帝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幽污。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工嚷辅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人距误。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓簸搞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親准潭。 傳聞我的和親對象是個殘疾皇子趁俊,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容