




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、智能終端系統(tǒng)及應(yīng)用開(kāi)發(fā)課程設(shè)計(jì)報(bào)告題目:本地視頻播放器湖南班科級(jí):16級(jí)計(jì)算機(jī)2班技姓大名:學(xué)計(jì)學(xué) 號(hào):湖南指導(dǎo)教師:湖南科技大學(xué)計(jì)算機(jī)科學(xué)與工程本地視頻播放器1 .設(shè)計(jì)內(nèi)容首先,我們簡(jiǎn)單地來(lái)分析這個(gè) App的架構(gòu),可以知道需要3個(gè)界面。一個(gè)啟 動(dòng)頁(yè)面,一個(gè)獲取播放視頻列表界面,一個(gè)播放界面。設(shè)計(jì)啟動(dòng)頁(yè)面,需要顯眼地告訴用戶(hù) App正在啟動(dòng),但是要考慮啟動(dòng)頁(yè)面的 時(shí)長(zhǎng)(建議啟動(dòng)頁(yè)面兩秒后,跳到播放視頻列表頁(yè)面 ),設(shè)計(jì)獲取視頻列表界面,需要讓App獲取訪問(wèn)存儲(chǔ)空間的權(quán)限,App訪問(wèn)存儲(chǔ) 空間獲取了視頻信息,將視頻信息展示出來(lái)。如果 App獲取視頻信息視頻(sd卡 無(wú)視頻),提示用戶(hù)沒(méi)有視頻。止
2、匕外,App首次啟動(dòng)成功后,App搜索視頻需要一 定的時(shí)間,所以要設(shè)計(jì)一個(gè)進(jìn)度條提示用戶(hù)等待。設(shè)計(jì)播放界面,首先要考慮能否播放,如果點(diǎn)擊視頻播放進(jìn)入播放界面出現(xiàn) 播放出錯(cuò),則要提示用戶(hù)并且自動(dòng)跳轉(zhuǎn)到視頻列表界面。視頻能成功播放的話(huà), 在播放界面需要一個(gè)可以自動(dòng)隱藏的控制面板,面板里有音量控制器,返回按鈕,播放/暫停按鈕,上一個(gè)/下一個(gè)按鈕,全屏/默認(rèn)視頻畫(huà)面按鈕,視頻讀條和視頻 總時(shí)長(zhǎng)。另外,在播放畫(huà)面上方需要一個(gè)狀態(tài)欄,在狀態(tài)欄中設(shè)有電池量和系統(tǒng)時(shí) 問(wèn)。2 .設(shè)計(jì)方法2.1. 界面設(shè)計(jì)啟動(dòng)界面使用相對(duì)布局, 圖片元素相對(duì)父容器水 平居中。又在相對(duì)布局中設(shè)置了 線性布局,將進(jìn)度圈和 文字放了其
3、中,并將這個(gè)布局放在圖片元素下 方。相對(duì)父容器水平居 中。視頻列表界面有兩個(gè),圖2.1.1和圖2.1.2所示圖 2.1.2圖 2.1.1圖2.1.1是App獲取視頻時(shí),有個(gè)進(jìn)度圈會(huì)轉(zhuǎn)直到視頻以列表形式展示出來(lái) 或者視頻沒(méi)有找到會(huì)提示沒(méi)有發(fā)現(xiàn)視頻。整個(gè)視頻列表界面是以相對(duì)布局,然后在里面嵌套一個(gè)ListView, 一個(gè)相對(duì)于父容器水平居中的ProgressBar , 一個(gè)提示 用戶(hù)的TextView。圖2.1.2是視頻信息展示出來(lái)的樣子,整個(gè)界面也是相對(duì)布局,在里面嵌套和時(shí)長(zhǎng)。在父容器中添加線性布局相對(duì)于視頻圖標(biāo)的右邊,在線性布局中TextList控件,設(shè)置視頻的名稱(chēng)TextList控件設(shè)置視頻
4、大小,添加一個(gè) View控件設(shè)置視頻之間的間隔線。Fragment2.2. 架構(gòu)設(shè)計(jì)RadloGrMjpRadioButtonVed ioPage圖 2.2.1主界面分為兩個(gè)部分,一個(gè)部分是用 Fragment來(lái)做視頻信息列表,另一部分 就是用RadioGroup容器,將單選按鈕放入其中3 .實(shí)現(xiàn)方法3.1. 啟動(dòng)頁(yè)面延遲兩秒進(jìn)入主頁(yè)面1 . new一個(gè)Handler類(lèi),實(shí)例化類(lèi)對(duì)象 handler.2 .用handler調(diào)用定時(shí)器函數(shù)3 . handler.postDelayed(new Runable(),2000).4 .兩秒后,執(zhí)行線程里面的函數(shù)主要代碼如下:private Handl
5、er handler = new Handler();Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_splash);handler.postDelayed(new Runnable() Overridepublic void run() 兩秒后才執(zhí)行到這里執(zhí)行在主線程中startMainActivity();, 2000);private boolean isStartMain = fal
6、se;/*跳轉(zhuǎn)到主頁(yè)面,并且把當(dāng)前頁(yè)面關(guān)閉掉*/private void startMainActivity() if(!isStartMain)isStartMain = true;Intent intent = new Intent(this,MainActivity.class);startActivity(intent);關(guān)閉當(dāng)前頁(yè)面finish(); 3.2. 獲取本地視頻1 .從本地的sdcard得到數(shù)據(jù)2 .遍歷sdcard,后綴名3 .從內(nèi)容提供者里面獲取視頻4 .如果是6.0的系統(tǒng),動(dòng)態(tài)獲取讀取sdcard的權(quán)限主要代碼如下:Overridepublic void run()
7、 super.run();isGrantExternalRW(Activity) context); mediaitems = new ArrayList<>();獲得內(nèi)容解析者對(duì)象ContentResolver resolver = context.getContentResolver(); Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; String objs = MediaStore.Video.Media.DISPLAY_NAME,/ 視頻文件在 sdcard 的名稱(chēng) MediaStore.Video.Media
8、.DURA TION,/ 視頻總時(shí)長(zhǎng) MediaStore.Video.Media.SIZE,/ 視頻的文件大小 MediaStore.Video.Media.DA TA,/視頻的絕對(duì)地址 MediaStore.Video.Media.ARTIST,/ 歌曲的演唱者 );Cursor cursor = resolver.query(uri, objs, null, null, null); if(cursor != null)while (cursor.moveToNext()MediaItem mediaItem = new MediaItem();mediaItems.add(mediaI
9、tem);寫(xiě)在上面String name = cursor.getString(O);/視頻的名稱(chēng) mediaItem.setName(name);long duration = cursor.getLong(l);/ 視頻的時(shí)長(zhǎng) mediaItem.setDuration(duration);long size = cursor.getLong(2);/ 視頻的文件大小 mediaItem.setSize(size);String data = cursor.getString(3);/ 視頻的播放地址 mediaItem.setData(data);String artist = curs
10、or.getString(4);/ 藝術(shù)家 mediaItem.setArtist(artist);) cursor.close();)/Handler發(fā)消息 handler.sendEmptyMessage(IO);/*解決安卓6.0以上版本不能讀取外部存儲(chǔ)權(quán)限的問(wèn)題 * param activity* return*/public static boolean isGrantExternalRW(Activity activity) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.check
11、SelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED) activity.requestPermissions(new StringManifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE, 1);return false;return true;3.3. 視頻信息顯示布局1 .判斷是否有數(shù)據(jù)2 .有數(shù)據(jù)/無(wú)數(shù)據(jù)3 .有數(shù)據(jù),則調(diào)用適配器類(lèi),按照適配器
12、類(lèi)的設(shè)置將數(shù)據(jù)綁定在控件上顯示出來(lái),提示文本隱藏4 .無(wú)數(shù)據(jù),則提示文本顯示5 .有無(wú)數(shù)據(jù),ProgressBar隱藏主要代碼如下:/* VideoPager的適配器類(lèi)*/private VideoPagerAdapter videoPagerAdapter;/*裝數(shù)據(jù)集合*/private ArrayList<MediaItem> mediaItems;private Handler handler = new Handler()Overridepublic void handleMessage(Message msg) super.handleMessage(msg);if(m
13、ediaItems != null && mediaItems.size() >0)有數(shù)據(jù)設(shè)置適配器videoPagerAdapter = new VideoPagerAdapter(context,mediaItems);listview.setAdapter(videoPagerAdapter);把文本隱藏tv_nomedia.setVisibility(View.GONE);else沒(méi)有數(shù)據(jù)文本顯示tv_nomedia.setVisibility(View.VISIBLE);/ProgressBar 隱藏pb_loading.setVisibility(View.G
14、ONE);3.4. 視頻播放界面1 .設(shè)置ListView的Item的點(diǎn)擊事件2 .添加ListView的item事件的監(jiān)聽(tīng)3 .當(dāng)監(jiān)聽(tīng)到點(diǎn)擊Item事件的行為,傳遞數(shù)據(jù)給系統(tǒng)播放器4 .添加一個(gè)播放器準(zhǔn)備好的事件和一個(gè)監(jiān)聽(tīng)播放器準(zhǔn)備好的事件5 .添加一個(gè)播放完成的事件和一個(gè)監(jiān)聽(tīng)播放完成的事件6 .添加一個(gè)播放器出錯(cuò)的事件和一個(gè)監(jiān)聽(tīng)播放器出錯(cuò)的事件7 .完成一系列控制面板的功能(代碼略)主要代碼如下:public View initView() View view = View.inflate(context, R.layout.video_pager,null);listview = (Li
15、stView) view.findViewById(R.id.listview);設(shè)置ListView的Item的點(diǎn)擊事件listview.setOnItemClickListener(new MyOnItemClickListener();return view;/Item點(diǎn)擊事件的監(jiān)聽(tīng)class MyOnItemClickListener implements AdapterView.OnItemClickListener Overridepublic void onItemClick(AdapterView<?> parent, View view, int position
16、, long id) MediaItem mediaItem = mediaItems.get(position);/3.傳遞列表數(shù)據(jù)-對(duì)象-序列化Intent intent = new Intent(context,SystemVideoPlayer.class);Bundle bundle = new Bundle();bundle.putSerializable("videolist",mediaItems);intent.putExtras(bundle);intent.putExtra("position",position);context.
17、startActivity(intent);添加一個(gè)播放器準(zhǔn)備好的事件和一個(gè)監(jiān)聽(tīng)播放器準(zhǔn)備好的事件class MyOnPreparedListener implements MediaPlayer.OnPreparedListener 當(dāng)?shù)讓咏獯a準(zhǔn)備好的時(shí)候Overridepublic void onPrepared(MediaPlayer mp) videoWidth = mp.getVideoWidth();videoHeight = mp.getVideoHeight();videoview.start();/ 開(kāi)始播放/1.視頻的總時(shí)長(zhǎng),關(guān)聯(lián)總長(zhǎng)度int duration = vide
18、oview.getDuration();seekbarVideo.setMax(duration);tvDuration.setText(utils.stringForTime(duration);hideMediaController();/默認(rèn)是隱藏控制面板/2.發(fā)消息handler.sendEmptyMessage(PROGRESS);屏幕的默認(rèn)播放setVideoType(DEFAULT_SCREEN);添加一個(gè)播放完成的事件和一個(gè)監(jiān)聽(tīng)播放完成的事件class MyOnCompletionListener implements MediaPlayer.OnCompletionListener Overridepublic void onCompletion(MediaPlay
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 購(gòu)房合同補(bǔ)充協(xié)議范本
- 財(cái)務(wù)管理系統(tǒng)實(shí)施合同
- 農(nóng)業(yè)訂單合同樣本
- 材料供應(yīng)合同書(shū)樣本
- 度室內(nèi)裝飾壁畫(huà)合同:手繪墻畫(huà)服務(wù)協(xié)議
- 農(nóng)業(yè)灌溉合同轉(zhuǎn)讓協(xié)議
- 農(nóng)業(yè)機(jī)械租賃合同(范本7)
- 期貨市場(chǎng)算法交易策略定制服務(wù)考核試卷
- 家禽飼養(yǎng)業(yè)產(chǎn)品質(zhì)量安全追溯體系構(gòu)建考核試卷
- 工業(yè)控制計(jì)算機(jī)在印刷機(jī)械控制中的實(shí)踐考核試卷
- 生物醫(yī)藥研發(fā)實(shí)驗(yàn)室的安全風(fēng)險(xiǎn)評(píng)估與控制
- 合肥科技職業(yè)學(xué)院?jiǎn)握杏?jì)算機(jī)類(lèi)考試復(fù)習(xí)題庫(kù)(含答案)
- 2018-2022年北京市中考真題數(shù)學(xué)試題匯編:填空壓軸(第16題)
- 初三物理常識(shí)試卷單選題100道及答案
- 2025年吉林省吉林市事業(yè)單位招聘入伍高校畢業(yè)生54人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《智能制造技術(shù)基礎(chǔ)》課件-第6章 智能制造裝備
- 鋼結(jié)構(gòu)地下停車(chē)場(chǎng)方案
- 《上市公司治理培訓(xùn)》課件
- 新人教版小學(xué)五年級(jí)數(shù)學(xué)下冊(cè)《第一單元 觀察物體(三)》2022課標(biāo)大單元整體教學(xué)設(shè)計(jì)-全析
- 《光伏電站運(yùn)行與維護(hù)》課件-項(xiàng)目五 光伏電站常見(jiàn)故障處理
- 2024年貴州公需科目答案
評(píng)論
0/150
提交評(píng)論