前言:上一篇文章已經實現了將assets文件中設置成動態壁紙:安卓實戰項目-動態桌面-簡單實現java
需求:既然assets文件能用於動態桌面,那麼手機中的視頻也能夠吧,有沒有大膽的想法?react
上效果圖:android
分析:
1,相似於上面圖片的搜索效果,經過點擊button,搜索出咱們須要的文件(圖片中用list演示),此時用到了遞歸遍歷搜索全部文件夾,終止條件就是文件。
2,對於輸入框中的內容進行處理,分析輸入框內容,根據內容匹配相應的文件,並展現出來;segmentfault
RxJava:原理是觀察者模式,舉個例子,兩我的a,b;a是城牆烽火臺守衛,b是城池內護衛;a守衛的職責即是觀望敵軍有沒有進犯,若是發現了,就放烽火,而後b護衛就能知道有敵軍,而後調兵支援;在咱們的搜索視頻中也是這樣,一個線程不停的搜索文件,當看到.mp4視頻文件時,就發送信號,咱們的list收到信號之後,就會調用list.add()添加這個視頻;最後搜索完全部文件夾,線程就發信號我搜索完了,而後咱們的界面的recyclerview就能夠填充list中的數據啦。純屬我的理解的rxjava,有啥不對,歡迎指正哈(溫柔點)!服務器
上代碼:app
//添加依賴,兩個,一個rxjava,一個rxandroid compile 'io.reactivex.rxjava2:rxjava:2.1.0' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' //這個就不解釋了,之前的listview升級版 compile 'com.android.support:recyclerview-v7:25.3.1'
java代碼:
搜索文件:這裏的返回結果是:存在的,可讀的,不大不小的視頻文件ide
public Observable<File> searchVideoFiles(File file) { //遍歷遞歸文件夾 if(file.isDirectory()){ return Observable.fromArray(file.listFiles()).flatMap(new Function<File, ObservableSource<File>>() { @Override public ObservableSource<File> apply(@NonNull File file) throws Exception { return searchVideoFiles(file); } }); }else{ //當是文件的時候就開始判斷這個文件是否是存在,是否是視頻文件,是否是可讀,還有的話過小的太大咱們都不要,規則tools類本身定義,全是boolean類型的別搞錯了 return Observable.just(file).filter(new Predicate<File>() { @Override public boolean test(@NonNull File file) throws Exception { //獲取文件的類型 String mimeType = Tools.getMimeType(file.getName()); return file.exists()&&file.canRead()&&Tools.isVideo(mimeType)&&Tools.passSmallAndBigFile(file.length()); } }); } }
//rootFile 指的是根目錄,也就是咱們要遍歷的文件夾 Observable.just(rootFile) .flatMap(new Function<File, ObservableSource<File>>() { @Override public ObservableSource<File> apply(@NonNull File file) throws Exception { //調用上面的方法,返回咱們須要的視頻文件 return searchVideoFiles(file); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<File>() { @Override public void onSubscribe(@NonNull Disposable d) { System.out.println("onSubscribe"); } @Override public void onNext(@NonNull File file) { String name = file.getName(); String absolutePath = file.getAbsolutePath(); String fileSize = Tools.getFileSize(file.length()); VideoBean bean = new VideoBean(name, absolutePath, fileSize); //上面找到一個咱們須要的視頻,就會調用onNext,到這裏,video是arraylist videos.add(bean); //找到一個,recyclerview就展現一個 view.showResult(videos); } @Override public void onError(@NonNull Throwable e) { System.out.println("onError"); } @Override public void onComplete() { System.out.println("onComplete"); //當搜索完之後,咱們的界面還能夠Toast一下,告訴用戶咱們搜索完畢,增長用戶體驗 } });
整體思路:搜索出須要的視頻文件,傳到list中,view展現出來!spa
好了代碼就不上了,根據上面思路多練練,rxjava我也不怎麼了解,本身多研究一下哈!
最後終極版本已提交企鵝寶求給五星好評,之後的文章就是一步步拆分這個這應用,包括服務器的搭建,數據添加!謝謝支持應用連接,點擊前往線程