一、手机影音的主要功能
视频:
上下一首
、
暂停播放、
手势改变音量和亮度、
快进、
快退、
全屏、
长按屏幕暂停或恢复播放、
双击屏幕全屏或者恢复、
显示系统电量、
显示系统时间
音频: 上下一首、暂停播放、 歌词、播放模式、通知栏显示当前播放的音频、快进、 快退
二、主要知识点
(1)抽取Activity、Fragment的基类
(2)通过TextView、View、ViewPager实现TabLayout、谷歌市场中Tab的效果
(3)NineOldAndroids实现点击字体缩放动画效果
(4)
ContentResolver内容解析者
获取SD卡的本地视频列表
第一步:通过AsyncQueryHandler和ContentResolver获取Cursor类型的本地视频列表数据
@Override
public void initData() {
// 指定要获取哪些列
String[] projection = {Media._ID, Media.TITLE, Media.DURATION, Media.SIZE, Media.DATA};
// Cursor cursor = getActivity().getContentResolver().query(Media.EXTERNAL_CONTENT_URI, projection , null, null, null);
//异步查询帮助类避免卡死主线程
AsyncQueryHandler asyncQueryHandler = new AsyncQueryHandler(getActivity().getContentResolver()) {
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
// Utils.printCursor(cursor);
listView.setAdapter(new VideoListAdapter(getActivity(), cursor));
}
};
int token = 0; // 相当于Message.what(用于区分查询结果)
Object cookie = null; // 相当于Message.obj(用于传递参数)
String selection = null; // 选择条件
String[] selectionArgs = null; // 选择条件参数
String orderBy = Media.TITLE + " asc"; // 排序(根据Title升序排列)
asyncQueryHandler.startQuery(token, cookie, Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, orderBy);
}
第二步:创建Cursor类型的Adapter
package com.itheima.term61.mobile.player.adapter;
import com.itheima.term61.mobile.player.R;
import com.itheima.term61.mobile.player.bean.VideoItem;
import com.itheima.term61.mobile.player.util.Utils;
import android.content.Context;
import android.database.Cursor;
import android.text.format.Formatter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;
public class VideoListAdapter extends CursorAdapter {
public VideoListAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
// 创建一个View
View view = View.inflate(context, R.layout.adapter_video_list, null);
ViewHolder holder = new ViewHolder();
holder.tv_title = (TextView) view.findViewById(R.id.tv_title);
holder.tv_duration = (TextView) view.findViewById(R.id.tv_duration);
holder.tv_size = (TextView) view.findViewById(R.id.tv_size);
view.setTag(holder);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
//绑定数据
ViewHolder holder = (ViewHolder) view.getTag();
VideoItem item = VideoItem.fromCursor(cursor);
holder.tv_title.setText(item.getTitle());
holder.tv_duration.setText(Utils.formatDuration(item.getDuration()));
holder.tv_size.setText(Formatter.formatFileSize(context, item.getSize()));
}
class ViewHolder {
/** 视频名称 */
TextView tv_title;
/** 视频总时长 */
TextView tv_duration;
/** 视频大小 */
TextView tv_size;
}
}
第三步:创建Video的实体类,并将cursor类型转化成对象
package com.itheima.term61.mobile.player.bean;
import java.io.Serializable;
import android.database.Cursor;
import android.provider.MediaStore.Video.Media;
public class VideoItem implements Serializable {
private String title;
private String data;
private long duration;
private long size;
public static VideoItem fromCursor(Cursor cursor) {
VideoItem item = new VideoItem();
item.setTitle(cursor.getString(cursor.getColumnIndex(Media.TITLE)));
item.setData(cursor.getString(cursor.getColumnIndex(Media.DATA)));
item.setDuration(cursor.getLong(cursor.getColumnIndex(Media.DURATION)));
item.setSize(cursor.getLong(cursor.getColumnIndex(Media.SIZE)));
return item;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}
(5)格式化时间大小
import java.text.SimpleDateFormat;
import java.util.Calendar;
public static CharSequence formatDuration(long duration) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.add(Calendar.MILLISECOND, (int) duration);
long hourMillis = 1000 * 60 * 60; // 一小时对应的毫秒数
String pattern = (duration / hourMillis > 0) ? "HH:mm:ss" : "mm:ss";
SimpleDateFormat format = new SimpleDateFormat(pattern);
return format.format(calendar.getTime());
}