手機影音3--本地視頻列表

来源:http://www.cnblogs.com/ganchuanpu/archive/2016/11/13/6058580.html
-Advertisement-
Play Games

1.寫佈局 相對佈局 : ListView和TextView和ProgressBar,初始化 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/ap ...


1.寫佈局 相對佈局 : ListView和TextView和ProgressBar,初始化

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5 
 6     <ListView
 7         android:divider="@null"
 8         android:id="@+id/listview"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent" />
11 
12     <TextView
13         android:id="@+id/tv_nomedia"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:layout_centerInParent="true"
17         android:text="沒有發現視頻..."
18         android:textColor="#000000"
19         android:textSize="18sp"
20         android:visibility="gone" />
21 
22     <ProgressBar
23         android:id="@+id/pb_loading"
24         android:layout_width="wrap_content"
25         android:layout_height="wrap_content"
26         android:layout_centerInParent="true"
27         />
28 
29 </RelativeLayout>
video_pager.xml

 

2.載入本地的視頻,在子線程中載入視頻,載入的視頻放入集合中; 設置適配器要在主線程;用Handler,設置適配器

  1 public class VideoPager extends BasePager {
  2 
  3     private ListView listview;
  4     private TextView tv_nomedia;
  5     private ProgressBar pb_loading;
  6 
  7 
  8     private VideoPagerAdapter videoPagerAdapter;
  9 
 10     /**
 11      * 裝數據集合
 12      */
 13     private ArrayList<MediaItem> mediaItems;
 14 
 15 
 16     public VideoPager(Context context) {
 17         super(context);
 18 
 19     }
 20 
 21     private Handler handler = new Handler(){
 22         @Override
 23         public void handleMessage(Message msg) {
 24             super.handleMessage(msg);
 25             if(mediaItems != null && mediaItems.size() >0){
 26                 //有數據
 27                 //設置適配器
 28                 videoPagerAdapter = new VideoPagerAdapter(context,mediaItems,true);
 29                 listview.setAdapter(videoPagerAdapter);
 30                 //把文本隱藏
 31                 tv_nomedia.setVisibility(View.GONE);
 32             }else{
 33                 //沒有數據
 34                 //文本顯示
 35                 tv_nomedia.setVisibility(View.VISIBLE);
 36             }
 37 
 38 
 39             //ProgressBar隱藏
 40             pb_loading.setVisibility(View.GONE);
 41         }
 42     };
 43 
 44     /**
 45      * 初始化當前頁面的控制項,由父類調用
 46      * @return
 47      */
 48     @Override
 49     public View initView() {
 50         View view = View.inflate(context, R.layout.video_pager,null);
 51         listview = (ListView) view.findViewById(R.id.listview);
 52         tv_nomedia = (TextView) view.findViewById(R.id.tv_nomedia);
 53         pb_loading = (ProgressBar) view.findViewById(R.id.pb_loading);
 54         //設置ListView的Item的點擊事件
 55         listview.setOnItemClickListener(new MyOnItemClickListener());
 56         return view;
 57     }
 58 
 59     class MyOnItemClickListener implements AdapterView.OnItemClickListener {
 60 
 61         @Override
 62         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 63 
 64             MediaItem mediaItem = mediaItems.get(position);
 65 //            Toast.makeText(context, "mediaItem=="+mediaItem.toString(), Toast.LENGTH_SHORT).show();
 66 
 67             //1.調起系統所有的播放-隱式意圖
 68 //            Intent intent = new Intent();
 69 //            intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*");
 70 //            context.startActivity(intent);
 71 
 72             //2.調用自己寫的播放器-顯示意圖--一個播放地址
 73 //            Intent intent = new Intent(context,SystemVideoPlayer.class);
 74 //            intent.setDataAndType(Uri.parse(mediaItem.getData()),"video/*");
 75 //            context.startActivity(intent);
 76             //3.傳遞列表數據-對象-序列化
 77             Intent intent = new Intent(context,SystemVideoPlayer.class);
 78             Bundle bundle = new Bundle();
 79             bundle.putSerializable("videolist",mediaItems);
 80             intent.putExtras(bundle);
 81             intent.putExtra("position",position);
 82             context.startActivity(intent);
 83 
 84         }
 85     }
 86 
 87 
 88     @Override
 89     public void initData() {
 90         super.initData();
 91         LogUtil.e("本地視頻的數據被初始化了。。。");
 92         //載入本地視頻數據
 93         getDataFromLocal();
 94     }
 95 
 96     /**
 97      * 從本地的sdcard得到數據
 98      * //1.遍歷sdcard,尾碼名
 99      * //2.從內容提供者裡面獲取視頻
100      * //3.如果是6.0的系統,動態獲取讀取sdcard的許可權
101      */
102     private void getDataFromLocal() {
103 
104         new Thread(){
105             @Override
106             public void run() {
107                 super.run();
108 
109 //                isGrantExternalRW((Activity) context);
110 //                SystemClock.sleep(2000);
111                 mediaItems = new ArrayList<>();
112                 ContentResolver resolver = context.getContentResolver();
113                 Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
114                 String[] objs = {
115                         MediaStore.Video.Media.DISPLAY_NAME,//視頻文件在sdcard的名稱
116                         MediaStore.Video.Media.DURATION,//視頻總時長
117                         MediaStore.Video.Media.SIZE,//視頻的文件大小
118                         MediaStore.Video.Media.DATA,//視頻的絕對地址
119                         MediaStore.Video.Media.ARTIST,//歌曲的演唱者
120 
121                 };
122                 Cursor cursor = resolver.query(uri, objs, null, null, null);
123                 if(cursor != null){
124                     while (cursor.moveToNext()){
125 
126                         MediaItem mediaItem = new MediaItem();
127 
128                         mediaItems.add(mediaItem);//寫在上面
129 
130                         String name = cursor.getString(0);//視頻的名稱
131                         mediaItem.setName(name);
132 
133                         long duration = cursor.getLong(1);//視頻的時長
134                         mediaItem.setDuration(duration);
135 
136                         long size = cursor.getLong(2);//視頻的文件大小
137                         mediaItem.setSize(size);
138 
139                         String data = cursor.getString(3);//視頻的播放地址
140                         mediaItem.setData(data);
141 
142                         String artist = cursor.getString(4);//藝術家
143                         mediaItem.setArtist(artist);
144                     }
145 
146                     cursor.close();
147                 }
148 
149                 //Handler發消息
150                 handler.sendEmptyMessage(10);
151             }
152         }.start();
153 
154     }
155 
156     /**
157      * 解決安卓6.0以上版本不能讀取外部存儲許可權的問題
158      * @param activity
159      * @return
160      */
161     public static boolean isGrantExternalRW(Activity activity) {
162         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && activity.checkSelfPermission(
163                 Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
164 
165             activity.requestPermissions(new String[]{
166                     Manifest.permission.READ_EXTERNAL_STORAGE,
167                     Manifest.permission.WRITE_EXTERNAL_STORAGE
168             }, 1);
169 
170             return false;
171         }
172 
173         return true;
174     }
175 
176 }
VideoPager.java

 

3.設置item的點擊事件,把視頻播放出來

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在的cocoapods與之前比較。有很多不一樣的地方。自己試了一試,終於搞定。現在大概紀錄一下。 1.首先查看ruby是否是最新版的。 ruby是通過rvm安裝的所以需要先安裝rvm後查看ruby是否是最新的(通過查看ruby版本列表來判斷),在終端需要中輸入以下命令: (1)安裝RVM.RVM: ...
  • 1.設置電池狀態 1_監聽電量變化廣播 2_電量刷新方法 2.得到系統時間並且更新顯示 1_得到系統時間 2_在hanlder設置更新 3.傳遞播放列表 序列化 4.監聽播放完成和播放上一個視頻 1_設置監聽播放完成 2_點擊下一個按鈕 5.播放器控制面板控制面 1_手勢識別器 2_隱藏和顯示控制面 ...
  • https://www.buzzingandroid.com/tools/android-layout-finder/ ...
  • 筆者長期從事於資料庫的開發,算了,不提當年了,因為一直用的是小語種(PowerBuilder),還是來說說這兩個最常見的控制項吧! RadioButton(單選)和CheckBox(多選) 先來看看繼承關係吧 兩個還是親兄弟,是View的第四代傳人,是View的玄孫,好小呀! RadioButton必 ...
  • 1.MediaPlayer和VideoView介紹 Android 系統中提供開發者開發多媒體應用(音視頻方面) 一,MediaPlayer, 解碼的是底層,MediaPlayer負責和底層打交道,封裝了很多方法 start,pause,stop ,播放視頻的類 這個MediaPlayer可以播放本 ...
  • 這周過的實在是艱辛,自打這周二起我的本本就開始鬧“罷工”,最後還是重裝系統了事. . . 只是可憐了我的那些被格了的軟體(悲傷辣麽大)! 往事不要再提,人生幾度風雨... 簡單的說一下(這不是介紹)Android對話框吧 就這樣吧,我要去整理一下我的“傷心事”了。 另外:麻煩有懂 sublime的大 ...
  • 因為開發微信支付需要IOS9.0版本,但是本來的XCode是6.0版本,所以最高的是8.3版本,所以要進行升級更新,但是打開更新中心發現沒有更新提示,所以到AppStore裡面進行下載,因為本機已經安裝了Xcode,所以點擊下載就變成更新,但是點擊更新卻沒有反應,死活沒有反應,後來以為是因為有了Xc ...
  • BroadCast 是android提供的跨進程通訊的有一利器。 1.非同步執行onReceiver 這是context裡面註冊廣播的API,duplex2個我們不常用的東東。 我們分別來討論這2個東西。 先討論非同步handler。 如果我們傳入一個handler,會怎樣?我們所有的onReceive ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...