欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android實(shí)現(xiàn)微信朋友圈發(fā)本地視頻功能

 更新時(shí)間:2016年11月18日 10:16:29   作者:dj0379  
這篇文章主要介紹了Android實(shí)現(xiàn)微信朋友圈發(fā)本地視頻功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

一、前言

前一篇文章已經(jīng)詳細(xì)介紹了如何使用Xposed框架編寫第一個(gè)微信插件:搖骰子和猜拳作弊器 本文繼續(xù)來介紹如何使用Xposed框架編寫第二個(gè)微信插件,可以將本地小視頻發(fā)布到朋友圈的功能。在這之前我們還是要有老套路,準(zhǔn)備工作要做好,這里還是使用微信6.3.9版本進(jìn)行操作,準(zhǔn)備工作:

1、使用apktool工具進(jìn)行反編譯,微信沒有做加固防護(hù),所以這個(gè)版本的微信包反編譯是沒有任何問題的。

2、借助于可視化反編譯工具Jadx打開微信包,后續(xù)幾乎重要分析都是借助這個(gè)工具來操作的。

二、猜想與假設(shè)

做好上面這兩步之后,加上我們在之前的那個(gè)編寫插件的基礎(chǔ)之上,我們本次操作就應(yīng)該非常簡單了,還記得之前的插件的突破口是啥嗎?看過文章的同學(xué)應(yīng)該了解通過分析界面的控件來獲取到id值,然后全局搜索得到的突破口,那么本文其實(shí)可能不需要這個(gè)方式了,而是另外一種方式,下面來詳細(xì)介紹一下。在這之前我們先來看看微信正常的發(fā)布小視頻到朋友圈的方式,會(huì)跳轉(zhuǎn)到這個(gè)發(fā)布頁面:

那么我們又要開始大膽的猜想了:

首先這個(gè)頁面有的元素:標(biāo)題,小視頻,地理位置等信息,而這些信息應(yīng)該會(huì)在請求發(fā)布的時(shí)候攜帶到服務(wù)器上。這個(gè)有點(diǎn)類似于小文件的上傳功能。所以這個(gè)視頻的文件是如何得到的。那么可以得到的假設(shè):這個(gè)頁面是一個(gè)Activity頁面,可能從其他頁面跳轉(zhuǎn)過來的,同時(shí)會(huì)把這些元素信息通過intent攜帶過來,而小視頻是個(gè)文件,所以應(yīng)該會(huì)攜帶文件的名稱。

三、逆向分析

有了這猜想之后,咋們就可以開始操作了,首先得到這個(gè)頁面的activity名稱,這個(gè)比較簡單了,直接使用一個(gè)命令即可:adb shell dumpsys activity top

看到這個(gè)頁面的名稱是SightUploadUI,我們借助Jadx反編譯微信之后,找到這個(gè)類:

我們直接看onCreate方法中有沒有對intent參數(shù)解析操作,或者我們可以在這個(gè)類中全局搜一下getIntent字段,也可以快速得到解析的地方:

看到第一個(gè)字段Kdescription,從字段的名稱來看應(yīng)該是描述信息,而從下面的代碼setText調(diào)用更可以確認(rèn)了這個(gè)就是標(biāo)題信息。我們繼續(xù)查找:

又發(fā)現(xiàn)了一個(gè)字段KSightDraftEntrance,這塊代碼就有點(diǎn)多了,他是一個(gè)boolean類型,所以先不管了,因?yàn)楹竺婕词故菄L試的話也就兩次操作,一次false一次true。不礙事的!可是到這里我們在也搜不到其他字段了,但是這個(gè)就和我們的預(yù)期不一樣了,還差幾個(gè)元素信息呢?最重要的視頻文件路徑?jīng)]有,所以這個(gè)就要想起在onCreate方法中有一個(gè)ae類初始化的時(shí)候把當(dāng)前activity傳遞進(jìn)去了,那么可能他內(nèi)部繼續(xù)進(jìn)行了參數(shù)解析,我們可以進(jìn)去查看一下:

果然在他內(nèi)部還有三個(gè)字段解析,分別是:KSightThumbPath,KSightPath,sight_md5;而從字段命名上來看猜想這個(gè)應(yīng)該就是和視頻信息相關(guān)的字段了。這里只要有Android開發(fā)經(jīng)驗(yàn)的同學(xué)應(yīng)該可以猜想:KSightPath字段是短視頻路徑,KSightThumbPath是短視頻的默認(rèn)封面圖,sight_md5是短視頻的校驗(yàn)值。到這里其實(shí)我們已經(jīng)感覺快成功了,得到了這五個(gè)參數(shù),那么我們可以直接嘗試了操作了:

在本地存放一個(gè)短視頻,封面圖片,然后計(jì)算短視頻的md5碼,最后通過intent來啟動(dòng)這個(gè)頁面即可。先不管后面的上傳過程了,咋們可以先試驗(yàn)?zāi)艹晒μD(zhuǎn)到這個(gè)頁面展示本地小視頻功能。

可惜到這里我們有一個(gè)問題,就是怎么獲取這個(gè)啟動(dòng)頁面的activity呢?也就是用哪個(gè)activity來啟動(dòng)他呢?有的同學(xué)可能這么干?直接簡單明了的編寫一個(gè)小程序,然后用小程序的activity啟動(dòng)這個(gè)頁面。這個(gè)猜想是可以的,不過我沒嘗試,因?yàn)槲蚁胛⑿抛隽薬ctivity啟動(dòng)安全防護(hù)的,不可能在其他應(yīng)用中可以啟動(dòng)微信中的任意一個(gè)頁面。所以這里我就沒費(fèi)那勁了。而是想到用微信自己的頁面來啟動(dòng)他,那么如何獲取到微信的一個(gè)其他頁面呢?這個(gè)也簡單。咋們可以打開一個(gè)聊天頁面,繼續(xù)使用adb shell dumpsys activity top 命令查看頁面:

好了,就是這個(gè)LauncherUI頁面了,那么知道這個(gè)頁面下面怎么獲取這個(gè)對象呢?這時(shí)候就需要借助Xposed框架進(jìn)行Hook了,代碼如下:

看到了吧,代碼很簡單的,我們hook頁面的onResume方法,因?yàn)檫@時(shí)候頁面已經(jīng)初始化完成了是整個(gè)Activity生命周期中的比較晚的一個(gè)方法了,所以攔截他就可以了。然后在攔截回調(diào)用使用MethodHookParam的thisObject屬性就可以得到這個(gè)方法所屬的對象了,也就是LauncherUI類型了。

好了既然現(xiàn)在微信啟動(dòng)頁面也有了,下面就簡單了,直接構(gòu)造上面的五個(gè)參數(shù)得到intent直接啟動(dòng):

代碼很簡單,咋們直接運(yùn)行模塊,然后重啟設(shè)備生效,然后打開微信界面瞬間看到效果了:

果然跳轉(zhuǎn)到這個(gè)頁面了,也就是說我們的猜想對了,下面我們點(diǎn)擊發(fā)送,會(huì)發(fā)現(xiàn)發(fā)送失敗了:

原因可能有兩個(gè):

1、沒有弄對視頻文件的MD5碼

2、視頻格式不符合服務(wù)器接受的要求:視頻的長度和視頻的大小

關(guān)于第二個(gè)原因,其實(shí)網(wǎng)上有答案,就是微信這個(gè)發(fā)布的小視頻長度不能超過15s,大小不能超過1M。所以這里我就把本地視頻做成了符合這兩個(gè)標(biāo)準(zhǔn)的,再次操作依然是這樣的失敗效果。那么就有可能猜想是視頻的MD5碼校驗(yàn)出問題了,上面看到代碼中我傳入的MD5碼是aaa,我是為了方便沒去弄。但是這里就必須寫了。獲取文件的MD5碼這里就不多解釋了,不過可惜的是,MD5弄成文件的還是失敗。那么這時(shí)候就猜想他或許不是真正意義上的MD5值了,可能加上了他自己的一個(gè)算法了。所以又來了一個(gè)問題,如何得到這個(gè)算法呢?

這時(shí)候就需要跟蹤代碼看看其他頁面跳轉(zhuǎn)到這個(gè)頁面攜帶過來的MD5碼是什么呢?我們可以這么干就是全局搜索那五個(gè)字段中的任意一個(gè)即可,這里在Jadx中全局搜索:sight_md5

我們點(diǎn)擊進(jìn)入查看方法:

繼續(xù)查找這個(gè)方法在哪被調(diào)用了:

咋們繼續(xù)點(diǎn)擊進(jìn)入查看:

這里看到了倒數(shù)第二個(gè)參數(shù)就是那個(gè)MD5碼值,我們在全局搜一下這個(gè)變量在哪里被使用到了:

看到這里有賦值的地方,點(diǎn)擊進(jìn)入查看:

然后查看這個(gè)kbVar變量,在上面的代碼中:

這里我們可以先看看這個(gè)kb類的定義:

這里的aFL就是那個(gè)MD5碼值了,我們繼續(xù)上面的那個(gè)a方法查看哪些地方調(diào)用了,不過查找是沒有效果的,因?yàn)檫@個(gè)方法可能是抽象的,所以咋們得找到他抽象定義的地方,在上面就是一個(gè)抽象類c:

然后進(jìn)入c類查看抽象方法a:

然后查找a方法調(diào)用的地方:

繼續(xù)查看這個(gè)方法的調(diào)用地方:

這時(shí)候我們多看一下,這個(gè)方法所屬的類是個(gè)單例:

那么繼續(xù)查看這個(gè)g方法被調(diào)用的地方,或者全局搜一下jJA這個(gè)變量的使用也可以的:

又回到了剛剛的那個(gè)MainSightContainerView類了,這里看到了賦值的地方了,而且是給aFL字段賦值的,這個(gè)就是上面看到kb類中的字段值,這里依然調(diào)用了一個(gè)方法計(jì)算MD5碼值,而且傳入的參數(shù)是視頻路徑:

這里首先判斷當(dāng)前視頻文件是否存在,然后在進(jìn)行文件操作:

真正加密算法是在a方法中,這里也可以看到因?yàn)橛?jì)算文件的MD5碼是耗時(shí)的,所以這里做了一個(gè)優(yōu)化,只會(huì)計(jì)算文件的前100KB數(shù)據(jù):

哎,到這里終于真相大白了,看到他的確是用了MD5算法,只是在后面自己又高了一個(gè)簡單的算法。所以這里我們?yōu)榱撕唵危梢灾苯影堰@三個(gè)方法拷貝到我們的Xposed模塊代碼中:

然后在把之前的intent中的sight_md5字段值替換一下:

這時(shí)候咋們在之前的攔截的onResume方法中再次調(diào)用,然后重啟設(shè)備生效,點(diǎn)擊發(fā)送:

哈哈,到這里可以看到,發(fā)送成功啦啦,好興奮呀。終于實(shí)現(xiàn)了這個(gè)功能。以后可以盡情的裝逼了。

注意:在上面我們定位一個(gè)方法在哪些地方被調(diào)用,有時(shí)候可能找不到,但是不代表這個(gè)方法真的沒有被調(diào)用,而是因?yàn)檫@個(gè)方法是抽象的,直接跟蹤可能沒有效果,這時(shí)候就需要去抽象方法的定義地方去全局搜索就可以了。

四、添加發(fā)布事件

但是到這里我們是否就結(jié)束了本次操作了,其實(shí)并沒有,因?yàn)橛械耐瑢W(xué)在上面的實(shí)踐中會(huì)發(fā)現(xiàn),有時(shí)候微信會(huì)打不開,一打開就閃退,其實(shí)這個(gè)原因是我們雖然攔截了LauncherUI頁面的onResume方法,但是這個(gè)頁面比較獨(dú)特的是微信中的首頁也是他,所以這就有可能出現(xiàn)你剛剛要打開微信頁面,有些初始化操作沒做完,而這時(shí)候你就立馬跳轉(zhuǎn)到SightUploadUI頁面去發(fā)布視頻會(huì)出現(xiàn)問題。所以這里就存在一個(gè)發(fā)布視頻的觸發(fā)時(shí)機(jī),為了更好的體驗(yàn)效果,我們決定做到更人性化,就是添加一個(gè)菜單可以點(diǎn)擊的時(shí)候再去觸發(fā)發(fā)布視頻邏輯。那么又來了一個(gè)問題就是如何在微信中添加一個(gè)我們自己想要的菜單?這個(gè)我覺得比上面那個(gè)還簡單點(diǎn),我們準(zhǔn)備在聊天界面中選中一條消息之后彈出的菜單中加一項(xiàng)子菜單:

就是在這里,我們加一項(xiàng),有的同學(xué)覺得這個(gè)可能會(huì)比較麻煩,其實(shí)很簡單,我們只要找到這個(gè)菜單定義的地方即可。直接看看步驟:想得到這個(gè)菜單定義地方很簡單,咋們先去反編譯之后的values/strings.xml文件中找到這個(gè)字符串的定義:

得到他的id值是ne,然后在Jadx中全局搜索:R.string.ne

注意:這里可能有的同學(xué)會(huì)好奇,在之前一篇文章中不是得去public.xml中找到ne對應(yīng)的id整型值,然后全局搜索嗎?這里可能和微信做了資源混淆工作有關(guān),開始的時(shí)候通過整型值死活沒找到,最后無意間用了這種方式找到了。所以以后我們可以先用標(biāo)準(zhǔn)方案去public.xml中找到id對應(yīng)的整型值,如果沒找到,在使用這種方式進(jìn)行查找即可。

上面找到這個(gè)字符串定義的地方,直接點(diǎn)擊進(jìn)入即可:

這里可以看到了,使用了系統(tǒng)提供的ContextMenu類進(jìn)行菜單定義的,這里就需要你對這個(gè)類了解了。后面添加菜單就必須用add方法來進(jìn)行添加了,不過這個(gè)方法還是比較簡單的,參數(shù)都比較好理解主要是菜單組的id值,菜單自身的id值,菜單名稱,然后在設(shè)置點(diǎn)擊事件即可。下面我們繼續(xù)看這個(gè)方法在哪里被調(diào)用了:

不過這個(gè)方法跟蹤沒有結(jié)果,猜想他可能是一個(gè)抽象方法,所以就去他定義的地方進(jìn)行查看y類:

果然是一個(gè)抽象方法,這里在跟蹤就可以了:

點(diǎn)擊查找結(jié)果:

繼續(xù)看這段代碼之前的方法和類定義:

這里有一個(gè)變量fHr,也就是菜單創(chuàng)建的回調(diào)接口,在往上面查看:

到這里就看明白了,在ChattingUI有一個(gè)內(nèi)部靜態(tài)類a,在這個(gè)類內(nèi)部開始創(chuàng)建菜單,然后定義一個(gè)fHr變量代表菜單創(chuàng)建的回調(diào)接口類型,然后在onCreateContextMenu回調(diào)方法中進(jìn)行子菜單添加工作。

好了上面就分析了菜單的創(chuàng)建代碼,下面咋們就開始操練了,還是得借助Xposed進(jìn)行攔截了,這次攔截哪個(gè)呢?咋們可以攔截ChattingUI這個(gè)類的靜態(tài)內(nèi)部類a,然后我們自己在定義一個(gè)創(chuàng)建菜單的接口,去替換fHr變量的值,最后我們只要在我們的回調(diào)接口中操作即可:

這里攔截代碼也是比較簡單的,主要是定義我們自己的回調(diào)接口,然后在替換fHr值即可,再來看看接口定義:

這里才是最關(guān)鍵的代碼了,在onCreateContextMenu回調(diào)方法中創(chuàng)建一個(gè)菜單,但是這里有一個(gè)問題就是怎么獲取到菜單組的id值,這個(gè)我們還得回到開始的那個(gè)添加菜單代碼:

看到,這里他是先通過view的tag得到dd對象,然后在調(diào)用position屬性即可,那么我們操作也就簡單了,繼續(xù)使用反射機(jī)制就可以得到這個(gè)值了。代碼如上。

代碼編寫完之后再次運(yùn)行之后,重啟設(shè)備生效,打開一個(gè)聊天室然后選中一條消息:

哈哈看到這個(gè)菜單選項(xiàng)了,咋們點(diǎn)擊之后就可以跳轉(zhuǎn)到發(fā)布頁面了:

五、知識(shí)概要與技巧總結(jié)

好了到這里我們就完成了本文提到的如何將本地小視頻發(fā)布到朋友圈功能實(shí)現(xiàn),下面來總結(jié)一下本文的實(shí)現(xiàn)步驟以及能夠?qū)W習(xí)到的逆向技巧:

1、首先猜想微信發(fā)布視頻的頁面中的幾個(gè)重要元素信息:標(biāo)題,視頻信息,地理位置等,然后這些信息可能在其他頁面通過intent傳遞過來的,那么應(yīng)該不可能傳遞整個(gè)視頻數(shù)據(jù),而是視頻路徑。

2、帶著猜想就去實(shí)踐,使用命令找到發(fā)布視頻的頁面activity名稱,然后去jadx中找到這個(gè)類分析intent中的字段,果然能夠得到五個(gè)重要的參數(shù)信息:Kdescription,KSightDraftEntrance,KSightThumbPath,KSightPath,sight_md5。

3、然后有了這五個(gè)字段再次猜想每個(gè)字段的含義,然后就直接做了一個(gè)簡單的實(shí)驗(yàn),在本地存放視頻和封面圖,然后在代碼中構(gòu)造一個(gè)intent,啟動(dòng)即可。

4、但是在啟動(dòng)頁面的時(shí)候發(fā)現(xiàn)有一個(gè)問題就是微信應(yīng)該做了頁面啟動(dòng)的安全檢查,有些頁面只能在應(yīng)用中其他頁面啟動(dòng),所以這里還需要得到微信中的一個(gè)頁面。這里就用了聊天界面,依然使用adb命令獲取聊天頁面類名稱,然后借助Xposed進(jìn)行這個(gè)頁面的onResume方法攔截,然后在攔截之后啟動(dòng)發(fā)布視頻頁面。

5、實(shí)驗(yàn)之后發(fā)現(xiàn)既然可以直接調(diào)用起來,說明上面的第一步猜想對了,那幾個(gè)字段我們也猜對了,但是這時(shí)候發(fā)現(xiàn)點(diǎn)擊發(fā)送的時(shí)候出現(xiàn)了失敗現(xiàn)象。然后分析失敗的原因有兩個(gè):一個(gè)是微信服務(wù)器對發(fā)布的視頻做了時(shí)長和大小限制,還有一個(gè)原因是視頻的MD5碼計(jì)算錯(cuò)了。我們通過修改本地視頻的大小和時(shí)長之后再次實(shí)驗(yàn)發(fā)現(xiàn)還是失敗,所以可以猜想應(yīng)該是視頻的MD5碼計(jì)算錯(cuò)誤了,微信自己有一個(gè)算法,所以得找到這個(gè)算法邏輯。

6、下面就是常規(guī)路線借助Jadx的查找方法調(diào)用功能進(jìn)行跟蹤,在這個(gè)過程中學(xué)到一個(gè)技巧就是如果發(fā)現(xiàn)一個(gè)方法沒有被調(diào)用有可能是因?yàn)檫@個(gè)方法是抽象的,具體得去抽象類中定義的地方繼續(xù)跟蹤才有結(jié)果。

7、最終跟蹤到了MD5碼的算法,我們?yōu)榱撕唵?,直接把那幾個(gè)方法拷貝出來改一下直接使用,計(jì)算視頻的MD5碼,再次實(shí)驗(yàn)之后發(fā)現(xiàn)發(fā)送成功了。

8、在最后發(fā)現(xiàn)一個(gè)問題,就是微信的很多頁面都叫做LauncherUI,所以如果攔截這個(gè)方法的onResume方法然后就發(fā)送視頻的話會(huì)出現(xiàn)問題,導(dǎo)致微信啟動(dòng)失敗。所以這里就想弄一個(gè)事件來控制發(fā)送操作。

9、在聊天頁面中選中一條消息之后可以彈出一個(gè)菜單選項(xiàng),決定在這里添加一項(xiàng)來觸發(fā)發(fā)送操作,這里定位到菜單的創(chuàng)建過程中,用到了前一篇文章中提到的查找資源id方法,但是這里需要注意的是可能微信自己做了資源混淆策略導(dǎo)致這個(gè)方法查找id值是失敗的,最后直接使用R.string.xxx這種方式找到了。

學(xué)習(xí)到的技巧:

1、新的逆向突破口,快速定位頁面,使用adb shell dumpsys activity top命令即可。

2、使用Jadx進(jìn)行方法跟蹤時(shí)候如果發(fā)現(xiàn)沒有結(jié)果,可能這個(gè)方法是抽象的,需要找到這個(gè)抽象方法最原始的定義的地方繼續(xù)跟蹤即可。

3、微信可能做了資源混淆(或者以后遇到做了資源混淆的apk)的時(shí)候,如果發(fā)現(xiàn)通過public.xml中的id值查找不到結(jié)果,可以直接使用R.xxx.xxx進(jìn)行查找id值。

六、說明

1、其實(shí)本文還可以做一個(gè)效果,就是上面在看到聊天界面選中一個(gè)消息的時(shí)候彈出一個(gè)我們自己定義的菜單,可以獲取到這個(gè)消息的類型(視頻,文字,圖片,表情等),以及具體信息,直接發(fā)送分享。而這個(gè)就需要解析選中之后的消息內(nèi)容了,當(dāng)然這個(gè)是在本文的項(xiàng)目代碼中已經(jīng)做了。這里我就不做分析了。

2、因?yàn)楸疚氖褂昧宋⑿?.3.9版本,所以這里進(jìn)行攔截的方法有:

com.tencent.mm.ui.LauncherUI的onResume方法。

com.tencent.mm.ui.chatting.ChattingUI.a的構(gòu)造方法,替換fHr變量值。

對于每一個(gè)版本混淆之后的類名會(huì)發(fā)生變化,所以不要一味的用本文提到的代碼去實(shí)踐,要先看懂所有的逆向流程,具體版本具體分析才是王道。

嚴(yán)重聲明

本文的目的只有一個(gè),分享更多逆向知識(shí)以及逆向技巧,沒有任何商業(yè)目的操作,如果有人利用本文知識(shí)實(shí)現(xiàn)任何商業(yè)目的帶來的一切法律責(zé)任將由操作者本身負(fù)責(zé)。與本文和作者沒有任何關(guān)系。也由衷的希望每位讀者能夠秉著技術(shù)學(xué)習(xí)的態(tài)度閱讀。

七、總結(jié)

本文就詳細(xì)介紹完了利用Xposed框架實(shí)現(xiàn)微信發(fā)送本地小視頻的功能,對于這個(gè)功能個(gè)人認(rèn)為還是有用的,但是對于有些人可能并沒有那么用,因?yàn)楝F(xiàn)在在朋友圈中發(fā)布視頻的人會(huì)很少,因?yàn)榧词拱l(fā)布了由于流量的限制不會(huì)有什么效果的。然后就是其實(shí)微信對于小視頻做了還是有很多限制的,而這些限制都是在服務(wù)端進(jìn)行的,比如視頻的校驗(yàn),時(shí)長,大小等。這也就粉碎了小編想發(fā)布一個(gè)幾G的電影到朋友圈的夢想。最后當(dāng)然還是希望每位讀者能夠從本文學(xué)習(xí)到更多的逆向技巧,小編沒寫這樣逆向文章就會(huì)很累,感覺自己被掏空了一樣,所以大家看完一定要記得多多點(diǎn)贊啦,如果有打賞就更好了!

相關(guān)文章

  • Android中WebView的基本配置與填坑記錄大全

    Android中WebView的基本配置與填坑記錄大全

    webview是一直都很痛恨的控件,你又不能不用,但是一旦大規(guī)模測試起來你就發(fā)現(xiàn)這個(gè)webview真是坑。各種你想不到的錯(cuò)誤 在各種奇怪的手機(jī),各種不一樣的版本里出現(xiàn)各種想不到的問題。本文就介紹了Android中WebView的基本配置與遇到的一些填坑記錄,需要的朋友可以參考下。
    2017-11-11
  • flutter中使用流式布局示例詳解

    flutter中使用流式布局示例詳解

    這篇文章主要為大家介紹了flutter中使用流式布局示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Android 中Manifest.xml文件詳解

    Android 中Manifest.xml文件詳解

    這篇文章主要介紹了Android 中Manifest.xml文件詳解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Material Design系列之自定義Behavior支持所有View

    Material Design系列之自定義Behavior支持所有View

    這篇文章主要為大家詳細(xì)介紹了Material Design系列之自定義Behavior支持所有View,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android指紋解鎖示例代碼

    Android指紋解鎖示例代碼

    本篇文章主要介紹了Android指紋解鎖示例代碼,就有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01
  • Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能

    Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能

    這篇文章主要為大家詳細(xì)介紹了Android基于ibeacon實(shí)現(xiàn)藍(lán)牙考勤功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android popupWindow彈出窗體實(shí)現(xiàn)方法分析

    Android popupWindow彈出窗體實(shí)現(xiàn)方法分析

    這篇文章主要介紹了Android popupWindow彈出窗體實(shí)現(xiàn)方法,結(jié)合具體實(shí)例形式分析了Android彈出窗體的布局及popupwindow屬性設(shè)置、事件監(jiān)聽相關(guān)操作技巧,需要的朋友可以參考下
    2017-07-07
  • Android 中 viewpager 滑動(dòng)指示器的實(shí)例代碼

    Android 中 viewpager 滑動(dòng)指示器的實(shí)例代碼

    本文通過實(shí)例代碼給大家介紹了android 中 viewpager 滑動(dòng)指示器,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動(dòng)回繞效果

    Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動(dòng)回繞效果

    這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)智能無限循環(huán)滾動(dòng)回繞效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android中Notification用法實(shí)例總結(jié)

    Android中Notification用法實(shí)例總結(jié)

    這篇文章主要介紹了Android中Notification用法,以實(shí)例形式較為詳細(xì)的分析并總結(jié)了Notification的功能與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10

最新評(píng)論