前言

  关键字:Vitamio、VPlayer、Android播放器、Android影音、Android开源播放器

  本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能)完成,和播放组件关系不大,但用到一些实用的技术,欢迎交流!

声明   欢迎转载,但请保留文章原始出处:)     博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com

系列

  1、使用Vitamio打造自己的Android万能播放器(1)——准备

  2、使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

  3、使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)

正文

  一、目标

    1.1  A-Z快速切换查找影片

把手机上的联系人上的A-Z快速查找运用到了这里,查找文件更便捷。这也是"学"的米聊的 :)

    1.2  缓存扫描视频列表

首次使用扫描SD卡一遍,以后就从数据库读取了,下篇文章再加一个监听即可。

    1.3 截图

    

  二、实现

核心代码:

public classFragmentFile extendsFragmentBase implementsOnItemClickListener{

privateFileAdaptermAdapter;
privateTextViewfirst_letter_overlay;
privateImageViewalphabet_scroller;

@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){
Viewv= super.onCreateView(inflater,container,savedInstanceState);
// ~~~~~~~~~绑定控件
first_letter_overlay=(TextView)v.findViewById(R.id.first_letter_overlay);
alphabet_scroller=(ImageView)v.findViewById(R.id.alphabet_scroller);

// ~~~~~~~~~绑定事件
alphabet_scroller.setClickable( true);
alphabet_scroller.setOnTouchListener(asOnTouch);
mListView.setOnItemClickListener( this);

// ~~~~~~~~~加载数据
if( newSQLiteHelper(getActivity()).isEmpty())
newScanVideoTask().execute();
else
newDataTask().execute();

returnv;
}

/** 单击启动播放 */
@Override
public voidonItemClick(AdapterView<?>parent,Viewview, intposition, longid){
finalPFilef=mAdapter.getItem(position);
Intentintent= newIntent(getActivity(),VideoViewDemo. class);
intent.putExtra("path",f.path);
startActivity(intent);
}

private classDataTask extendsAsyncTask<Void,Void,ArrayList<PFile>>{

@Override
protected voidonPreExecute(){
super.onPreExecute();
mLoadingLayout.setVisibility(View.VISIBLE);
mListView.setVisibility(View.GONE);
}

@Override
protectedArrayList<PFile>doInBackground(Void...params){
returnFileBusiness.getAllSortFiles(getActivity());
}

@Override
protected voidonPostExecute(ArrayList<PFile>result){
super.onPostExecute(result);

mAdapter= newFileAdapter(getActivity(),FileBusiness.getAllSortFiles(getActivity()));
mListView.setAdapter(mAdapter);

mLoadingLayout.setVisibility(View.GONE);
mListView.setVisibility(View.VISIBLE);
}
}

/** 扫描SD卡 */
private classScanVideoTask extendsAsyncTask<Void,File,ArrayList<PFile>>{
privateProgressDialogpd;
privateArrayList<File>files= newArrayList<File>();

@Override
protected voidonPreExecute(){
super.onPreExecute();
pd= newProgressDialog(getActivity());
pd.setMessage("正在扫描视频文件...");
pd.show();
}

@Override
protectedArrayList<PFile>doInBackground(Void...params){
// ~~~遍历文件夹
eachAllMedias(Environment.getExternalStorageDirectory());

// ~~~入库
SQLiteHelpersqlite= newSQLiteHelper(getActivity());
SQLiteDatabasedb=sqlite.getWritableDatabase();
try{
db.beginTransaction();

SQLiteStatementstat=db.compileStatement("INSERTINTOfiles("+FilesColumns.COL_TITLE+","+FilesColumns.COL_TITLE_PINYIN+","+FilesColumns.COL_PATH+","+FilesColumns.COL_LAST_ACCESS_TIME+")VALUES(?,?,?,?)");
for(Filef:files){
Stringname=FileUtils.getFileNameNoEx(f.getName());
intindex=1;
stat.bindString(index++,name); // title
stat.bindString(index++,PinyinUtils.chineneToSpell(name)); // title_pinyin
stat.bindString(index++,f.getPath()); // path
stat.bindLong(index++,System.currentTimeMillis()); // last_access_time
stat.execute();
}
db.setTransactionSuccessful();
} catch(BadHanyuPinyinOutputFormatCombinatione){
e.printStackTrace();
} catch(Exceptione){
e.printStackTrace();
} finally{
db.endTransaction();
db.close();
}

// ~~~查询数据
returnFileBusiness.getAllSortFiles(getActivity());
}

@Override
protected voidonProgressUpdate( finalFile...values){
Filef=values[0];
files.add(f);
pd.setMessage(f.getName());
}

/** 遍历所有文件夹,查找出视频文件 */
public voideachAllMedias(Filef){
if(f!= null&&f.exists()&&f.isDirectory()){
File[]files=f.listFiles();
if(files!= null){
for(Filefile:f.listFiles()){
if(file.isDirectory()){
eachAllMedias(file);
} else if(file.exists()&&file.canRead()&&FileUtils.isVideoOrAudio(file)){
publishProgress(file);
}
}
}
}
}

@Override
protected voidonPostExecute(ArrayList<PFile>result){
super.onPostExecute(result);
mAdapter= newFileAdapter(getActivity(),result);
mListView.setAdapter(mAdapter);
pd.dismiss();
}
}

private classFileAdapter extendsArrayAdapter<PFile>{

publicFileAdapter(Contextctx,ArrayList<PFile>l){
super(ctx,l);
}

@Override
publicViewgetView( intposition,ViewconvertView,ViewGroupparent){
finalPFilef=getItem(position);
if(convertView== null){
finalLayoutInflatermInflater=getActivity().getLayoutInflater();
convertView=mInflater.inflate(R.layout.fragment_file_item, null);
}
((TextView)convertView.findViewById(R.id.title)).setText(f.title);
returnconvertView;
}

}

/**
*A-Z
*/
privateOnTouchListenerasOnTouch= newOnTouchListener(){

@Override
public booleanonTouch(Viewv,MotionEventevent){
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN: // 0
alphabet_scroller.setPressed( true);
first_letter_overlay.setVisibility(View.VISIBLE);
mathScrollerPosition(event.getY());
break;
caseMotionEvent.ACTION_UP: // 1
alphabet_scroller.setPressed( false);
first_letter_overlay.setVisibility(View.GONE);
break;
caseMotionEvent.ACTION_MOVE:
mathScrollerPosition(event.getY());
break;
}
return false;
}
};

/**
*显示字符
*
*
@param y
*/
private voidmathScrollerPosition( floaty){
intheight=alphabet_scroller.getHeight();
floatcharHeight=height/28.0f;
charc='A';
if(y<0)
y=0;
else if(y>height)
y=height;

intindex=( int)(y/charHeight)-1;
if(index<0)
index=0;
else if(index>25)
index=25;

Stringkey=String.valueOf(( char)(c+index));
first_letter_overlay.setText(key);

intposition=0;
if(index==0)
mListView.setSelection(0);
else if(index==25)
mListView.setSelection(mAdapter.getCount()-1);
else{
for(PFileitem:mAdapter.getAll()){
if(item.title_pinyin.startsWith(key)){
mListView.setSelection(position);
break;
}
position++;
}
}
}

}

代码说明:

代码是基于上篇文章,新增了播放列表缓存功能以及快速查找功能。

a). 使用了pinyin4j开源项目,用于提取文件名中的汉字的拼音,以便能够。

b). A-Z这部分的代码也是通过反编译参考米聊的,比较有实用价值

c). 入库部分使用了事务

其他代码请参见项目代码。

注意:由于是示例代码,考虑不尽周全,可能在后续章节中补充,请大家注意不要直接使用代码!例如应该检查一下SD卡是否可用等问题。

  三、项目下载

Vitamio-Demo2012-6-8.zip

  四、Vtamio与VPlayer

Vitamio:http://vov.io
VPlayer:http://vplayer.net (使用Vitamio最成功的产品,用户超过500万)

结束

这周发布新的版本稍忙,拖到周五才写这篇文章,总算没有食言 :) 功能越做越细,也会尽量往一个正式的产品方向靠,尽可能的提供有用的代码。

更多相关文章

  1. Android恶意代码分析与渗透测试
  2. Android(安卓)Architecture
  3. Android日常整理(一)---android返回键、Fragment、android分割线、
  4. Android(安卓)小项目之--SQLite 使用法门 (附源码)
  5. androidのEditTex详细使用
  6. Android应用层源码阅读笔记--Application
  7. Android开发屏幕适配
  8. android studio使用说明
  9. Android(安卓)WebView与JS交互全面详解

随机推荐

  1. android高级应用
  2. Android设计模式 观察者模式之eventbus
  3. android webkit 初始化流程
  4. Android常用控件—TextView及其子类Butto
  5. android ART
  6. android 输入框等控件的移动
  7. 判断手机是android还是ios,是否用了微信内
  8. android button属性
  9. 用 jdb 追踪 Android
  10. IFL嵌入式小组技术博客入口导航