zoukankan      html  css  js  c++  java
  • 10.1.2 完整的MediaStore视频示例

        下面是一个完整的示例,其将从MediaStore检索所有可用的视频文件,并分别显示他们的缩略图和标题。此示例中使用MediaStore.Video.Thumbnails类,它在Android(API Level 5)及以上版本可用。

    package com.nthm.androidtestActivity;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    import com.nthm.androidtest.R;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.AdapterView.OnItemClickListener;
    
    public class VideoGallery extends Activity implements OnItemClickListener {
        private Cursor cursor;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.videogallery);

        我们使用一个ListView来显示视频列表。

    1         ListView listView=(ListView) findViewById(R.id.ListView);

        接下来是想要从MediaStore.Video.Thumbnails查询中获得的列的列表。

    1         String[]thumbColumn={MediaStore.Video.Thumbnails.DATA,MediaStore.Video.Thumbnails.VIDEO_ID};

        然后是想要从MediaStore.Video.Media查询中获得的列的列表

    1         String[]mediaColumns={MediaStore.Video.Media._ID,MediaStore.Video.Media.DATA,MediaStore.Video.Media.TITLE,MediaStore.Video.Media.MIME_TYPE};

        在主查询中将选择所有在MediaStore中表示的视频。

    1         cursor=managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, mediaColumns, null, null, null);

        查询返回的每一行都将在下面的ArrayList中创建一条目录。每个目录都是在一个VideoViewInfo对象,它是在本示例中特别定义的类,以保存本活动中使用的视频信息。

    1         ArrayList<VideoViewInfo> videoRows=new ArrayList<VideoViewInfo>();

        接下来遍历在Cursor对象中包含的数据,为每行创建一个VideoViewInfo对象,并将它添加到ArrayList中。

    1         if(cursor.moveToFirst()){

        因为我们想要在遍历第一行数据之后才移动到下一行,所以采用一个do...while循环。do循环部分将在测试/执行while子句之前发生。在循环中,将为每个返回的数据行创建一个新的VideoViewInfo对象。

    1             do{
    2                 VideoViewInfo newVVI=new VideoViewInfo();

        然后可以从Cursor兑现中提取所有相关的数据。正如刚才描述的那样,我们还将使用另一个查询为每个视频提取缩略图,而且这些数据块将存储在VideoViewInfo对象中。

    1                 int id=cursor.getInt(cursor.getColumnIndex(MediaStore.Video.Media._ID));
    2                 Cursor thumbCursor=managedQuery(MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI, thumbColumn, MediaStore.Video.Thumbnails.VIDEO_ID+"="+id, null, null);
    3                 if(thumbCursor.moveToFirst()){
    4                     newVVI.thumbPath=thumbCursor.getString(thumbCursor.getColumnIndex(MediaStore.Video.Thumbnails.DATA));
    5                 }
    6                 newVVI.filePath=cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
    7                 newVVI.title=cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
    8                 newVVI.mimeType=cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE));

        最后,将VideoViewInfo对象添加到ArrayList(videoRows)中。

    1                 videoRows.add(newVVI);
    2             }while(cursor.moveToNext());
    3         }

        一旦获得了所有视频,就可以继续操作。将ListView对象的适配器设置为VideoGalleryAdapter(下面将要定义的内部类)的一个新实例。同时,设置此活动为ListView的setOnItemClickListener。

    1         listView.setAdapter(new VideoGalleryAdapter(this, videoRows));
    2         listView.setOnItemClickListener(this);
    3     }

       当单击ListView中的一个条目时,将调用onItemClick方法。这个方法将从Cursor对象中提取所需要的数据,同时将创建一个意图,以启动设备上默认的播放器应用程序来播放视频。可以创建自己的MediaPlayer,或者使用这里的VideoView类。

     1     @Override
     2     public void onItemClick(AdapterView<?> parent, View view, int position,
     3             long id) {
     4            if(cursor.moveToPosition(position)){
     5                int fileColumn=cursor.getColumnIndex(MediaStore.Video.Media.DATA);
     6                int mimeCloumn=cursor.getColumnIndex(MediaStore.Video.Media.MIME_TYPE);
     7                String videoFilePath=cursor.getString(fileColumn);
     8                String mimeType=cursor.getString(mimeCloumn);
     9                Intent intent=new Intent(android.content.Intent.ACTION_VIEW);
    10                File newFile=new File(videoFilePath);
    11                intent.setDataAndType(Uri.fromFile(newFile), mimeType);
    12                startActivity(intent);
    13            }
    14     }

        下面是一个非常基本的VideoViewInfo类,它用来保存每个返回的视频的信息。

    1     class VideoViewInfo{
    2         String filePath;
    3         String mimeType;
    4         String thumbPath;
    5         String title;
    6     }

       由于在活动中使用了ListView对象来显示每个从MediaStore查询返回的视频,因此将使用ListView来显示视频的标题和缩略图。为了将数据提交给ListView对象,需要构造一个设配器。接下来将创建一个设配器VideoGalleryAdapter,其扩展了BaseAdapter。

       构造了这个类之后,将它传递给保存所有从mediaStore查询中返回的视频的ArrayList。

       BaseAdapter是一个抽象类,所以为了扩展他,需要实现一个方法。大多数方法都很简单,仅仅是操作传入的ArrayList,如getCount和getItem方法,需要重点关注的是getView方法。

     1     class VideoGalleryAdapter extends BaseAdapter{
     2         private Context context;
     3         private List<VideoViewInfo> videoItems;
     4         private LayoutInflater inflater;
     5         public VideoGalleryAdapter(Context _context,ArrayList<VideoViewInfo> _items){
     6             context=_context;
     7             videoItems=_items;
     8             inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     9         }
    10         @Override
    11         public int getCount() {
    12             return videoItems.size();
    13         }
    14 
    15         @Override
    16         public Object getItem(int position) {
    17             return videoItems.get(position);
    18         }
    19 
    20         @Override
    21         public long getItemId(int position) {
    22             return position;
    23         }

        getView方法用于返回在ListView中表示的每一行的视图,此处向其传入一个待返回的位置(连同一个表示当前视图的View对象和一个表示父ViewGroup的对象)。

    1         @Override
    2         public View getView(int position, View convertView, ViewGroup parent) {

        为了构造将要返回的视图,需要扩展用于每一行的布局。在当前情况下,可以使用videogallery_list_item.xml中定义的布局。

    1             View videoRow=inflater.inflate(R.layout.videogallery_list_item, null);

       在扩展布局之后可以获得定义的各个视图,并使用VideoViewInfo对象的ArrayList中的数据来定义显示什么内容。下面演示了针对用于显示每个视频的缩略图的ImageView而如何实现该操作。

    1             ImageView videoThumb=(ImageView) videoRow.findViewById(R.id.ImageView);
    2             if(videoItems.get(position).thumbPath!=null){
    3                 videoThumb.setImageURI(Uri.parse(videoItems.get(position).thumbPath));
    4             }

        下面的代码获得显示视频标题的TextView,并根据VideoViewInfo对象的ArrayList中的数据来设置文本。

    1             TextView videoTitle=(TextView) videoRow.findViewById(R.id.TextView);
    2             videoTitle.setText(videoItems.get(position).title);

        最后,返回新构造的View对象。

    1             return videoRow;
    2         }
    3     }
    4 }

        下面是定义上述活动的布局的videogallery.xml文件。

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent"
     4     android:orientation="vertical"
     5     >
     6  <ListView 
     7      android:layout_width="wrap_content"
     8      android:layout_height="wrap_content"
     9      android:id="@+id/ListView"
    10      ></ListView>
    11 </LinearLayout>

        下面是用于定义ListView中每一行的布局的videogallery_list_item.xml。

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent"
     4     android:orientation="horizontal"
     5     >
     6     <ImageView 
     7         android:id="@+id/ImageView"
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         />
    11    <TextView 
    12      android:id="@+id/TextView"
    13      android:text="TextView"
    14      android:layout_width="fill_parent"
    15      android:layout_height="wrap_content"
    16      android:textSize="35dip"></TextView>
    17 </LinearLayout>

        你会注意到显示的缩略图具有不同的大小。他们是由MediaScanner服务创建的,采用与视频本身相同的大小。为了显示大小相同的缩略图,可以调整在videogallery_list_item.xml列表中列出的ImageView条目的参数。

    1     <ImageView 
    2         android:id="@+id/ImageView"
    3         android:layout_width="50dip"
    4         android:layout_height="50dip"
    5         />

      现在每个视频缩略图将显示50dipX50dip(术语dip表示“密度无关的像素”)。160dip等于显示器上的1英寸,无论该显示器上像素的分辨率或密度是多少。

  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/ZSS-Android/p/3955917.html
Copyright © 2011-2022 走看看