android 万能播放器器Vitamio在android开发中怎么用

org.eclipse.core.resources.prefs
android-support-v4.jar
pinyin4j-2.5.0.jar
vitamio.jar
alphabet_scroller_bg.xml
home_btn_bg.xml
drawable-hdpi
arrow_right.png
blackscreen.png
contact_list_scroll_normal.png
contact_list_scroll_pressed.png
default_thumbnail.png
fast_scroller_overlay.png
home_bg_checked.png
home_bg_normal.png
ic_line.png
video_back.png
video_brightness_bg.png
video_file.png
video_num_bg.png
video_num_front.png
video_online.png
video_volumn_bg.png
drawable-mdpi
logo_56.png
logo_iqiyi.png
logo_letv.png
logo_pptv.png
logo_qq.png
logo_sina.png
logo_sohu.png
logo_tudou.png
logo_youku.png
drawable-xhdpi
fragment_file.xml
fragment_file_item.xml
fragment_online.xml
fragment_online_item.xml
fragment_pager.xml
mediaplayer.xml
my_media_controller.xml
videoview.xml
colors.xml
strings.xml
styles.xml
.classpath
.gitignore
AndroidManifest.xml
project.properties
package com.nmbb.oplayer.
import java.io.F
import java.util.A
import java.util.HashS
public class FileUtils {
// /filetypes/video , &dat& , &bin& , &rms&
public static final String[] VIDEO_EXTENSIONS = { &264&, &3g2&, &3gp&, &3gp2&, &3gpp&, &3gpp2&, &3mm&, &3p2&, &60d&, &aep&, &ajp&, &amv&, &amx&, &arf&, &asf&, &asx&, &avb&, &avd&, &avi&, &avs&, &avs&, &axm&, &bdm&, &bdmv&, &bik&, &bix&, &bmk&, &box&, &bs4&, &bsf&, &byu&, &camre&, &clpi&, &cpi&, &cvc&, &d2v&, &d3v&, &dav&, &dce&, &dck&, &ddat&, &dif&, &dir&, &divx&, &dlx&, &dmb&, &dmsm&, &dmss&, &dnc&, &dpg&, &dream&, &dsy&, &dv&, &dv-avi&, &dv4&, &dvdmedia&, &dvr-ms&, &dvx&, &dxr&, &dzm&, &dzp&, &dzt&, &evo&, &eye&, &f4p&, &f4v&, &fbr&, &fbr&, &fbz&, &fcp&, &flc&, &flh&, &fli&, &flv&, &flx&, &gl&, &grasp&, &gts&, &gvi&, &gvp&, &hdmov&, &hkm&, &ifo&, &imovi&, &imovi&, &iva&, &ivf&, &ivr&, &ivs&, &izz&, &izzy&, &jts&, &lsf&, &lsx&, &m15&, &m1pg&, &m1v&, &m21&, &m21&, &m2a&, &m2p&, &m2t&, &m2ts&, &m2v&, &m4e&, &m4u&, &m4v&, &m75&, &meta&, &mgv&, &mj2&, &mjp&, &mjpg&, &mkv&, &mmv&, &mnv&, &mod&, &modd&, &moff&, &moi&, &moov&, &mov&, &movie&, &mp21&, &mp21&, &mp2v&, &mp4&, &mp4v&, &mpe&, &mpeg&, &mpeg4&, &mpf&, &mpg&, &mpg2&, &mpgin&, &mpl&, &mpls&, &mpv&, &mpv2&, &mqv&, &msdvd&, &msh&, &mswmm&, &mts&, &mtv&, &mvb&, &mvc&, &mvd&, &mve&, &mvp&, &mxf&, &mys&, &ncor&, &nsv&, &nvc&, &ogm&, &ogv&, &ogx&, &osp&, &par&, &pds&, &pgi&, &piv&, &playlist&, &pmf&, &prel&, &pro&, &prproj&, &psh&, &pva&, &pvr&, &pxv&, &qt&, &qtch&, &qtl&, &qtm&, &qtz&, &rcproject&, &rdb&, &rec&, &rm&, &rmd&, &rmp&, &rmvb&, &roq&, &rp&, &rts&, &rts&, &rum&, &rv&, &sbk&, &sbt&, &scm&, &scm&, &scn&, &sec&, &seq&, &sfvidcap&, &smil&, &smk&, &sml&, &smv&, &spl&, &ssm&, &str&, &stx&, &svi&, &swf&, &swi&, &swt&, &tda3mt&, &tivo&, &tix&, &tod&, &tp&, &tp0&, &tpd&, &tpr&, &trp&, &ts&, &tvs&, &vc1&, &vcr&, &vcv&, &vdo&, &vdr&, &veg&, &vem&, &vf&, &vfw&, &vfz&, &vgz&, &vid&, &viewlet&, &viv&, &vivo&, &vlab&, &vob&, &vp3&, &vp6&, &vp7&, &vpj&, &vro&, &vsp&, &w32&, &wcp&, &webm&, &wm&, &wmd&, &wmmp&, &wmv&, &wmx&, &wp3&, &wpl&, &wtv&, &wvx&, &xfl&, &xvid&, &yuv&, &zm1&, &zm2&, &zm3&, &zmv& };
// /filetypes/audio , &spx& , &mid& , &sf&
public static final String[] AUDIO_EXTENSIONS = { &4mp&, &669&, &6cm&, &8cm&, &8med&, &8svx&, &a2m&, &aa&, &aa3&, &aac&, &aax&, &abc&, &abm&, &ac3&, &acd&, &acd-bak&, &acd-zip&, &acm&, &act&, &adg&, &afc&, &agm&, &ahx&, &aif&, &aifc&, &aiff&, &ais&, &akp&, &al&, &alaw&, &all&, &amf&, &amr&, &ams&, &ams&, &aob&, &ape&, &apf&, &apl&, &ase&, &at3&, &atrac&, &au&, &aud&, &aup&, &avr&, &awb&, &band&, &bap&, &bdd&, &box&, &bun&, &bwf&, &c01&, &caf&, &cda&, &cdda&, &cdr&, &cel&, &cfa&, &cidb&, &cmf&, &copy&, &cpr&, &cpt&, &csh&, &cwp&, &d00&, &d01&, &dcf&, &dcm&, &dct&, &ddt&, &dewf&, &df2&, &dfc&, &dig&, &dig&, &dls&, &dm&, &dmf&, &dmsa&, &dmse&, &drg&, &dsf&, &dsm&, &dsp&, &dss&, &dtm&, &dts&, &dtshd&, &dvf&, &dwd&, &ear&, &efa&, &efe&, &efk&, &efq&, &efs&, &efv&, &emd&, &emp&, &emx&, &esps&, &f2r&, &f32&, &f3r&, &f4a&, &f64&, &far&, &fff&, &flac&, &flp&, &fls&, &frg&, &fsm&, &fzb&, &fzf&, &fzv&, &g721&, &g723&, &g726&, &gig&, &gp5&, &gpk&, &gsm&, &gsm&, &h0&, &hdp&, &hma&, &hsb&, &ics&, &iff&, &imf&, &imp&, &ins&, &ins&, &it&, &iti&, &its&, &jam&, &k25&, &k26&, &kar&, &kin&, &kit&, &kmp&, &koz&, &koz&, &kpl&, &krz&, &ksc&, &ksf&, &kt2&, &kt3&, &ktp&, &l&, &la&, &lqt&, &lso&, &lvp&, &lwv&, &m1a&, &m3u&, &m4a&, &m4b&, &m4p&, &m4r&, &ma1&, &mdl&, &med&, &mgv&, &midi&, &miniusf&, &mka&, &mlp&, &mmf&, &mmm&, &mmp&, &mo3&, &mod&, &mp1&, &mp2&, &mp3&, &mpa&, &mpc&, &mpga&, &mpu&, &mp_&, &mscx&, &mscz&, &msv&, &mt2&, &mt9&, &mte&, &mti&, &mtm&, &mtp&, &mts&, &mus&, &mws&, &mxl&, &mzp&, &nap&, &nki&, &nra&, &nrt&, &nsa&, &nsf&, &nst&, &ntn&, &nvf&, &nwc&, &odm&, &oga&, &ogg&, &okt&, &oma&, &omf&, &omg&, &omx&, &ots&, &ove&, &ovw&, &pac&, &pat&, &pbf&, &pca&, &pcast&, &pcg&, &pcm&, &peak&, &phy&, &pk&, &pla&, &pls&, &pna&, &ppc&, &ppcx&, &prg&, &prg&, &psf&, &psm&, &ptf&, &ptm&, &pts&, &pvc&, &qcp&, &r&, &r1m&, &ra&, &ram&, &raw&, &rax&, &rbs&, &rcy&, &rex&, &rfl&, &rmf&, &rmi&, &rmj&, &rmm&, &rmx&, &rng&, &rns&, &rol&, &rsn&, &rso&, &rti&, &rtm&, &rts&, &rvx&, &rx2&, &s3i&, &s3m&, &s3z&, &saf&, &sam&, &sb&, &sbg&, &sbi&, &sbk&, &sc2&, &sd&, &sd&, &sd2&, &sd2f&, &sdat&, &sdii&, &sds&, &sdt&, &sdx&, &seg&, &seq&, &ses&, &sf2&, &sfk&, &sfl&, &shn&, &sib&, &sid&, &sid&, &smf&, &smp&, &snd&, &snd&, &snd&, &sng&, &sng&, &sou&, &sppack&, &sprg&, &sseq&, &sseq&, &ssnd&, &stm&, &stx&, &sty&, &svx&, &sw&, &swa&, &syh&, &syw&, &syx&, &td0&, &tfmx&, &thx&, &toc&, &tsp&, &txw&, &u&, &ub&, &ulaw&, &ult&, &ulw&, &uni&, &usf&, &usflib&, &uw&, &uwf&, &vag&, &val&, &vc3&, &vmd&, &vmf&, &vmf&, &voc&, &voi&, &vox&, &vpm&, &vqf&, &vrf&, &vyf&, &w01&, &wav&, &wav&, &wave&, &wax&, &wfb&, &wfd&, &wfp&, &wma&, &wow&, &wpk&, &wproj&, &wrk&, &wus&, &wut&, &wv&, &wvc&, &wve&, &wwu&, &xa&, &xa&, &xfs&, &xi&, &xm&, &xmf&, &xmi&, &xmz&, &xp&, &xrns&, &xsb&, &xspf&, &xt&, &xwb&, &ym&, &zvd&, &zvr& };
private static final HashSet&String& mHashV
private static final HashSet&String& mHashA
private static final double KB = 1024.0;
private static final double MB = KB * KB;
private static final double GB = KB * KB * KB;
mHashVideo = new HashSet&String&(Arrays.asList(VIDEO_EXTENSIONS));
mHashAudio = new HashSet&String&(Arrays.asList(AUDIO_EXTENSIONS));
/** 鏄?惁鏄?煶棰戞垨鑰呰?棰?*/
public static boolean isVideoOrAudio(File f) {
final String ext = getFileExtension(f);
return mHashVideo.contains(ext) || mHashAudio.contains(ext);
public static boolean isVideoOrAudio(String f) {
final String ext = getUrlExtension(f);
return mHashVideo.contains(ext) || mHashAudio.contains(ext);
public static boolean isVideo(File f) {
final String ext = getFileExtension(f);
return mHashVideo.contains(ext);
/** 鑾峰彇鏂囦欢鍚庣紑 */
public static String getFileExtension(File f) {
if (f != null) {
String filename = f.getName();
int i = filename.lastIndexOf('.');
if (i & 0 && i & filename.length() - 1) {
return filename.substring(i + 1).toLowerCase();
public static String getUrlExtension(String url) {
if (!StringUtils.isEmpty(url)) {
int i = url.lastIndexOf('.');
if (i & 0 && i & url.length() - 1) {
return url.substring(i + 1).toLowerCase();
return &&;
public static String getFileNameNoEx(String filename) {
if ((filename != null) && (filename.length() & 0)) {
int dot = filename.lastIndexOf('.');
if ((dot & -1) && (dot & (filename.length()))) {
return filename.substring(0, dot);
public static String showFileSize(long size) {
String fileS
if (size & KB)
fileSize = size + &B&;
else if (size & MB)
fileSize = String.format(&%.1f&, size / KB) + &KB&;
else if (size & GB)
fileSize = String.format(&%.1f&, size / MB) + &MB&;
fileSize = String.format(&%.1f&, size / GB) + &GB&;
return fileS
Copyright(C)
OKBASE.NET All Rights Reserved 好库网 版权所有评论-3623&
trackbacks-6
前言 Vitamio和OPlayer系列文章得到广大同行的关注和支持,非常感谢!离系列文章的上篇有几个月了,各种忙暂停了本系列文章,非常抱歉!离OPlayer正式上线还有距离,还有很多要做的事情,继续前行!&声明  欢迎转载,但请保留文章原始出处:)&    博客园:    农民伯伯: &&&正文 一、注意事项
本章节使用的是()请大家及时更新。
注意3.0整合的适合建议使用Library方式整合Vitamio,否则需要反射或者使用OPlayer的方法,覆盖R(参见代码)。&& 二、主要代码:/**&媒体扫描&*/public&class&MediaScannerService&extends&Service&implements&Runnable&{&&&&private&static&final&String&SERVICE_NAME&=&"com.nmbb.oplayer.service.MediaScannerService";&&&&/**&扫描文件夹&*/&&&&public&static&final&String&EXTRA_DIRECTORY&=&"scan_directory";&&&&/**&扫描文件&*/&&&&public&static&final&String&EXTRA_FILE_PATH&=&"scan_file";&&&&public&static&final&String&EXTRA_MIME_TYPE&=&"mimetype";&&&&public&static&final&int&SCAN_STATUS_NORMAL&=&-1;&&&&/**&开始扫描&*/&&&&public&static&final&int&SCAN_STATUS_START&=&0;&&&&/**&正在扫描&扫描到一个视频文件&*/&&&&public&static&final&int&SCAN_STATUS_RUNNING&=&1;&&&&/**&扫描完成&*/&&&&public&static&final&int&SCAN_STATUS_END&=&2;&&&&/**&&*/&&&&private&ArrayList&IMediaScannerObserver&&observers&=&new&ArrayList&IMediaScannerObserver&();&&&&private&ConcurrentHashMap&String,&String&&mScanMap&=&new&ConcurrentHashMap&String,&String&();&&&&/**&当前状态&*/&&&&private&volatile&int&mServiceStatus&=&SCAN_STATUS_NORMAL;&&&&private&DbHelper&POMedia&&mDbH&&&&private&Map&String,&Object&&mDbWhere&=&new&HashMap&String,&Object&(2);&&&&@Override&&&&public&void&onCreate()&{&&&&&&&&super.onCreate();&&&&&&&&mDbHelper&=&new&DbHelper&POMedia&();&&&&}&&&&/**&是否正在运行&*/&&&&public&static&boolean&isRunning()&{&&&&&&&&ActivityManager&manager&=&(ActivityManager)&OPlayerApplication.getContext().getSystemService(Context.ACTIVITY_SERVICE);&&&&&&&&for&(RunningServiceInfo&service&:&manager.getRunningServices(Integer.MAX_VALUE))&{&&&&&&&&&&&&if&(SERVICE_NAME.equals(service.service.getClassName()))&&&&&&&&&&&&&&&&return&true;&&&&&&&&}&&&&&&&&return&false;&&&&}&&&&@Override&&&&public&int&onStartCommand(Intent&intent,&int&flags,&int&startId)&{&&&&&&&&if&(intent&!=&null)&&&&&&&&&&&&parseIntent(intent);&&&&&&&&return&super.onStartCommand(intent,&flags,&startId);&&&&}&&&&/**&解析Intent&*/&&&&private&void&parseIntent(final&Intent&intent)&{&&&&&&&&final&Bundle&arguments&=&intent.getExtras();&&&&&&&&if&(arguments&!=&null)&{&&&&&&&&&&&&if&(arguments.containsKey(EXTRA_DIRECTORY))&{&&&&&&&&&&&&&&&&String&directory&=&arguments.getString(EXTRA_DIRECTORY);&&&&&&&&&&&&&&&&Logger.i("onStartCommand:"&+&directory);&&&&&&&&&&&&&&&&//扫描文件夹&&&&&&&&&&&&&&&&if&(!mScanMap.containsKey(directory))&&&&&&&&&&&&&&&&&&&&mScanMap.put(directory,&"");&&&&&&&&&&&&}&else&if&(arguments.containsKey(EXTRA_FILE_PATH))&{&&&&&&&&&&&&&&&&//单文件&&&&&&&&&&&&&&&&String&filePath&=&arguments.getString(EXTRA_FILE_PATH);&&&&&&&&&&&&&&&&Logger.i("onStartCommand:"&+&filePath);&&&&&&&&&&&&&&&&if&(!StringUtils.isEmpty(filePath))&{&&&&&&&&&&&&&&&&&&&&if&(!mScanMap.containsKey(filePath))&&&&&&&&&&&&&&&&&&&&&&&&mScanMap.put(filePath,&arguments.getString(EXTRA_MIME_TYPE));&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&scanFile(filePath,&arguments.getString(EXTRA_MIME_TYPE));&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&if&(mServiceStatus&==&SCAN_STATUS_NORMAL&||&mServiceStatus&==&SCAN_STATUS_END)&{&&&&&&&&&&&&new&Thread(this).start();&&&&&&&&&&&&//scan();&&&&&&&&}&&&&}&&&&@Override&&&&public&void&run()&{&&&&&&&&scan();&&&&}&&&&/**&扫描&*/&&&&private&void&scan()&{&&&&&&&&//开始扫描&&&&&&&&notifyObservers(SCAN_STATUS_START,&null);&&&&&&&&while&(mScanMap.keySet().size()&&&0)&{&&&&&&&&&&&&String&path&=&"";&&&&&&&&&&&&for&(String&key&:&mScanMap.keySet())&{&&&&&&&&&&&&&&&&path&=&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&}&&&&&&&&&&&&if&(mScanMap.containsKey(path))&{&&&&&&&&&&&&&&&&String&mimeType&=&mScanMap.get(path);&&&&&&&&&&&&&&&&if&("".equals(mimeType))&{&&&&&&&&&&&&&&&&&&&&scanDirectory(path);&&&&&&&&&&&&&&&&}&else&{&&&&&&&&&&&&&&&&&&&&scanFile(path,&mimeType);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&//扫描完成一个&&&&&&&&&&&&&&&&mScanMap.remove(path);&&&&&&&&&&&&}&&&&&&&&&&&&//任务之间歇息一秒&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&Thread.sleep(1000);&&&&&&&&&&&&}&catch&(InterruptedException&e)&{&&&&&&&&&&&&&&&&Logger.e(e);&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&//全部扫描完成&&&&&&&&notifyObservers(SCAN_STATUS_END,&null);&&&&&&&&//第一次扫描&&&&&&&&OPreference&pref&=&new&OPreference(this);&&&&&&&&if&(pref.getBoolean(OPlayerApplication.PREF_KEY_FIRST,&true))&&&&&&&&&&&&pref.putBooleanAndCommit(OPlayerApplication.PREF_KEY_FIRST,&false);&&&&&&&&//停止服务&&&&&&&&stopSelf();&&&&}&&&&private&Handler&mHandler&=&new&Handler()&{&&&&&&&&@Override&&&&&&&&public&void&handleMessage(Message&msg)&{&&&&&&&&&&&&super.handleMessage(msg);&&&&&&&&&&&&for&(IMediaScannerObserver&s&:&observers)&{&&&&&&&&&&&&&&&&if&(s&!=&null)&{&&&&&&&&&&&&&&&&&&&&s.update(msg.what,&(POMedia)&msg.obj);&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&};&&&&/**&扫描文件&*/&&&&private&void&scanFile(String&path,&String&mimeType)&{&&&&&&&&save(new&POMedia(path,&mimeType));&&&&}&&&&/**&扫描文件夹&*/&&&&private&void&scanDirectory(String&path)&{&&&&&&&&eachAllMedias(new&File(path));&&&&}&&&&/**&递归查找视频&*/&&&&private&void&eachAllMedias(File&f)&{&&&&&&&&if&(f&!=&null&&&&f.exists()&&&&f.isDirectory())&{&&&&&&&&&&&&File[]&files&=&f.listFiles();&&&&&&&&&&&&if&(files&!=&null)&{&&&&&&&&&&&&&&&&for&(File&file&:&f.listFiles())&{&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&Logger.i(f.getAbsolutePath());&&&&&&&&&&&&&&&&&&&&if&(file.isDirectory())&{&&&&&&&&&&&&&&&&&&&&&&&&//忽略.开头的文件夹&&&&&&&&&&&&&&&&&&&&&&&&if&(!file.getAbsolutePath().startsWith("."))&&&&&&&&&&&&&&&&&&&&&&&&&&&&eachAllMedias(file);&&&&&&&&&&&&&&&&&&&&}&else&if&(file.exists()&&&&file.canRead()&&&&FileUtils.isVideo(file))&{&&&&&&&&&&&&&&&&&&&&&&&&save(new&POMedia(file));&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&/**&&&&&*&保存入库&&&&&*&&&&&&*&@throws&FileNotFoundException&&&&&*/&&&&private&void&save(POMedia&media)&{&&&&&&&&mDbWhere.put("path",&media.path);&&&&&&&&mDbWhere.put("last_modify_time",&media.last_modify_time);&&&&&&&&//检测&&&&&&&&if&(!mDbHelper.exists(media,&mDbWhere))&{&&&&&&&&&&&&try&{&&&&&&&&&&&&&&&&if&(media.title&!=&null&&&&media.title.length()&&&0)&&&&&&&&&&&&&&&&&&&&media.title_key&=&PinyinUtils.chineneToSpell(media.title.charAt(0)&+&"");&&&&&&&&&&&&}&catch&(Exception&ex)&{&&&&&&&&&&&&&&&&Logger.e(ex);&&&&&&&&&&&&}&&&&&&&&&&&&media.last_access_time&=&System.currentTimeMillis();&&&&&&&&&&&&//提取缩略图&&&&&&&&&&&&//&&&&&&&&&&&&extractThumbnail(media);&&&&&&&&&&&&media.mime_type&=&FileUtils.getMimeType(media.path);&&&&&&&&&&&&//入库&&&&&&&&&&&&mDbHelper.create(media);&&&&&&&&&&&&//扫描到一个&&&&&&&&&&&&notifyObservers(SCAN_STATUS_RUNNING,&media);&&&&&&&&}&&&&}&&&&/**&提取生成缩略图&*/&&&&private&void&extractThumbnail(POMedia&media)&{&&&&&&&&final&Context&ctx&=&OPlayerApplication.getContext();&&&&&&&&//&&&&&&&&ThumbnailUtils.&&&&&&&&Bitmap&bitmap&=&ThumbnailUtils.createVideoThumbnail(ctx,&media.path,&ThumbnailUtils.MINI_KIND);&&&&&&&&try&{&&&&&&&&&&&&if&(bitmap&==&null)&{&&&&&&&&&&&&&&&&//缩略图创建失败&&&&&&&&&&&&&&&&bitmap&=&Bitmap.createBitmap(ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_WIDTH,&ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_HEIGHT,&Bitmap.Config.RGB_565);&&&&&&&&&&&&}&&&&&&&&&&&&media.width&=&bitmap.getWidth();&&&&&&&&&&&&media.height&=&bitmap.getHeight();&&&&&&&&&&&&//缩略图&&&&&&&&&&&&bitmap&=&ThumbnailUtils.extractThumbnail(bitmap,&ConvertUtils.dipToPX(ctx,&ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_WIDTH),&ConvertUtils.dipToPX(ctx,&ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_HEIGHT),&ThumbnailUtils.OPTIONS_RECYCLE_INPUT);&&&&&&&&&&&&if&(bitmap&!=&null)&{&&&&&&&&&&&&&&&&//将缩略图存到视频当前路径&&&&&&&&&&&&&&&&File&thum&=&new&File(OPlayerApplication.OPLAYER_VIDEO_THUMB,&UUID.randomUUID().toString());&&&&&&&&&&&&&&&&media.thumb_path&=&thum.getAbsolutePath();&&&&&&&&&&&&&&&&//thum.createNewFile();&&&&&&&&&&&&&&&&FileOutputStream&iStream&=&new&FileOutputStream(thum);&&&&&&&&&&&&&&&&pressFormat.JPEG,&85,&iStream);&&&&&&&&&&&&&&&&iStream.close();&&&&&&&&&&&&}&&&&&&&&&&&&//入库&&&&&&&&}&catch&(Exception&ex)&{&&&&&&&&&&&&Logger.e(ex);&&&&&&&&}&finally&{&&&&&&&&&&&&if&(bitmap&!=&null)&&&&&&&&&&&&&&&&bitmap.recycle();&&&&&&&&}&&&&}&&&&//&~~~&状态改变&&&&&/**&通知状态改变&*/&&&&private&void&notifyObservers(int&flag,&POMedia&media)&{&&&&&&&&mHandler.sendMessage(mHandler.obtainMessage(flag,&media));&&&&}&&&&/**&增加观察者&*/&&&&public&void&addObserver(IMediaScannerObserver&s)&{&&&&&&&&synchronized&(this)&{&&&&&&&&&&&&if&(!observers.contains(s))&{&&&&&&&&&&&&&&&&observers.add(s);&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&/**&删除观察者&*/&&&&public&synchronized&void&deleteObserver(IMediaScannerObserver&s)&{&&&&&&&&observers.remove(s);&&&&}&&&&/**&删除所有观察者&*/&&&&public&synchronized&void&deleteObservers()&{&&&&&&&&observers.clear();&&&&}&&&&public&interface&IMediaScannerObserver&{&&&&&&&&/**&&&&&&&&&*&&&&&&&&&&*&@param&flag&0&开始扫描&1&正在扫描&2&扫描完成&&&&&&&&&*&@param&file&扫描到的视频文件&&&&&&&&&*/&&&&&&&&public&void&update(int&flag,&POMedia&media);&&&&}&&&&//&~~~&Binder&&&&&private&final&MediaScannerServiceBinder&mBinder&=&new&MediaScannerServiceBinder();&&&&public&class&MediaScannerServiceBinder&extends&Binder&{&&&&&&&&public&MediaScannerService&getService()&{&&&&&&&&&&&&return&MediaScannerService.this;&&&&&&&&}&&&&}&&&&@Override&&&&public&IBinder&onBind(Intent&intent)&{&&&&&&&&return&mB&&&&}}
代码说明:
1、默认Service是在主线程中运行的,扫描比较耗时,这里启用了一个新的线程。
2、使用了观察者模式来通知数据变化,没有用广播。
3、暂时去掉了截图,截图报错,还在修改。&& 三、OPlayer
请移步#Taocode(SVN):(没有账户的请注册一个即可)
项目地址:
SVN地址:&
a). 数据库层使用了ormlite框架。
b). 将扫描视频文件修改为后台服务,单独起了一个线程。
c). 整合Vitamio 3.0,修改反射为覆盖io.voo.vitamio.R。&& 四、Vitamio
已建立Vitamio开发者联盟官方QQ群!群号为:
注意:目前仅接受已经开发基于Vitamio产品的开发者申请加入,申请理由请填写产品的名称和链接!
官方微博:&& 五、八卦
想在这里澄清一下OPlayer与VPlayer、Vitamio的关系:
1、OPlayer这个项目是跟公司没有关系,纯属于个人业余爱好作品。
2、OPlayer使用的是Vitamio,但不会比大家优先获取Vitamio的新版本。
3、OPlayer非官方示例。&结束 &更加深刻体会“坚持就是胜利”这句话的意义。
阅读(...) 评论()&&&&使用Vitamio打造自己的Android万能播放器
使用Vitamio打造自己的Android万能播放器
很好用的一个例子,想要学习的朋友可以下载看看!
若举报审核通过,可奖励20下载分
被举报人:
myk7694503
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
移动开发下载排行vitamio使用教程
前言 Vitamio项目发展迅猛,官方群突破400位开发者,基于Vitamio的项目突破1000个,使用Vitamio提供优质播放体验的用户超过5000万.也欢迎大家分享你的Vitamio使用经验,本文将进一步介绍Vitamio的简单使用方法. 声明 欢迎转载,但请保留文章原始出处:) 博客园: 农民伯伯: http://over14 ...
在开发中,用到了视频播放的功能,看到网上现成的开源的Vitamio已经很成熟了.就本着拿来主义直接实用了. 但是播放中实用的进度条的位置有时候跟自己需求不是那么一致. 下面是教程 1.首先修改Vitamio中MediaController类,在此类中新加一个构造函数,代码如下: public MediaController(Context context,boolean fromXml,View container) { super(context); initController(contex
准备用 Vitamio 做点东西.下完了资源后却不会用,搜了各种教程.最后还算摸索出来了.总结一下.
1. 下载资源
(1) 核心插件 VitamioBundle 下载地址:/yixia/VitamioBundle
(2) 官方示例 VitamioDemo 下载地址:/yixia/VitamioDemo 注:下载地址的上级目录有很多开源代码.可以看看.
2.导入资源.
不才想入门流媒体播放器,开发一款android应用,可以播放流媒体, 看中了vitamio. 去官网(https://www.vitamio.org/en/)下载了sdk和demo,但是不知道怎么使用, 希望各位能帮帮忙, 给点意见. 感恩不尽 不是有中文版的API文档吗?自己琢磨下呗... 附:农民伯伯的教程--使用Vitamio打造自己的Android万能播放器 跟 自带的meidiaplayer 一样的用法.
在android上,视频/音频流直播是极少有人关注的一部分.每当我们讨论流媒体,RTMP(Real Time Messaging Protocol)是不可或缺的.RTMP是一个基本的视频/音频直播流协议,但是不幸的是Android标准的VideoView不支持RTMP的播放.因此,如果想在android上播放RTMP直播流,你必须使用支持RTMP协议的库.在本教程中我们将讨论如 ...
原文链接 : How To Stream RTMP live in Android原文作者 : Mohit Gupt译文出自 : 开发技术前线 译者 : ayyb1988校对者: chaossss状态 : 完成 在android上,视频/音频流直播是极少有人关注的一部分.每当我们讨论流媒体,RTMP(Real Time Messaging Protoco ...
日0 Vitamio 新手入门
https://www.vitamio.org/docs/Basic/.html /yixia/VitamioBundle下载 VitamioBundle 工程后当导入的时候其实是有两个项目的. (InitActivity)和(VitamioListActivity)这里的 InitActivity 是我们需要的 ,当然 VitamioListActivity 也是我们需
集群概念介绍(一) 概述:写下本文档的初衷和动力,来源于上篇的&oracle基本操作手册&.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体系的总结,一则进行回顾复习,另则便于查询使用.本图文文档亦源于此.阅读Oracle RAC安装与使用教程前,笔者先对这篇文章整体构思和形成进行梳理.由于阅读者知识储备层次不同,我将从Oracle RAC安装前的准备与规划开始进行整体介绍安装部署Oracle RAC.始于唐博士指导,对数据库集群进行配置安装,前后经历2,3个
TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository
首 先要Checkout服务器端的Repository,所谓的Checkout就是指获得服务器端指定的Repository.存储的所有文件这个 Checkout和Visual Source Safe的Checkout意义完全不一样,VSS的Checkout指的是锁定某个文件,如果你以前使用过VSS,在学习Subversion时这个问 题一定要注意.Checkout
[背景] 因为项目的需要,需要在java web 项目中使用到地图,厂家提供的是dwg格式的地图,而我们采用的是mapxtreme java技术,所以先要把dwg格式的地图转成mapxtreme java可以解析的格式,即gst格式.关于这方面的资料,网上甚少,加上软件难找,中间走了不少弯路.基于mapxtreme java以后可能还要能到,dwg转gst的过程也必不可少,所以 ...
jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过.但是不会熟练使用grunt,那你就真的真的真的out了(三个“真的”重复,表示重点).至于grunt的作用,这里不详细说了,总之你如果做web前端开发,你一定要用grunt. ...
--目录-- EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 (3 8) EntityFramework 5.0 CodeFirst 教程02-删除和修改/架构改变异常的处理 (4 0) --目录--
上节,我们搭建了一个简单的环境,并且通过代码First的方式,生成数据库,创 ...
-目录 EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 -目录
网上关于EntityFramework 5.0的教程很多,但是大多数都是代码整理不清晰,有些甚至是拷贝,代码丢失等问题,本人最近也有一个项目是用到EntityFramework 5.0 并且是code first的使用方式,鉴于这个在谷歌上面找了一本国外人写的cod ...
通用的示例说明: 本系列博客只讨论工具的基础,不讨论任何语言. 甚至不讨论快捷键:-) 可以用鼠标就完成本教程 IDE默认指代的是Visual Studio 2013 Community Edition. 本系列文章的结尾,你可以熟练地使用它写程序. 将Visual Studio启动后的默认布局状态称为主窗口,主窗口标题栏中显示的项目名称不必要. 在日常口语和Windows资源管理器的基础上定义了几个描述菜单操作的符号:[].{}./.&&.=.(,). 检查一个设置项的表示方法为: [窗口名
关于liaoxuefeng的python3教程 实战第四天. 地址:/wiki/958fa6d3a2e542c000/719a4c5c42ef08e4f44ad0f293ad728a27b000#0 编写数据访问代码 接下来,就可以真正开始编写代码操作对象了.比如,对于User对象,我们就可以做如下操作: 这一段代码会报错,于是我改成了这样: import
Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这系列的教程讲的是Log4Net的应用.学习完这系列的教程,你可以实现如下图一样整洁.醒目的日志文件.教程中的每一篇文章都有可以运行的例子,并且教程里面的例子基本上都是典型的应用,你 ...
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)
邮件基础理论知识 2)
邮件发送相关.NET类库 3)
介绍我开发的一个发送邮件的小组件(MailHelper) 4)
MailHelper组件的一个 ...
这是1年多以前我在公司所做讲座的讲义,现在与园友们分享,欢迎拿去使用.一起讨论.文中有若干思考题,对园友们是小菜一碟.另有设计模式讲义一篇,随后发布.博文上了首页,感谢博客园团队推荐,也感谢所有园友的支持.经园友提醒,我们推荐新手使用ReSharper插件,它可以自动提示不符合代码规范的地方. 1 概述 1.1 意义 “.NET平台开发规范”包括两方面内容:代码规范.最佳实践. ...
LaTeX新人教程,30分钟从完全陌生到基本入门by Nan 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. 本教程面向对LaTeX完全无认知无基础的新人.旨在让新人能够用最简单快捷的方式,轻松入门,能够迅速使用LaTeX完成基本的文本编辑.这个教材最终能够达到的水平是能够使用LaTeX写一篇正常的proposal.如果希望有更大需求的提高,那么推荐在熟悉了这一篇文章的内容之后,再自行google或查阅其他稍厚的教材.尤其旨在破除部分新人对LaTeX在传闻中难以学习的恐惧感.在入门之
JavaScript 最初是用来创建动态网站效果的的前端语言.而如今,这门脚本语言也可以用作后端开发,用于搭建 Web 服务器,开发接口,甚至创建博客.在下面这个列表中包括24个 Node.js 教程和在线指南.这些资源对于任何想要学习更多的关于 Node.js 的知识的开发人员都是很有用的. 您可能感兴趣的相关文章 经典网页设计:超炫动画效果单页网站 30个独具匠心的精美单页 ...
SQLServer2008设置 开启远程连接
前一段时间,学生分组做项目,使用SVN工具,要求功能使用存储过程,在数据库这块出现这么一个问题:
A学生在他的数据库上添加了存储过程,需要其他的B,C,D三个 ...
虚拟主机实质上是在一台Apache服务器建立多个WEB站点.虚拟主机有基于名称(DNS)的虚拟主机和基于IP地址的虚拟主机. 一.基于名称的虚拟主机 场景: 目前,公司共有四个部门,每个部门的域名分别如下表 表 ...
在我心里, 我一直记得去年腊月看望姥姥姥爷的时候.姥姥姥爷住在离我家20多公里的一个村子.姥爷是个抗美援朝的退伍军人,本来现在的退伍老军人应该得到政府的很高的补贴可是由于一些事情的导致,政府每个月只给姥爷300元的生 ...
弄了2个小时,总算是找到原因了,本人win7下安装的xampp是最新版本的,版本号是多少没看到,php5.6,ts-vc11-x86在网上下载对应的最新扩展mongo1.6.0RC2,配置php.ini,增加exte ...
List与Data的转化比较简单,网上也很多.但是大多都有一个Bug:当实体类有可空类型的属性时,转化会出异常(DATASET不支持System.Nullable异常) 下面的方法可以避免出现这个问题.
在上一篇中,我们讲解了如何申请微信公众号,公众平台开发的基本原理以及服务器 ...
using Susing System.IO;using System.Dra ...
上回谢了生成写xml的,现在把读取的补上 文件如下 &?xml version=&1.0& encoding=&UTF-8& standalone=&yes&q ...
一般来说,数据库处理SQL都会经过三个过程:解析(parse).执行(exec).返回结果(fetch) 1.解析 当用户发起一个SQL语句时,Oracle通过Server Process 接收SQL语句到达orac ...
表空间是数据库的逻辑划分,一个表空间只能属于一个数据库.所有的数据库对象都存放在指定的表空间中.但主要存放的是表, 所以称作表空间.Oracle数据库中至少存在一个表空间,即SYSTEM的表空间. SQL Serve ...

我要回帖

更多关于 vitamio播放器界面 的文章

 

随机推荐