Showing preview only (405K chars total). Download the full file or copy to clipboard to get everything.
Repository: over140/OPlayer
Branch: master
Commit: 315bc745fd96
Files: 95
Total size: 369.9 KB
Directory structure:
gitextract_kw23pxwu/
├── .classpath
├── .gitignore
├── .project
├── AndroidManifest.xml
├── LICENSE
├── README.md
├── assets/
│ └── online.xml
├── libs/
│ ├── android-support-v13.jar
│ ├── ormlite-android-4.42-SNAPSHOT.jar
│ ├── ormlite-core-4.42-SNAPSHOT.jar
│ └── pinyin4j-2.5.0.jar
├── project.properties
├── res/
│ ├── anim/
│ │ ├── slide_in_bottom.xml
│ │ ├── slide_in_top.xml
│ │ ├── slide_out_bottom.xml
│ │ └── slide_out_top.xml
│ ├── drawable/
│ │ ├── alphabet_scroller_bg.xml
│ │ ├── home_btn_bg.xml
│ │ ├── mediacontroller_btn_bg.xml
│ │ ├── mediacontroller_pause_button.xml
│ │ ├── mediacontroller_play_button.xml
│ │ ├── mediacontroller_seekbar.xml
│ │ ├── mediacontroller_seekbar_thumb.xml
│ │ ├── scrubber_control_selector_holo.xml
│ │ └── scrubber_progress_horizontal_holo_dark.xml
│ ├── layout/
│ │ ├── activity_video.xml
│ │ ├── brightness_volumn.xml
│ │ ├── common_loading.xml
│ │ ├── fragment_file.xml
│ │ ├── fragment_file_item.xml
│ │ ├── fragment_online.xml
│ │ ├── fragment_online_item.xml
│ │ ├── fragment_pager.xml
│ │ ├── mediacontroller.xml
│ │ ├── mediaplayer.xml
│ │ ├── my_media_controller.xml
│ │ └── videoview.xml
│ ├── values/
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-large/
│ │ └── dimens.xml
│ ├── values-small/
│ │ └── dimens.xml
│ ├── values-sw600dp/
│ │ └── dimens.xml
│ ├── values-v11/
│ │ └── styles.xml
│ ├── values-v14/
│ │ └── styles.xml
│ └── values-xlarge/
│ └── dimens.xml
└── src/
└── com/
└── nmbb/
└── oplayer/
├── OPlayerApplication.java
├── OPreference.java
├── business/
│ └── FileBusiness.java
├── database/
│ ├── DbHelper.java
│ └── SQLiteHelperOrm.java
├── exception/
│ └── Logger.java
├── po/
│ ├── OnlineVideo.java
│ ├── PFile.java
│ └── POMedia.java
├── preference/
│ └── PreferenceUtils.java
├── receiver/
│ └── MediaScannerReceiver.java
├── service/
│ ├── FileDownloadService.java
│ └── MediaScannerService.java
├── ui/
│ ├── FragmentBase.java
│ ├── FragmentFileOld.java
│ ├── FragmentOnline.java
│ ├── MainActivity.java
│ ├── PlayerActivity.java
│ ├── VideoPlayerActivity.java
│ ├── adapter/
│ │ ├── FileAdapter.java
│ │ └── FileDownloadAdapter.java
│ ├── base/
│ │ ├── ArrayAdapter.java
│ │ ├── FilterArrayAdapter.java
│ │ └── ThreadPool.java
│ ├── helper/
│ │ ├── FileDownloadHelper.java
│ │ ├── VideoHelper.java
│ │ └── XmlReaderHelper.java
│ ├── player/
│ │ ├── CommonGestures.java
│ │ ├── MediaController.java
│ │ ├── PlayerService.java
│ │ ├── VP.java
│ │ ├── VideoActivity.java
│ │ └── VideoView.java
│ └── vitamio/
│ ├── InitActivity.java
│ └── LibsChecker.java
├── util/
│ ├── ApplicationUtils.java
│ ├── ArrayUtils.java
│ ├── ConvertUtils.java
│ ├── DeviceUtils.java
│ ├── FileUtils.java
│ ├── FractionalTouchDelegate.java
│ ├── ImageUtils.java
│ ├── IntentHelper.java
│ ├── MediaUtils.java
│ ├── PinyinUtils.java
│ ├── StringUtils.java
│ └── ToastUtils.java
└── video/
└── VideoThumbnailUtils.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .classpath
================================================
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
================================================
FILE: .gitignore
================================================
# built application files
*.apk
*.ap_
# files for the dex VM
*.dex
# Java class files
*.class
# generated files
bin/
gen/
# Local configuration file (sdk path, etc)
local.properties
================================================
FILE: .project
================================================
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>OPlayer</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
================================================
FILE: AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nmbb.oplayer"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:name=".OPlayerApplication"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ui.MainActivity"
android:configChanges="orientation|keyboard|keyboardHidden|navigation"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.player.VideoActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:label="@string/app_name"
android:launchMode="singleTop"
android:process=":vitamio"
android:screenOrientation="landscape"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:mimeType="audio/*"
android:scheme="http" />
<data
android:mimeType="audio/*"
android:scheme="rtsp" />
<data
android:mimeType="audio/*"
android:scheme="rtmp" />
<data
android:mimeType="audio/*"
android:scheme="udp" />
<data
android:mimeType="audio/*"
android:scheme="tcp" />
<data
android:mimeType="audio/*"
android:scheme="file" />
<data
android:mimeType="audio/*"
android:scheme="content" />
<data
android:mimeType="audio/*"
android:scheme="mms" />
<data
android:mimeType="video/*"
android:scheme="http" />
<data
android:mimeType="video/*"
android:scheme="rtsp" />
<data
android:mimeType="video/*"
android:scheme="rtmp" />
<data
android:mimeType="video/*"
android:scheme="udp" />
<data
android:mimeType="video/*"
android:scheme="tcp" />
<data
android:mimeType="video/*"
android:scheme="file" />
<data
android:mimeType="video/*"
android:scheme="content" />
<data
android:mimeType="video/*"
android:scheme="mms" />
<data android:mimeType="application/octet-stream" />
<data android:mimeType="application/x-mpegurl" />
<data android:mimeType="application/vnd.apple.mpegurl" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:mimeType="application/x-mpegurl"
android:scheme="http" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="rtsp" />
<data android:scheme="rtmp" />
<data android:scheme="mms" />
<data android:scheme="tcp" />
<data android:scheme="udp" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/*" />
<data android:mimeType="application/sdp" />
<data android:mimeType="application/octet-stream" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:mimeType="video/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="ftp" />
<data android:scheme="rtsp" />
<data android:scheme="rtmp" />
<data android:scheme="mms" />
<data android:scheme="tcp" />
<data android:scheme="udp" />
<data android:scheme="gopher" />
<data android:mimeType="video/*" />
<data android:mimeType="audio/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="file" />
<data android:scheme="content" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:scheme="ftp" />
<data android:scheme="rtsp" />
<data android:scheme="rtmp" />
<data android:scheme="mms" />
<data android:scheme="tcp" />
<data android:scheme="udp" />
<data android:scheme="gopher" />
<data android:host="*" />
<data android:pathPattern=".*\\.avi" />
<data android:pathPattern=".*\\.asf" />
<data android:pathPattern=".*\\.f4v" />
<data android:pathPattern=".*\\.flv" />
<data android:pathPattern=".*\\.mkv" />
<data android:pathPattern=".*\\.mpeg" />
<data android:pathPattern=".*\\.mpg" />
<data android:pathPattern=".*\\.mov" />
<data android:pathPattern=".*\\.rm" />
<data android:pathPattern=".*\\.vob" />
<data android:pathPattern=".*\\.wmv" />
<data android:pathPattern=".*\\.ts" />
<data android:pathPattern=".*\\.tp" />
<data android:pathPattern=".*\\.m3u" />
<data android:pathPattern=".*\\.m3u8" />
<data android:pathPattern=".*\\.m4v" />
<data android:pathPattern=".*\\.mp4" />
</intent-filter>
</activity>
<activity
android:name=".PlayerActivity"
android:configChanges="orientation|keyboard|keyboardHidden|navigation"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
</activity>
<activity
android:name="com.nmbb.oplayer.ui.vitamio.InitActivity"
android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
android:launchMode="singleTop"
android:theme="@android:style/Theme.NoTitleBar"
android:windowSoftInputMode="stateAlwaysHidden" />
<receiver android:name=".receiver.MediaScannerReceiver" >
<!-- 重启 -->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<data android:scheme="file" />
</intent-filter>
<!-- 文件更改 -->
<intent-filter>
<action android:name="com.nmbb.oplayer.action.MEDIA_SCANNER_SCAN_FILE" />
<action android:name="com.nmbb.oplayer.action.MEDIA_SCANNER_SCAN_DIRECTORY" />
<data android:scheme="file" />
</intent-filter>
</receiver>
<service
android:name=".ui.player.PlayerService"
android:process=":vitamio" />
<service
android:name="io.vov.vitamio.VitamioService"
android:exported="false" >
<intent-filter>
<action android:name="io.vov.vitamio.IVitamioService" />
</intent-filter>
</service>
<service android:name=".service.MediaScannerService" />
</application>
</manifest>
================================================
FILE: LICENSE
================================================
================================================
FILE: README.md
================================================
OPlayer
=======
Android平台基于Vitamio的开源播放器
支持以下协议的音频和视频播放:
* MMS
* RTSP (RTP, SDP)
* HTTP流式传输(progressive streaming)
* HTTP Live Streaming (M3U8), Android 2.1+
Vitamio集成了许多音频和视频的解码包,相比Android内置默认的媒体格式,这里列出其中的一些:
* divx/xvid
* wmv
* flv
* ts
* rmvb
* mkv
* mov
* m4v
* avi
* mp4
* 3gp
==
Vitamio官网:
http://vitamio.org
==
我的博客:
http://www.cnblogs.com/over140/
==
Vitamio系列文章:
http://www.cnblogs.com/over140/category/409230.html
==
依赖Vitamio,下载最新的Vitamio:
https://github.com/yixia/VitamioBundle
================================================
FILE: assets/online.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<list>
<head>
<version>1.1.0</version>
<title>default stream</title>
</head>
<body>
<media id="001" version="21" title="CCTV-1 综合" image="http://cn.daroonsoft.com/images/cctv_1.png" guide="cctv1">
<ref href="mms://www.xjklmy.com/tv-6" width="384" height="288" bitrate="755" />
<ref href="rtsp://114.255.201.246/cctv1_256_h264.sdp" width="320" height="240" bitrate="264" />
<ref href="rtsp://116.199.127.68/cctv1_HD" width="720" height="576" bitrate="1044" />
<ref href="rtmp://live.cditv.cn/test/CCTV1" width="320" height="240" bitrate="548" />
<ref href="rtsp://bupt01.video.edu.cn/CCTV-1" width="640" height="480" bitrate="412" />
<ref href="rtsp://116.199.127.68/cctv1_HD" width="720" height="576" bitrate="1044" />
<ref href="rtsp://211.138.120.114/cctv1" width="512" height="384" bitrate="544" />
<ref href="http://cntv.itv.doplive.com.cn/live591/index_128k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="002" version="18" title="CCTV-2 财经" image="http://cn.daroonsoft.com/images/cctv_2.png" guide="cctv2">
<ref href="mms://bupt02.video.edu.cn/CCTV-2" width="640" height="480" bitrate="1044" />
<ref href="rtsp://114.255.201.246/cctv2_256_h264.sdp" width="320" height="240" bitrate="548" />
<ref href="mms://211.138.120.114/cctv2" width="512" height="384" bitrate="544" />
<ref href="http://cntv.itv.doplive.com.cn/live592/index_128k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="003" version="15" title="CCTV-3 综艺" image="http://cn.daroonsoft.com/images/cctv_3.png" guide="cctv3"
desc="中央电视台综艺频道是以播出音乐及歌舞节目为主的专业频道,于1995年11月30日正式播出,通过亚太1A卫星覆盖全国,每天播出19小时左右。" >
<ref href="rtsp://114.255.201.246/cctv3_256_h264.sdp" width="320" height="240" bitrate="264" />
<ref href="mms://211.138.120.114/cctv3" width="512" height="384" bitrate="544" />
<ref href="rtsp://116.199.127.68/cctv3" width="720" height="576" bitrate="1044" />
<ref href="http://cntv.itv.doplive.com.cn/live593/index_128k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="004" version="19" title="CCTV-4 中文国际(亚)" image="http://cn.daroonsoft.com/images/cctv_4.png" guide="cctv4"
desc="中央电视台国际频道是以海外华人、华侨和港、澳、台为主要服务对象的专业频道,于1992年10月1日开播。国际频道的播出信号采用数字压缩技术,通过多颗国际卫星传输,基本实现了卫星传输信号的全球覆盖和卫星直播信号的重点地区覆盖。">
<ref href="mms://bupt02.video.edu.cn/CCTV-4" width="640" height="480" bitrate="632" />
<ref href="http://gslb.tv.sohu.com/live?cid=11" width="640" height="480" bitrate="1044" />
<ref href="mms://211.138.120.114/cctv4" width="512" height="384" bitrate="544" />
<ref href="http://cntv.itv.doplive.com.cn/live594/index_128k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="005" version="24" title="CCTV-5 体育" image="http://cn.daroonsoft.com/images/cctv_5.png" guide="cctv5"
desc="中央电视台体育频道是国内创办最早、规模最大、拥有世界众多顶级赛事国内独家报道权的专业体育频道,于1995年1月1日正式开播,通过亚太1A卫星覆盖全国,每天平均播出16小时以上。" >
<ref href="http://112.231.23.20:554/rtplive/tv18/playlist.m3u8" width="320" height="240" bitrate="548" />
<ref href="rtmp://live.cditv.cn/test/CCTV5" width="320" height="240" bitrate="548" />
<ref href="rtsp://114.255.201.246/cctv5_256_h264.sdp" width="320" height="240" bitrate="548" />
<ref href="rtsp://116.199.127.68/cctv5" width="720" height="576" bitrate="800" />
<ref href="rtmp://202.108.17.140/multicast/livestream" width="480" height="320" bitrate="600" />
<ref href="rtsp://bupt01.video.edu.cn/CCTV-5" width="640" height="480" bitrate="632" />
<ref href="rtsp://211.138.120.114/cctv5" width="512" height="384" bitrate="544" />
<ref href="rtsp://media.zzti.edu.cn/cctv5" width="320" height="240" bitrate="548" />
<ref href="http://cntv.itv.doplive.com.cn/live595/index_128k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="006" version="17" title="CCTV-6 电影" image="http://cn.daroonsoft.com/images/cctv_6.png" guide="cctv6"
desc="中央电视台电影频道是以宣传电影、培养电影观众、传播影视文化为宗旨的专业频道,于1996年1月1日正式开播,通过亚太1A卫星覆盖全国,每天平均播出近17小时。" >
<ref href="mms://bupt02.video.edu.cn/CCTV-6" width="640" height="480" bitrate="1044" />
<ref href="rtsp://114.255.201.246/cctv6_256_h264.sdp" width="320" height="240" bitrate="548" />
<ref href="mms://211.138.120.114/cctv6" width="512" height="384" bitrate="544" />
<ref href="rtsp://116.199.127.68/cctv6" width="720" height="576" bitrate="800" />
<ref href="http://live512.itv.doplive.com.cn/live512/index_128k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="007" version="11" title="CCTV-7 军事 农业" image="http://cn.daroonsoft.com/images/cctv_7.png" guide="cctv7"
desc="中央电视台少儿·军事·农业频道是以播出少儿、军事、农业节目为主的专业频道,于1995年11月30日开播,通过亚太1A卫星覆盖全国。平均每日播出近17个小时。" >
<ref href="mms://bupt02.video.edu.cn/CCTV-7" width="640" height="480" bitrate="632" />
<ref href="http://cntv.itv.doplive.com.cn/live597/index_900k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="008" version="12" title="CCTV-8 电视剧" image="http://cn.daroonsoft.com/images/cctv_8.png" guide="cctv8"
desc="中央电视台电视剧频道是以优秀电视剧为主要播出内容的专业频道,于1999年5月3日开播,通过亚太1A卫星覆盖全国,平均每天播出17小时。" >
<ref href="mms://bupt02.video.edu.cn/CCTV-8" width="640" height="480" bitrate="632" />
<ref href="rtsp://114.255.201.246/cctv8_256_h264.sdp" width="640" height="480" bitrate="1044" />
<ref href="mms://211.138.120.114/cctv8" width="512" height="384" bitrate="544" />
<ref href="rtsp://116.199.127.68/cctv8" width="720" height="576" bitrate="800" />
</media>
<media id="009" version="17" title="CCTV-News" image="http://cn.daroonsoft.com/images/cctv_news.png" guide="">
<ref href="http://cntv.itv.doplive.com.cn/live599/index_128k.m3u8" width="320" height="240" bitrate="256" />
<ref href="mms://bupt02.video.edu.cn/CCTV-9" width="640" height="480" bitrate="1044" />
<ref href="mms://222.47.26.81/litv11" width="320" height="240" bitrate="256" />
<ref href="mms://4.71.37.8/cctv9-200" width="320" height="240" bitrate="256" />
<ref href="mms://211.138.120.114/cctv9" width="512" height="384" bitrate="544" />
</media>
<media id="010" version="12" title="CCTV-9 纪录" image="http://cn.daroonsoft.com/images/cctv_9.png" guide="cctv9">
<ref href="mms://media.zzti.edu.cn/cctvnews/" width="320" height="240" bitrate="256" />
<ref href="http://t.live.cntv.cn/m3u8/cctv9-jilu.m3u8" width="720" height="576" bitrate="800" />
<ref href="rtmp://live.cditv.cn/test/CCTV9" width="320" height="240" bitrate="548" />
</media>
<media id="011" version="10" title="CCTV-10 科教" image="http://cn.daroonsoft.com/images/cctv_10.png" guide="cctv10"
desc="中央电视台科学·教育频道(CCTV-10),是因应国家“科教兴国”方略,以提高国民素质为宗旨,以教科文题材为内容的专业电视频道。" >
<ref href="mms://bupt02.video.edu.cn/CCTV-10" width="640" height="480" bitrate="1044" />
<ref href="mms://211.138.120.114/cctv10" width="512" height="384" bitrate="544" />
</media>
<media id="012" version="6" title="CCTV-11 戏曲" image="http://cn.daroonsoft.com/images/cctv_11.png" guide="cctv11"
desc="中央电视台戏曲频道以弘扬和发展我国优秀戏曲艺术,满足戏迷审美要求为宗旨的专业频道,于2001年7月9日开播。" >
<ref href="mms://bupt02.video.edu.cn/CCTV-11" width="640" height="480" bitrate="1044" />
<ref href="http://t.live.cntv.cn/m3u8/cctv-xiqu.m3u8" width="720" height="576" bitrate="800" />
</media>
<media id="013" version="9" title="CCTV-12 社会与法" image="http://cn.daroonsoft.com/images/cctv_12.png" guide="cctv12">
<ref href="mms://bupt02.video.edu.cn/CCTV-12" width="640" height="480" bitrate="1044" />
<ref href="http://t.live.cntv.cn/m3u8/cctv12.m3u8" width="720" height="576" bitrate="800" />
<ref href="rtsp://114.255.201.246/cctv12_256_h264.sdp" width="720" height="576" bitrate="800" />
<ref href="http://202.108.39.103:554/57?.flv" width="640" height="480" bitrate="1044" />
<ref href="mms://211.138.120.114/cctv12" width="512" height="384" bitrate="544" />
</media>
<media id="014" version="23" title="CCTV-13 新闻" image="http://cn.daroonsoft.com/images/cctv_13.png" guide="cctvxwpd"
desc="新闻频道全天24小时播出,全天24档整点新闻。整点新闻将以最快的速度向观众提供第一手的国内国际新闻资讯,突出时效性和信息量,实现滚动、递进、更新式报道。整点新闻后,分别安排了各分类新闻,主要有财经、体育、文化、国际四大类。" >
<ref href="http://cntv.itv.doplive.com.cn/live603/index_900k.m3u8" width="648" height="480" bitrate="900" />
<ref href="http://gslb.tv.sohu.com/live?cid=1" width="640" height="480" bitrate="1044" />
<ref href="http://ora.t.live.cntv.cn/live/test?fmt=x264_0K_flv" width="720" height="576" bitrate="800" />
<ref href="mms://211.138.120.114/cctvxw" width="512" height="384" bitrate="544" />
</media>
<media id="216" version="5" title="CCTV-14 少儿" image="http://cn.daroonsoft.com/images/cctv_shaoer.png" guide="cctvsepd">
<ref href="rtsp://211.68.71.252/CCTV-kid" width="640" height="480" bitrate="1044" />
<ref href="rtsp://bupt01.video.edu.cn/CCTV-kid" width="640" height="480" bitrate="1044" />
</media>
<media id="370" version="1" title="CCTV-15 音乐" image="http://cn.daroonsoft.com/images/cctv_music.png" guide="cctvylpd">
<ref href="rtsp://bupt01.video.edu.cn/CCTV-music" width="640" height="480" bitrate="1044" />
</media>
<media id="366" version="2" title="CCTV-风云足球" image="http://cn.daroonsoft.com/images/ffzq.png" guide="fyzq">
<ref href="rtmp://livertmp.wasu.cn/live4/fyzq" width="640" height="480" bitrate="1044" />
</media>
<media id="214" version="1" title="CCTV高清" image="http://cn.daroonsoft.com/images/cctv_gaoqing.png" guide="cctv-gq" >
<ref href="rtmp://202.108.17.104/live/test02" width="720" height="480" bitrate="1044" />
</media>
<media id="072" version="10" title="中国教育—1" image="http://cn.daroonsoft.com/images/cetv.png" guide="jyyt" >
<ref href="mms://bupt02.video.edu.cn/CETV-1" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=30" width="640" height="480" bitrate="1044" />
</media>
<media id="073" version="6" title="中国教育—3" image="http://cn.daroonsoft.com/images/cetv.png" guide="jyst" >
<ref href="mms://bupt02.video.edu.cn/CETV-3" width="640" height="480" bitrate="1440" />
<ref href="http://gslb.tv.sohu.com/live?cid=29" width="640" height="480" bitrate="1440" />
</media>
<media id="367" version="1" title="欧洲足球" image="http://cn.daroonsoft.com/images/oozq.png" guide="">
<ref href="rtmp://livertmp.wasu.cn/live/ozzq" width="320" height="240" bitrate="128" />
</media>
<media id="018" version="28" title="湖南卫视" image="http://cn.daroonsoft.com/images/hunantv.png" guide="hunanws">
<ref href="mms://222.47.26.81/litv09" width="320" height="240" bitrate="548" />
<ref href="http://gslb.tv.sohu.com/live?cid=44" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=9" width="640" height="480" bitrate="1044" />
<ref href="rtsp://121.14.129.221/broadcast/pushfeeder/rtpencoder/hnws-s.sdp" width="176" height="144" bitrate="156" />
<ref href="http://180.153.212.207:1863/18091377.flv" width="720" height="402" bitrate="1044" />
</media>
<media id="022" version="4" title="金鹰卡通" image="http://cn.daroonsoft.com/images/hunantv.png" guide="hnjykt">
<ref href="rtmp://livertmp.wasu.cn/live7/jykt" width="640" height="480" bitrate="1044" />
</media>
<media id="112" version="6" title="长沙新闻" image="http://cn.daroonsoft.com/images/changshatv.png" guide="csxwpd">
<ref href="mms://222.240.196.154/xinwenlive" width="320" height="240" bitrate="421" />
</media>
<media id="113" version="5" title="长沙政法" image="http://cn.daroonsoft.com/images/changshatv.png" guide="cszfpd">
<ref href="mms://222.240.196.154/live" width="320" height="240" bitrate="421" />
</media>
<media id="114" version="4" title="长沙女性" image="http://cn.daroonsoft.com/images/changshatv.png" guide="csnxpd">
<ref href="mms://222.240.196.154/wmlive" width="320" height="240" bitrate="421" />
</media>
<media id="027" version="20" title="上海东方卫视" image="http://cn.daroonsoft.com/images/dongfangtv.png" guide="dfaws">
<ref href="mms://bupt02.video.edu.cn/SHWS" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=3" width="640" height="480" bitrate="1044" />
<ref href="http://112.90.11.88:1863/3900155972.flv" width="720" height="402" bitrate="1044" />
<ref href="rtsp://116.199.127.68/dongfang" width="720" height="576" bitrate="1044" />
</media>
<media id="372" version="6" title="东方财经" image="http://cn.daroonsoft.com/images/dongfangtv.png" guide="" >
<ref href="http://edgews.yicai.com/channels/602/400.flv/live" width="640" height="480" bitrate="900" />
</media>
<media id="126" version="7" title="五星体育" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="sitvwxty">
<ref href="http://live-cdn.smgbb.tv/channels/214/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="111" version="6" title="第一财经" image="http://cn.daroonsoft.com/images/cbnlogo.png" guide="ssdycjpd">
<ref href="mms://clientcbn.bbtv.cn/clientcbn" width="320" height="240" bitrate="548" />
<ref href="http://live-cdn.smgbb.tv/channels/212/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="127" version="4" title="上海新闻综合" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="ssxwzhpd">
<ref href="http://live-cdn.smgbb.tv/channels/210/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="128" version="4" title="上海星尚" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="">
<ref href="http://live-cdn.smgbb.tv/channels/211/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="130" version="4" title="上海纪实" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="ssjspd">
<ref href="http://live-cdn.smgbb.tv/channels/215/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="131" version="4" title="上海娱乐" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="ssxwylpd">
<ref href="http://live-cdn.smgbb.tv/channels/217/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="132" version="4" title="上海艺术人文" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="">
<ref href="http://live-cdn.smgbb.tv/channels/218/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="133" version="4" title="上海ICS外语频道" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="">
<ref href="http://live-cdn.smgbb.tv/channels/220/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="240" version="1" title="东方购物" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="">
<ref href="http://live-cdn.smgbb.tv/channels/219/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="320" version="1" title="游戏风云" image="http://cn.daroonsoft.com/images/shanghaitv.png" guide="sitvyxfy">
<ref href="http://live-cdn.smgbb.tv/channels/293/400.flv/live" width="480" height="348" bitrate="409" />
</media>
<media id="373" version="6" title="生活时尚" image="http://cn.daroonsoft.com/images/eastmovie.png" guide="" >
<ref href="http://live-cdn.smgbb.tv/channels/222/400.flv/live" width="320" height="240" bitrate="256" />
</media>
<media id="108" version="9" title="炫动卡通" image="http://cn.daroonsoft.com/images/xuandongkatongtv.png" guide="">
<ref href="http://live-cdn.smgbb.tv/channels/224/400.flv/live" width="480" height="348" bitrate="600" />
</media>
<media id="368" version="1" title="劲爆体育" image="http://cn.daroonsoft.com/images/jbty.png" guide="sitvjbty" >
<ref href="rtmp://livertmp.wasu.cn/live5/jbty" width="640" height="480" bitrate="1044" />
</media>
<media id="036" version="16" title="北京卫视" image="http://cn.daroonsoft.com/images/btv.png" guide="btv1">
<ref href="mms://bupt02.video.edu.cn/BTV-1" width="640" height="480" bitrate="1044" />
<ref href="http://biz.vsdn.tv380.com/playlive.php?5B63686E5D445830303030303035307C313430367C317C323030307C474754567C687474705B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00" width="768" height="576" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=36" width="640" height="480" bitrate="1044" />
<ref href="rtsp://116.199.127.68/beijing" width="720" height="576" bitrate="1044" />
</media>
<media id="085" version="4" title="北京影视" image="http://cn.daroonsoft.com/images/btv.png" guide="btv4">
<ref href="mms://bupt02.video.edu.cn/BTV-5" width="640" height="480" bitrate="1044" />
</media>
<media id="086" version="5" title="北京文艺" image="http://cn.daroonsoft.com/images/btv.png" guide="btv2">
<ref href="http://gslb.tv.sohu.com/live?cid=37" width="640" height="480" bitrate="1044" />
</media>
<media id="087" version="5" title="北京生活" image="http://cn.daroonsoft.com/images/btv.png" guide="btv7">
<ref href="mms://bupt02.video.edu.cn/BTV-7" width="640" height="480" bitrate="1044" />
</media>
<media id="088" version="5" title="北京科教" image="http://cn.daroonsoft.com/images/btv.png" guide="btv3" >
<ref href="mms://bupt02.video.edu.cn/BTV-3" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=38" width="640" height="480" bitrate="1044" />
</media>
<media id="089" version="5" title="北京财经" image="http://cn.daroonsoft.com/images/btv.png" guide="btv5" >
<ref href="http://gslb.tv.sohu.com/live?cid=40" width="640" height="480" bitrate="1044" />
</media>
<media id="090" version="5" title="北京青年" image="http://cn.daroonsoft.com/images/btv.png" guide="btv8" >
<ref href="mms://bupt02.video.edu.cn/BTV-8" width="640" height="480" bitrate="1044" />
</media>
<media id="094" version="6" title="北京体育" image="http://cn.daroonsoft.com/images/btv.png" guide="btv6" >
<ref href="mms://bupt02.video.edu.cn/BTV-6" width="640" height="480" bitrate="1044" />
</media>
<media id="115" version="1" title="杭州综合频道" image="http://cn.daroonsoft.com/images/hangzhoutv.png" guide="hzzhpd" >
<ref href="http://live.hcrt.cn/channels/100/400.flv/live" width="480" height="360" bitrate="450" />
</media>
<media id="116" version="1" title="杭州西湖明珠频道" image="http://cn.daroonsoft.com/images/hangzhoutv.png" guide="hzxhmzpd" >
<ref href="http://live.hcrt.cn/channels/101/400.flv/live" width="480" height="360" bitrate="450" />
</media>
<media id="117" version="2" title="杭州生活频道" image="http://cn.daroonsoft.com/images/hangzhoutv.png" guide="hzshpd" >
<ref href="http://live.hcrt.cn/channels/102/400.flv/live" width="480" height="360" bitrate="450" />
</media>
<media id="118" version="5" title="杭州影视频道" image="http://cn.daroonsoft.com/images/hangzhoutv.png" guide="hzyspd" >
<ref href="http://live.hcrt.cn/channels/39/400.flv/live" width="384" height="288" bitrate="450" />
<ref href="rtsp://211.138.120.114/ztv5" width="512" height="384" bitrate="544" />
</media>
<media id="119" version="2" title="杭州少儿频道" image="http://cn.daroonsoft.com/images/hangzhoutv.png" guide="hzsepd" >
<ref href="http://live.hcrt.cn/channels/40/400.flv/live" width="480" height="384" bitrate="450" />
</media>
<media id="202" version="2" title="房产频道" image="http://cn.daroonsoft.com/images/hangzhoutv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/ifcpd.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="037" version="14" title="江西卫视" image="http://cn.daroonsoft.com/images/jiangxitv.png" guide="jxws" >
<ref href="http://biz.vsdn.tv380.com/playlive.php?5B63686E5D445830303030303035307C313531347C317C323030307CE74754567C687474705B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00" width="768" height="576" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=18" width="640" height="480" bitrate="1044" />
<ref href="rtmp://live.cjxtv.com:1935/live2/livestream" width="320" height="240" bitrate="128" />
</media>
<media id="038" version="10" title="广西卫视" image="http://cn.daroonsoft.com/images/guangxi.png" guide="gxws" >
<ref href="http://gslb.tv.sohu.com/live?cid=23" width="640" height="480" bitrate="1240" />
<ref href="http://222.216.111.88:5000/nn_live.flv?id=1004" width="640" height="480" bitrate="1240" />
</media>
<media id="039" version="14" title="河南卫视" image="http://cn.daroonsoft.com/images/henantv.png" guide="henanws" >
<ref href="http://gslb.tv.sohu.com/live?cid=19" width="640" height="480" bitrate="1044" />
</media>
<media id="040" version="13" title="湖北卫视" image="http://cn.daroonsoft.com/images/hubeitv.png" guide="hubeiws" >
<ref href="rtsp://bupt01.video.edu.cn/HBWS" width="640" height="480" bitrate="1044" />
<ref href="http://live9.hbtv.com.cn/channels/zbk/hbws/flv:sd/live" width="768" height="576" bitrate="1240" />
<ref href="http://gslb.tv.sohu.com/live?cid=22" width="640" height="480" bitrate="1044" />
</media>
<media id="134" version="1" title="湖北经视" image="http://cn.daroonsoft.com/images/hubeitv.png" guide="" >
<ref href="http://live9.hbtv.com.cn/channels/zbk/jingshi2/flv:sd/live" width="720" height="576" bitrate="900" />
</media>
<media id="140" version="1" title="湖北体育" image="http://cn.daroonsoft.com/images/hubeitv.png" guide="hbtypd" >
<ref href="http://live9.hbtv.com.cn/channels/zbk/hbty/flv:sd/live" width="720" height="576" bitrate="900" />
</media>
<media id="141" version="1" title="湖北影视" image="http://cn.daroonsoft.com/images/hubeitv.png" guide="hubyspd" >
<ref href="http://live9.hbtv.com.cn/channels/zbk/hbys/flv:sd/live" width="720" height="576" bitrate="900" />
</media>
<media id="225" version="1" title="湖北电视台" image="http://cn.daroonsoft.com/images/hubeitv.png" guide="" >
<ref href="http://live9.hbtv.com.cn/channels/zbk/hbtv/flv:sd/live" width="720" height="576" bitrate="900" />
</media>
<media id="042" version="16" title="黑龙江电视台" image="http://cn.daroonsoft.com/images/heilongjiangtv.png" guide="hljws" >
<ref href="http://gslb.tv.sohu.com/live?cid=59" width="800" height="448" bitrate="1044" />
</media>
<media id="043" version="8" title="辽宁卫视" image="http://cn.daroonsoft.com/images/niaolingtv.png" guide="lnws" >
<ref href="mms://bupt02.video.edu.cn/LNWS" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=10" width="640" height="480" bitrate="1044" />
</media>
<media id="044" version="8" title="山西卫视" image="http://cn.daroonsoft.com/images/shanxitv.png" guide="sx1ws" >
<ref href="http://gslb.tv.sohu.com/live?cid=50" width="640" height="480" bitrate="1044" />
</media>
<media id="045" version="12" title="陕西卫视" image="http://cn.daroonsoft.com/images/shaxiatv.png" guide="sx3ws" >
<ref href="http://biz.vsdn.tv380.com/playlive.php?5B63686E5D445830303030303035307C313531337C317C323030307CE74754567C687474705B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00" width="768" height="576" bitrate="1240" />
<ref href="http://gslb.tv.sohu.com/live?cid=20" width="640" height="480" bitrate="1044" />
</media>
<media id="046" version="9" title="天津卫视" image="http://cn.daroonsoft.com/images/tianjingtv.png" guide="tjws" >
<ref href="http://gslb.tv.sohu.com/live?cid=15" width="640" height="480" bitrate="1044" />
</media>
<media id="047" version="6" title="云南卫视" image="http://cn.daroonsoft.com/images/yunnantv.png" guide="ynws" >
<ref href="mms://bupt02.video.edu.cn/YNWS" width="640" height="480" bitrate="1044" />
<ref href="http://biz.vsdn.tv380.com/playlive.php?5B63686E5D445830303030303035307C313533317C317C323030307CE74754567C687474705B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00" width="768" height="576" bitrate="1240" />
<ref href="http://gslb.tv.sohu.com/live?cid=17" width="640" height="480" bitrate="1044" />
</media>
<media id="310" version="7" title="云南都市" image="http://cn.daroonsoft.com/images/yunnantv.png" guide="" >
<ref href="http://116.55.228.241/channels/622/400.flv/live" width="480" height="384" bitrate="521" />
</media>
<media id="311" version="7" title="云南娱乐" image="http://cn.daroonsoft.com/images/yunnantv.png" guide="yntyylpd" >
<ref href="http://116.55.228.243/channels/623/400.flv/live" width="480" height="384" bitrate="521" />
</media>
<media id="312" version="7" title="云南公共" image="http://cn.daroonsoft.com/images/yunnantv.png" guide="ynggpd" >
<ref href="http://116.55.228.241/channels/626/400.flv/live" width="480" height="384" bitrate="521" />
</media>
<media id="048" version="12" title="重庆卫视" image="http://cn.daroonsoft.com/images/chongqingtv.png" guide="zqws" >
<ref href="mms://bupt02.video.edu.cn/CQWS" width="640" height="480" bitrate="1044" />
<ref href="rtsp://123.147.160.18/cqtv.sdp" width="768" height="576" bitrate="1240" />
<ref href="http://gslb.tv.sohu.com/live?cid=35" width="640" height="480" bitrate="1044" />
</media>
<media id="322" version="1" title="武汉体育" image="http://cn.daroonsoft.com/images/wuhantv.png" guide="whtypd" >
<ref href="rtmp://multimedia.whbc.com.cn:1935/live/whtv5gd" width="640" height="480" bitrate="1044" />
</media>
<media id="332" version="1" title="武汉科教生活" image="http://cn.daroonsoft.com/images/wuhantv.png" guide="whkjshpd" >
<ref href="rtmp://multimedia.whbc.com.cn:1935/live/whtv3gd" width="640" height="480" bitrate="1044" />
</media>
<media id="049" version="11" title="宁夏卫视" image="http://cn.daroonsoft.com/images/ningxiatv.png" guide="nxws" >
<ref href="http://gslb.tv.sohu.com/live?cid=33" width="320" height="640" bitrate="480" />
</media>
<media id="050" version="18" title="江苏卫视" image="http://cn.daroonsoft.com/images/jiangsutv.png" guide="jsws" >
<ref href="mms://bupt02.video.edu.cn/JSWS" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=8" width="640" height="480" bitrate="1044" />
<ref href="http://182.131.19.166:1863/1258215255.flv" width="640" height="480" bitrate="1044" />
<ref href="rtsp://116.199.127.68/jiangsu" width="720" height="576" bitrate="1044" />
</media>
<media id="051" version="10" title="贵州卫视" image="http://cn.daroonsoft.com/images/guizhoutv.png" guide="gzws" >
<ref href="http://gslb.tv.sohu.com/live?cid=32" width="640" height="480" bitrate="1240" />
</media>
<media id="052" version="8" title="内蒙古卫视" image="http://cn.daroonsoft.com/images/neimenggutv.png" guide="nmgws" >
<ref href="http://gslb.tv.sohu.com/live?cid=26" width="320" height="240" bitrate="128" />
</media>
<media id="053" version="8" title="西藏卫视" image="http://cn.daroonsoft.com/images/xizhangtv.png" guide="xzhyws" >
<ref href="http://gslb.tv.sohu.com/live?cid=25" width="640" height="480" bitrate="1044" />
</media>
<media id="054" version="6" title="新疆卫视" image="http://cn.daroonsoft.com/images/xinjiangtv.png" guide="xjws" >
<ref href="http://gslb.tv.sohu.com/live?cid=5" width="640" height="480" bitrate="1044" />
<ref href="mms://www.xjklmy.com/tv-1" width="384" height="288" bitrate="256" />
</media>
<media id="055" version="12" title="四川卫视" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scws" >
<ref href="http://biz.vsdn.tv380.com/playlive.php?5B63686E5D445830303030303035307C313439397C317C323030307CE74754567C687474705B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00" width="768" height="576" bitrate="1240" />
<ref href="http://gslb.tv.sohu.com/live?cid=27" width="320" height="240" bitrate="128" />
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV1_800" width="720" height="576" bitrate="1044" />
</media>
<media id="295" version="1" title="四川文化旅游" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scwhlypd" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV2_800" width="720" height="576" bitrate="1044" />
</media>
<media id="296" version="1" title="四川经视频道" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scjjpd" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV3_800" width="720" height="576" bitrate="1044" />
</media>
<media id="297" version="1" title="四川新闻资讯" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scxwzxpd" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV4_800" width="720" height="576" bitrate="1044" />
</media>
<media id="298" version="1" title="四川影视文艺" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scyswypd" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV5_800" width="720" height="576" bitrate="1044" />
</media>
<media id="299" version="1" title="四川星空购物" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV6_800" width="720" height="576" bitrate="1044" />
</media>
<media id="300" version="1" title="四川妇女儿童" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scfnetpd" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV7_800" width="720" height="576" bitrate="1044" />
</media>
<media id="301" version="1" title="四川公共频道" image="http://cn.daroonsoft.com/images/sichuantv.png" guide="scggpd" >
<ref href="rtmp://rtmp.sctv.com/SRT_Live/SCTV9_800" width="720" height="576" bitrate="1044" />
</media>
<media id="056" version="17" title="浙江卫视" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjws" >
<ref href="mms://bupt02.video.edu.cn/ZJWS" width="640" height="480" bitrate="1044" />
<ref href="http://biz.vsdn.tv380.com/playlive.php?5B63686E5D445830303030303035307C313438337C317C323030307CE74754567C687474705B2F63686E5D5B74735D307C687474705B2F74735DVSDNSOOONERCOM00" width="768" height="576" bitrate="1240" />
<ref href="http://gslb.tv.sohu.com/live?cid=31" width="640" height="480" bitrate="1044" />
<ref href="http://119.147.126.78:1863/1975434150.flv" width="720" height="480" bitrate="1044" />
<ref href="rtsp://116.199.127.68/zhejiang" width="720" height="576" bitrate="1044" />
</media>
<media id="337" version="1" title="浙江钱江" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjqjdspd" >
<ref href="rtsp://211.138.120.114/ztv2" width="512" height="384" bitrate="228" />
</media>
<media id="338" version="1" title="浙江经视" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjjjpd" >
<ref href="rtsp://211.138.120.114/ztv3" width="426" height="320" bitrate="228" />
</media>
<media id="339" version="1" title="浙江科教" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjjykjpd" >
<ref href="rtsp://211.138.120.114/ztv4" width="426" height="320" bitrate="228" />
</media>
<media id="340" version="1" title="浙江影视" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjysylpd" >
<ref href="rtsp://211.138.120.114/ztv5" width="426" height="320" bitrate="228" />
</media>
<media id="341" version="1" title="浙江民生" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjmsxxpd" >
<ref href="rtsp://211.138.120.114/ztv6" width="426" height="320" bitrate="228" />
</media>
<media id="342" version="1" title="浙江少儿" image="http://cn.daroonsoft.com/images/zhejiangtv.png" guide="zjsepd" >
<ref href="rtsp://211.138.120.114/ztv8" width="426" height="320" bitrate="228" />
</media>
<media id="057" version="17" title="安徽卫视" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="ahws" >
<ref href="mms://bupt02.video.edu.cn/AHWS" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=13" width="640" height="480" bitrate="1044" />
</media>
<media id="323" version="1" title="安徽影视" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="ahyspd" >
<ref href="http://livecdn.ahtv.cn/channels/1502/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="324" version="1" title="安徽经济生活" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="ahjjshpd" >
<ref href="http://livecdn.ahtv.cn/channels/1503/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="325" version="1" title="安徽综艺" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="" >
<ref href="http://livecdn.ahtv.cn/channels/1504/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="326" version="1" title="安徽科教" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="ahkjpd" >
<ref href="http://livecdn.ahtv.cn/channels/1505/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="327" version="1" title="安徽公共" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="ahggpd" >
<ref href="http://livecdn.ahtv.cn/channels/1506/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="328" version="1" title="安徽人物" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="" >
<ref href="http://livecdn.ahtv.cn/channels/1507/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="329" version="1" title="安徽国际" image="http://cn.daroonsoft.com/images/anhuitv.png" guide="" >
<ref href="http://livecdn.ahtv.cn/channels/1508/500.flv/live" width="480" height="384" bitrate="512" />
</media>
<media id="058" version="12" title="山东卫视" image="http://cn.daroonsoft.com/images/shandongtv.png" guide="sdws" >
<ref href="http://gslb.tv.sohu.com/live?cid=14" width="640" height="480" bitrate="1044" />
</media>
<media id="059" version="14" title="吉林卫视" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jlws" >
<ref href="http://gslb.tv.sohu.com/live?cid=21" width="640" height="480" bitrate="1044" />
</media>
<media id="302" version="1" title="吉林都市" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jldspd" >
<ref href="rtsp://222.168.5.236/jlds/" width="320" height="240" bitrate="548" />
</media>
<media id="303" version="1" title="吉林生活" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jlssh" >
<ref href="rtsp://222.168.5.236/jlsh" width="320" height="240" bitrate="548" />
</media>
<media id="304" version="1" title="吉林影视" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jlyspd" >
<ref href="rtsp://222.168.5.236/jlys" width="320" height="240" bitrate="548" />
</media>
<media id="305" version="1" title="吉林乡村" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jlxcpd" >
<ref href="rtsp://222.168.5.236/jlxc/" width="320" height="240" bitrate="548" />
</media>
<media id="306" version="1" title="吉林法制" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jlfz" >
<ref href="rtsp://222.168.5.236/jlfz" width="320" height="240" bitrate="548" />
</media>
<media id="307" version="1" title="吉林公共" image="http://cn.daroonsoft.com/images/jilintv.png" guide="jlggpd" >
<ref href="rtsp://222.168.5.236/jlgg" width="320" height="240" bitrate="548" />
</media>
<media id="308" version="1" title="长春综合频道" image="http://cn.daroonsoft.com/images/changchuntv.png" guide="" >
<ref href="rtsp://video.chinactv.com/CTV/" width="320" height="240" bitrate="548" />
</media>
<media id="170" version="13" title="东南卫视" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="dnws" >
<ref href="http://gslb.tv.sohu.com/live?cid=7" width="640" height="480" bitrate="1044" />
<ref href="mms://video.fjtv.net/setv" width="320" height="240" bitrate="548" />
</media>
<media id="226" version="8" title="福建海峡卫视" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="" >
<ref href="mms://video.fjtv.net/fjtv9" width="320" height="240" bitrate="548" />
<ref href="mms://video.fjtv.net/fjtv10" width="320" height="240" bitrate="548" />
</media>
<media id="345" version="1" title="福建综合" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="fjzhpd" >
<ref href="mms://video.fjtv.net/fjtv1" width="320" height="240" bitrate="548" />
</media>
<media id="346" version="1" title="福建公共" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="fjggpd" >
<ref href="mms://video.fjtv.net/fjtv3" width="320" height="240" bitrate="548" />
</media>
<media id="347" version="1" title="福建新闻" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="fjxwpd" >
<ref href="mms://video.fjtv.net/fjtv4" width="320" height="240" bitrate="548" />
</media>
<media id="348" version="1" title="福建电视剧" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="fjdsjpd" >
<ref href="mms://video.fjtv.net/fjtv5" width="320" height="240" bitrate="548" />
</media>
<media id="349" version="1" title="福建都市时尚" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="fjdssspd" >
<ref href="mms://video.fjtv.net/fjtv6" width="320" height="240" bitrate="548" />
</media>
<media id="350" version="1" title="福建经济生活" image="http://cn.daroonsoft.com/images/dongnantv.png" guide="fjjjshpd" >
<ref href="mms://video.fjtv.net/fjtv7" width="320" height="240" bitrate="548" />
</media>
<media id="286" version="10" title="厦门卫视" image="http://cn.daroonsoft.com/images/xiamentv.png" guide="xmws" >
<ref href="mms://mediasrv1.iptv.xmg.com.cn/tvhaixia" width="480" height="384" bitrate="544" />
<ref href="http://gslb.tv.sohu.com/live?cid=6" width="640" height="480" bitrate="1240" />
</media>
<media id="171" version="5" title="甘肃卫视" image="http://cn.daroonsoft.com/images/gansutv.png" guide="gsws" >
<ref href="http://gslb.tv.sohu.com/live?cid=34" width="640" height="480" bitrate="1044" />
</media>
<media id="172" version="8" title="河北卫视" image="http://cn.daroonsoft.com/images/hebeitv.png" guide="hebeiws" >
<ref href="http://gslb.tv.sohu.com/live?cid=24" width="640" height="480" bitrate="1044" />
</media>
<media id="174" version="10" title="青海卫视" image="http://cn.daroonsoft.com/images/qinghaitv.png" guide="qhws" >
<ref href="http://gslb.tv.sohu.com/live?cid=12" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=71" width="352" height="288" bitrate="512" />
</media>
<media id="060" version="5" title="珠海1台" image="http://cn.daroonsoft.com/images/zhuhaitv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/izhuhai.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
<ref href="rtmp://live.zhtv.com/live/zhtv1" width="640" height="480" bitrate="1044" />
</media>
<media id="334" version="5" title="珠海2台" image="http://cn.daroonsoft.com/images/zhuhaitv.png" guide="" >
<ref href="rtmp://live.zhtv.com/live/zhtv2" width="640" height="480" bitrate="1044" />
</media>
<media id="061" version="11" title="南方卫视" image="http://cn.daroonsoft.com/images/tvs.png" guide="nfwspd" >
<ref href="http://58.248.254.7:1935/live/itvs2.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
<ref href="http://gslb.tv.sohu.com/live?cid=16" width="640" height="480" bitrate="900" />
</media>
<media id="062" version="6" title="南方影视频道" image="http://cn.daroonsoft.com/images/tvs.png" guide="nfyspd" >
<ref href="http://58.248.254.7:1935/live/itvs4.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
<ref href="rtsp://116.199.127.68/nanfang_movie" width="720" height="576" bitrate="1044" />
</media>
<media id="063" version="14" title="旅游卫视" image="http://cn.daroonsoft.com/images/nvyoutv.png" guide="lyws" >
<ref href="mms://bupt02.video.edu.cn/LYWS" width="640" height="480" bitrate="1044" />
<ref href="http://gslb.tv.sohu.com/live?cid=28" width="640" height="480" bitrate="1044" />
</media>
<media id="352" version="13" title="海南综合" image="http://cn.daroonsoft.com/images/nvyoutv.png" guide="hnzhpd" >
<ref href="rtsp://41.bluehn.com/LIVECAM1" width="384" height="288" bitrate="256" />
</media>
<media id="353" version="13" title="海南新闻" image="http://cn.daroonsoft.com/images/nvyoutv.png" guide="" >
<ref href="rtsp://40.bluehn.com/LIVECAM2" width="384" height="288" bitrate="256" />
</media>
<media id="354" version="13" title="海南影视剧" image="http://cn.daroonsoft.com/images/nvyoutv.png" guide="hnysylpd" >
<ref href="rtsp://41.bluehn.com/LIVECAM3" width="384" height="288" bitrate="256" />
</media>
<media id="355" version="13" title="海南综艺生活" image="http://cn.daroonsoft.com/images/nvyoutv.png" guide="" >
<ref href="rtsp://43.bluehn.com/LIVECAM4" width="384" height="288" bitrate="256" />
</media>
<media id="356" version="13" title="海南少儿" image="http://cn.daroonsoft.com/images/nvyoutv.png" guide="hnsepd" >
<ref href="rtsp://42.bluehn.com/LIVECAM5" width="384" height="288" bitrate="256" />
</media>
<media id="064" version="14" title="深圳卫视" image="http://cn.daroonsoft.com/images/shenzhentv.png" guide="szws" >
<ref href="mms://bupt02.video.edu.cn/SZWS" width="576" height="432" bitrate="1440" />
<ref href="http://112.231.23.20:554/rtplive/tv29/playlist.m3u8" width="320" height="240" bitrate="128" />
<ref href="http://gslb.tv.sohu.com/live?cid=45" width="640" height="480" bitrate="900" />
<ref href="rtsp://116.199.127.68/shenzhen" width="720" height="576" bitrate="1044" />
</media>
<media id="065" version="19" title="广东卫视" image="http://cn.daroonsoft.com/images/guangdongtv.png" guide="gdws" >
<ref href="http://gslb.tv.sohu.com/live?cid=60" width="800" height="448" bitrate="900" />
</media>
<media id="123" version="9" title="广东珠江" image="http://cn.daroonsoft.com/images/guangdongtv.png" guide="gdzjpd" >
<ref href="http://119.147.126.79:1863/1926463423.flv" width="640" height="480" bitrate="900" />
<ref href="http://58.248.254.7:1935/live/igdzj.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
<ref href="rtsp://116.199.127.68/zhujiang" width="720" height="576" bitrate="1044" />
</media>
<media id="124" version="6" title="广东新闻" image="http://cn.daroonsoft.com/images/guangdongtv.png" guide="gdxwpd" >
<ref href="http://182.131.19.173:1863/2631736979.flv" width="640" height="480" bitrate="900" />
</media>
<media id="015" version="16" title="广东体育" image="http://cn.daroonsoft.com/images/guangdongtv.png" guide="gdtypd" >
<ref href="rtsp://121.14.129.221/asiangames/live/gdsports-s.sdp" width="320" height="240" bitrate="128" />
<ref href="rtsp://121.14.129.221/asiangames/live/gdsports-ah.sdp" width="320" height="240" bitrate="128" />
<ref href="rtsp://121.14.129.221/asiangames/live/gdsports-h.sdp" width="320" height="240" bitrate="128" />
<ref href="rtsp://116.199.127.68/gdtv_sport" width="720" height="576" bitrate="1044" />
<ref href="rtmp://v1.gdtv.cn:1935/live/sports" width="720" height="576" bitrate="1044" />
</media>
<media id="066" version="4" title="广州影视" image="http://cn.daroonsoft.com/images/guangzhouwstv.png" guide="gzyspd" >
<ref href="http://58.248.254.7:1935/live/igzys.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
<ref href="rtsp://116.199.127.68/gztv_movie" width="720" height="576" bitrate="1044" />
</media>
<media id="234" version="1" title="广州新闻" image="http://cn.daroonsoft.com/images/guangzhouwstv.png" guide="gzxwpd" >
<ref href="rtsp://live21.gztv.com/gztv_news" width="720" height="576" bitrate="1044" />
</media>
<media id="235" version="2" title="广州综合" image="http://cn.daroonsoft.com/images/guangzhouwstv.png" guide="gzzhpd" >
<ref href="rtsp://live21.gztv.com/gztv_gz?" width="720" height="576" bitrate="1044" />
<ref href="rtsp://116.199.127.68/gztv_gz" width="720" height="576" bitrate="1044" />
</media>
<media id="369" version="1" title="广州竞赛" image="http://cn.daroonsoft.com/images/guangzhouwstv.png" guide="gzjspd" >
<ref href="rtsp://116.199.127.68/gztv_sport" width="720" height="576" bitrate="1044" />
</media>
<media id="191" version="3" title="惠州综合" image="http://cn.daroonsoft.com/images/huizhouzonghtv.png" guide="gdhzxwzhpd" >
<ref href="http://58.248.254.7:1935/live/ihzws.sdp/playlist.m3u8" width="480" height="320" bitrate="548" />
</media>
<media id="335" version="2" title="惠州公共" image="http://cn.daroonsoft.com/images/huizhouzonghtv.png" guide="" >
<ref href="http://live.hzrtv.cn/live/2da8f89ad3974579b573d45f73340d4a?fmt=H264_800K_FLV" width="720" height="576" bitrate="1044" />
</media>
<media id="192" version="2" title="江门综合" image="http://cn.daroonsoft.com/images/jiangmenzonghtv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/ijmws.sdp/playlist.m3u8" width="480" height="320" bitrate="548" />
</media>
<media id="193" version="2" title="佛山综合" image="http://cn.daroonsoft.com/images/fstv.png" guide="fsxwzhpd" >
<ref href="http://58.248.254.7:1935/live/ifsws.sdp/playlist.m3u8" width="480" height="320" bitrate="548" />
</media>
<media id="194" version="2" title="佛山公共" image="http://cn.daroonsoft.com/images/fstv.png" guide="fsggpd" >
<ref href="http://58.248.254.7:1935/live/ifsws2.sdp/playlist.m3u8" width="480" height="320" bitrate="548" />
</media>
<media id="195" version="2" title="河源综合" image="http://cn.daroonsoft.com/images/hyrtv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/ihyzh.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="196" version="2" title="河源公共" image="http://cn.daroonsoft.com/images/hyrtv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/ihygg.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="197" version="2" title="梅州综合" image="http://cn.daroonsoft.com/images/meizhoutv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/imzws.sdp/playlist.m3u8" width="480" height="320" bitrate="548" />
</media>
<media id="198" version="2" title="云浮综合" image="http://cn.daroonsoft.com/images/yunfuzonghtv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/iyunfu.sdp/playlist.m3u8" width="480" height="320" bitrate="548" />
</media>
<media id="199" version="3" title="韶关台" image="http://cn.daroonsoft.com/images/shaoguantv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/isgws.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="200" version="2" title="汕头台" image="http://cn.daroonsoft.com/images/shantoutv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/istws.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="016" version="16" title="凤凰卫视" image="http://cn.daroonsoft.com/images/Phoenixzwtv.jpg" guide="fhzw">
<ref href="mms://222.47.26.81/litv01" width="320" height="240" bitrate="598" />
<ref href="rtsp://116.199.127.68/fenghuang" width="720" height="576" bitrate="1044" />
</media>
<media id="017" version="20" title="凤凰资讯" image="http://cn.daroonsoft.com/images/Phoenixzxtv.jpg" guide="fhzx">
<ref href="mms://222.47.26.81/litv03" width="320" height="240" bitrate="256" />
<ref href="http://ts.3gv.ifeng.com/live/iphone/zwt/index_256k.m3u8" width="320" height="240" bitrate="256" />
</media>
<media id="068" version="6" title="阳光卫视" image="http://cn.daroonsoft.com/images/suntv.png" guide="ygws" >
<ref href="rtsp://65.49.26.231/suntv" width="320" height="240" bitrate="548" />
</media>
<media id="070" version="9" title="星空卫视" image="http://cn.daroonsoft.com/images/xingkongweishi.png" guide="xkws" >
<ref href="mms://222.47.62.74/litv06" width="320" height="240" bitrate="548" />
<ref href="rtsp://116.199.127.68/xingkong" width="720" height="576" bitrate="1044" />
</media>
<media id="164" version="6" title="CHC动作电影" image="http://cn.daroonsoft.com/images/chcdzdy.png" guide="chcdzdy" >
<ref href="rtsp://121.14.129.221/broadcast/pushfeeder/rtpencoder/dongzdy-h.sdp" width="320" height="240" bitrate="256" />
<ref href="rtsp://121.14.129.221/broadcast/pushfeeder/rtpencoder/dongzdy-s.sdp" width="176" height="144" bitrate="156" />
</media>
<media id="165" version="6" title="珠江电影" image="http://cn.daroonsoft.com/images/zjmovie.png" guide="" >
<ref href="rtsp://121.14.129.221/broadcast/pushfeeder/rtpencoder/zjdy-h.sdp" width="320" height="240" bitrate="256" />
<ref href="rtsp://121.14.129.221/broadcast/pushfeeder/rtpencoder/zjdy-c.sdp" width="176" height="144" bitrate="156" />
</media>
<media id="159" version="35" title="澳亚卫视" image="http://cn.daroonsoft.com/images/mastv.png" guide="ayws" >
<ref href="rtsp://59.125.169.12/MASTV_BS_500K" width="640" height="480" bitrate="491" />
</media>
<media id="160" version="3" title="澳视澳门" image="http://cn.daroonsoft.com/images/aoshi.png" guide="" >
<ref href="mms://media4.tdm.com.mo/ch1" width="320" height="240" bitrate="548" />
</media>
<media id="161" version="2" title="Canal Macau" image="http://cn.daroonsoft.com/images/aoshi.png" guide="" >
<ref href="mms://media4.tdm.com.mo/ch2" width="320" height="240" bitrate="548" />
</media>
<media id="162" version="4" title="澳视体育" image="http://cn.daroonsoft.com/images/aoshi.png" guide="" >
<ref href="mms://media4.tdm.com.mo/ch4" width="320" height="240" bitrate="548" />
</media>
<media id="163" version="4" title="澳视生活" image="http://cn.daroonsoft.com/images/aoshishtv.png" guide="" >
<ref href="mms://media4.tdm.com.mo/ch3" width="320" height="240" bitrate="548" />
</media>
<media id="294" version="4" title="澳门莲花台" image="http://cn.daroonsoft.com/images/lotus.png" guide="" >
<ref href="mms://222.47.62.74/litv12" width="320" height="240" bitrate="548" />
<ref href="mms://222.47.26.81/litv12" width="320" height="240" bitrate="548" />
</media>
<media id="075" version="11" title="华娱卫视" image="http://cn.daroonsoft.com/images/cetvtv.PNG" guide="hyws" >
<ref href="mms://222.47.62.74/litv13" width="320" height="240" bitrate="548" />
<ref href="rtsp://116.199.127.68/huayu" width="720" height="576" bitrate="1044" />
</media>
<media id="231" version="1" title="东风37台" image="http://cn.daroonsoft.com/images/aziotv.png" guide="" >
<ref href="rtsp://203.69.41.22/TA_AZIO_AZIOT_200_MO" width="320" height="240" bitrate="548" />
</media>
<media id="236" version="3" title="健康卫视" image="http://cn.daroonsoft.com/images/jktv.png" guide="" >
<ref href="rtsp://mms.jkwshk.com/jkws" width="640" height="480" bitrate="412" />
<ref href="http://gslb.tv.sohu.com/live?cid=53" width="640" height="480" bitrate="1044" />
</media>
<media id="201" version="3" title="邮轮旅游" image="http://cn.daroonsoft.com/images/youlunlvyoutv.png" guide="" >
<ref href="http://58.248.254.7:1935/live/iylly.sdp/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="107" version="5" title="NOW" image="http://cn.daroonsoft.com/images/nowtv.png" guide="" >
<ref href="mms://222.47.26.81/litv14" width="320" height="240" bitrate="548" />
</media>
<media id="203" version="2" title="韩KBS高清" image="http://cn.daroonsoft.com/images/kbstv.png" guide="" >
<ref href="http://news24kbs-2.gscdn.com/news24_300/_definst_/news24_300.stream/playlist.m3u8" width="480" height="270" bitrate="420" />
</media>
<media id="204" version="2" title="韩WOWNet" image="http://cn.daroonsoft.com/images/wownettv.png" guide="" >
<ref href="http://wowmlive.shinbnstar.com:1935/live2/wowtv/playlist.m3u8" width="320" height="240" bitrate="128" />
</media>
<media id="208" version="2" title="日NHK高清" image="http://cn.daroonsoft.com/images/nhktv.png" guide="" >
<ref href="http://plslive-w.nhk.or.jp/nhkworld/app/high.m3u8" width="480" height="272" bitrate="548" />
</media>
<media id="209" version="2" title="日NHK" image="http://cn.daroonsoft.com/images/nhktv.png" guide="" >
<ref href="http://plslive-w.nhk.or.jp/nhkworld/app/mid.m3u8" width="480" height="272" bitrate="548" />
</media>
<media id="212" version="4" title="euronews" image="http://cn.daroonsoft.com/images/euronews.png" guide="" >
<ref href="http://media4.lsops.net/live/_definst_/euronews_en_medium.sdp/playlist.m3u8" width="480" height="304" bitrate="548" />
<ref href="rtsp://media2.lsops.net/live/euronews_en_high.sdp" width="480" height="304" bitrate="548" />
</media>
<media id="213" version="6" title="CNN" image="http://cn.daroonsoft.com/images/cnn.png" guide="cnn" >
<ref href="http://media4.lsops.net/live/_definst_/cnn_en_medium.sdp/playlist.m3u8" width="432" height="320" bitrate="548" />
</media>
<media id="277" version="3" title="星空体育" image="http://cn.daroonsoft.com/images/star_sports.png" guide="" >
<ref href="rtmp://livertmp1.wasu.cn/live3/stars" width="640" height="480" bitrate="412" />
</media>
</body>
<categories>
<category id="01" version="9" name="中央电视台" >
<item>001</item>
<item>002</item>
<item>003</item>
<item>004</item>
<item>005</item>
<item>006</item>
<item>007</item>
<item>008</item>
<item>009</item>
<item>010</item>
<item>011</item>
<item>012</item>
<item>013</item>
<item>014</item>
<item>214</item>
<item>216</item>
<item>072</item>
<item>073</item>
<item>366</item>
<item>370</item>
</category>
<category id="02" version="39" name="地方卫视" >
<item>018</item>
<item>027</item>
<item>036</item>
<item>037</item>
<item>038</item>
<item>039</item>
<item>042</item>
<item>043</item>
<item>044</item>
<item>045</item>
<item>046</item>
<item>047</item>
<item>048</item>
<item>049</item>
<item>050</item>
<item>051</item>
<item>052</item>
<item>053</item>
<item>054</item>
<item>055</item>
<item>056</item>
<item>057</item>
<item>058</item>
<item>059</item>
<item>061</item>
<item>064</item>
<item>170</item>
<item>171</item>
<item>172</item>
<item>174</item>
<item>286</item>
</category>
<category id="03" version="36" name="港澳台电视台" >
<item>016</item>
<item>017</item>
<item>068</item>
<item>070</item>
<item>075</item>
<item>107</item>
<item>159</item>
<item>160</item>
<item>161</item>
<item>162</item>
<item>163</item>
<item>164</item>
<item>231</item>
<item>294</item>
</category>
<category id="04" version="31" name="国外电视台" >
<item>203</item>
<item>204</item>
<item>208</item>
<item>209</item>
<item>212</item>
<item>213</item>
<item>201</item>
<item>277</item>
</category>
<category id="05" version="30" name="体育频道" >
<item>005</item>
<item>015</item>
<item>094</item>
<item>126</item>
<item>140</item>
<item>322</item>
<item>366</item>
<item>367</item>
<item>368</item>
<item>277</item>
<item>369</item>
</category>
<category id="06" version="18" name="湖南电视台" >
<item>018</item>
<item>022</item>
<item>112</item>
<item>113</item>
<item>114</item>
</category>
<category id="07" version="15" name="上海电视台" >
<item>027</item>
<item>108</item>
<item>111</item>
<item>126</item>
<item>127</item>
<item>128</item>
<item>130</item>
<item>131</item>
<item>132</item>
<item>133</item>
<item>372</item>
<item>373</item>
<item>240</item>
<item>320</item>
<item>368</item>
</category>
<category id="08" version="6" name="北京电视台" >
<item>036</item>
<item>085</item>
<item>086</item>
<item>087</item>
<item>088</item>
<item>089</item>
<item>090</item>
<item>094</item>
</category>
<category id="09" version="8" name="浙江电视台" >
<item>056</item>
<item>115</item>
<item>116</item>
<item>117</item>
<item>118</item>
<item>119</item>
<item>202</item>
<item>337</item>
<item>338</item>
<item>339</item>
<item>340</item>
<item>341</item>
<item>342</item>
</category>
<category id="10" version="6" name="湖北电视台" >
<item>040</item>
<item>134</item>
<item>140</item>
<item>141</item>
<item>225</item>
</category>
<category id="11" version="11" name="深圳电视台" >
<item>064</item>
</category>
<category id="12" version="11" name="广东电视台" >
<item>015</item>
<item>060</item>
<item>061</item>
<item>062</item>
<item>065</item>
<item>066</item>
<item>123</item>
<item>124</item>
<item>165</item>
<item>191</item>
<item>192</item>
<item>193</item>
<item>194</item>
<item>195</item>
<item>196</item>
<item>197</item>
<item>198</item>
<item>199</item>
<item>200</item>
<item>234</item>
<item>235</item>
<item>334</item>
<item>335</item>
<item>369</item>
</category>
<category id="13" version="1" name="四川电视台" >
<item>055</item>
<item>295</item>
<item>296</item>
<item>297</item>
<item>298</item>
<item>299</item>
<item>300</item>
<item>301</item>
</category>
<category id="014" version="1" name="安徽电视台" >
<item>057</item>
<item>323</item>
<item>324</item>
<item>325</item>
<item>326</item>
<item>327</item>
<item>328</item>
<item>329</item>
</category>
<category id="15" version="1" name="吉林电视台" >
<item>059</item>
<item>302</item>
<item>303</item>
<item>304</item>
<item>305</item>
<item>306</item>
<item>307</item>
<item>308</item>
</category>
<category id="16" version="2" name="福建电视台" >
<item>170</item>
<item>226</item>
<item>345</item>
<item>346</item>
<item>347</item>
<item>348</item>
<item>349</item>
<item>350</item>
<item>286</item>
</category>
<category id="17" version="2" name="黑龙江电视台" >
<item>042</item>
</category>
<category id="18" version="1" name="武汉电视台" >
<item>322</item>
<item>332</item>
</category>
<category id="19" version="1" name="云南电视台" >
<item>047</item>
<item>310</item>
<item>311</item>
<item>312</item>
</category>
<category id="020" version="1" name="海南电视台" >
<item>063</item>
<item>352</item>
<item>353</item>
<item>354</item>
<item>355</item>
<item>356</item>
</category>
<category id="21" version="1" name="甘肃电视台" >
<item>171</item>
</category>
<category id="22" version="3" name="陕西电视台" >
<item>045</item>
</category>
<category id="23" version="2" name="其他电视台" >
<item>187</item>
<item>236</item>
</category>
</categories>
</list>
================================================
FILE: project.properties
================================================
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "ant.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-17
android.library.reference.1=../VitamioBundle
================================================
FILE: res/anim/slide_in_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/res/anim/slide_in_left.xml ** ** Copyright 2007,
The Android Open Source Project ** ** Licensed under the Apache License,
Version 2.0 (the "License"); ** you may not use this file except in compliance
with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0
** ** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the
License for the specific language governing permissions and ** limitations
under the License. */
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="300"
android:fromYDelta="-100%"
android:toYDelta="0" />
<alpha
android:duration="300"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
================================================
FILE: res/anim/slide_in_top.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/res/anim/slide_in_right.xml ** ** Copyright
2007, The Android Open Source Project ** ** Licensed under the Apache License,
Version 2.0 (the "License"); ** you may not use this file except in compliance
with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0
** ** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the
License for the specific language governing permissions and ** limitations
under the License. */
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="300"
android:fromYDelta="100%"
android:toYDelta="0" />
<alpha
android:duration="300"
android:fromAlpha="0.0"
android:toAlpha="1.0" />
</set>
================================================
FILE: res/anim/slide_out_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/res/anim/slide_out_left.xml ** ** Copyright
2007, The Android Open Source Project ** ** Licensed under the Apache License,
Version 2.0 (the "License"); ** you may not use this file except in compliance
with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0
** ** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the
License for the specific language governing permissions and ** limitations
under the License. */
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="300"
android:fromYDelta="0"
android:toYDelta="-100%" />
<alpha
android:duration="300"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
================================================
FILE: res/anim/slide_out_top.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/res/anim/slide_out_right.xml ** ** Copyright
2007, The Android Open Source Project ** ** Licensed under the Apache License,
Version 2.0 (the "License"); ** you may not use this file except in compliance
with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0
** ** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the
License for the specific language governing permissions and ** limitations
under the License. */
-->
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="300"
android:fromYDelta="0"
android:toYDelta="100%" />
<alpha
android:duration="300"
android:fromAlpha="1.0"
android:toAlpha="0.0" />
</set>
================================================
FILE: res/drawable/alphabet_scroller_bg.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/contact_list_scroll_pressed" />
<item android:drawable="@drawable/contact_list_scroll_normal" />
</selector>
================================================
FILE: res/drawable/home_btn_bg.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false" android:drawable="@drawable/home_bg_normal" />
<item android:state_checked="true" android:drawable="@drawable/home_bg_checked" />
</selector>
================================================
FILE: res/drawable/mediacontroller_btn_bg.xml
================================================
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/mediacontroller_bg_pressed" android:state_focused="true"/>
<item android:drawable="@color/mediacontroller_bg_pressed" android:state_pressed="true"/>
<item android:drawable="@color/transparent" android:state_enabled="false"/>
<item android:drawable="@color/transparent"/>
</selector>
================================================
FILE: res/drawable/mediacontroller_pause_button.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/mediacontroller_pause02" android:state_focused="true" android:state_pressed="false"/>
<item android:drawable="@drawable/mediacontroller_pause02" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="@drawable/mediacontroller_pause02" android:state_focused="false" android:state_pressed="true"/>
<item android:drawable="@drawable/mediacontroller_pause01"/>
</selector>
================================================
FILE: res/drawable/mediacontroller_play_button.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/mediacontroller_play02" android:state_focused="true" android:state_pressed="false"/>
<item android:drawable="@drawable/mediacontroller_play02" android:state_focused="true" android:state_pressed="true"/>
<item android:drawable="@drawable/mediacontroller_play02" android:state_focused="false" android:state_pressed="true"/>
<item android:drawable="@drawable/mediacontroller_play01"/>
</selector>
================================================
FILE: res/drawable/mediacontroller_seekbar.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/mediacontroller_seekbar02"/>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="#00000000" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<layer-list>
<item
android:bottom="2.0dip"
android:left="2.0dip"
android:right="2.0dip"
android:top="2.0dip">
<bitmap
android:gravity="center_vertical|fill_vertical|left"
android:src="@drawable/mediacontroller_seekbar01"
android:tileMode="disabled" />
</item>
</layer-list>
</clip>
</item>
</layer-list>
================================================
FILE: res/drawable/mediacontroller_seekbar_thumb.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring" >
<solid android:color="#00000000" />
<size
android:height="40dip"
android:width="40dip" />
</shape>
================================================
FILE: res/drawable/scrubber_control_selector_holo.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2011 The Android Open Source Project Licensed under the
Apache License, Version 2.0 (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false"
android:drawable="@drawable/scrubber_control_disabled_holo" />
<item android:state_pressed="true"
android:drawable="@drawable/scrubber_control_pressed_holo" />
<item android:state_selected="true"
android:drawable="@drawable/scrubber_control_focused_holo" />
<item android:drawable="@drawable/scrubber_control_normal_holo" />
</selector>
================================================
FILE: res/drawable/scrubber_progress_horizontal_holo_dark.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 The Android Open Source Project Licensed under the
Apache License, Version 2.0 (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background" android:drawable="@drawable/scrubber_track_holo_dark" />
<item android:id="@android:id/secondaryProgress">
<scale android:scaleWidth="100%" android:drawable="@drawable/scrubber_secondary_holo" />
</item>
<item android:id="@android:id/progress">
<scale android:scaleWidth="100%" android:drawable="@drawable/scrubber_primary_holo" />
</item>
</layer-list>
================================================
FILE: res/layout/activity_video.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<io.vov.vitamio.widget.CenterLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/video_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black"
android:orientation="horizontal" >
<com.nmbb.oplayer.ui.player.VideoView
android:id="@+id/video"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:saveEnabled="true" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<RelativeLayout
android:id="@+id/video_loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone" >
<!-- <ImageView
android:id="@+id/video_loading_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:src="@drawable/icon" /> -->
<ProgressBar
android:id="@+id/video_loading_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<TextView
android:id="@+id/video_loading_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/video_loading_progress"
android:layout_centerHorizontal="true"
android:paddingTop="7.0dip"
android:text="@string/video_layout_loading"
android:textColor="@android:color/white"
android:textSize="20.0sp" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/subtitle_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="10.0dip" >
<io.vov.vitamio.widget.OutlineTextView
android:id="@+id/subtitle_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center_vertical|center_horizontal"
android:shadowColor="@color/gray"
android:shadowDx="1"
android:shadowDy="1"
android:shadowRadius="2"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/subtitle_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:contentDescription="@string/imageview_content_description"
android:gravity="center_vertical|center_horizontal"
android:visibility="gone" />
</RelativeLayout>
</RelativeLayout>
</io.vov.vitamio.widget.CenterLayout>
================================================
FILE: res/layout/brightness_volumn.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00000000"
android:orientation="horizontal"
android:padding="0dip" >
<ImageView
android:id="@+id/operation_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/video_volumn_bg" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:paddingBottom="25dip" >
<ImageView
android:id="@+id/operation_full"
android:layout_width="94dip"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:src="@drawable/video_num_bg" />
<ImageView
android:id="@+id/operation_percent"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:scaleType="matrix"
android:src="@drawable/video_num_front" />
</FrameLayout>
</FrameLayout>
================================================
FILE: res/layout/common_loading.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/loading"
android:background="@null"
android:visibility="gone" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" >
<ProgressBar
style="?android:attr/progressBarStyleSmallTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ff274462"
android:text="@string/loadinfo" />
</LinearLayout>
</RelativeLayout>
================================================
FILE: res/layout/fragment_file.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/templist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:cacheColorHint="@android:color/transparent"
android:divider="@drawable/ic_line"
android:drawSelectorOnTop="false"
android:fadingEdge="none"
android:listSelector="@android:color/transparent"
android:scrollbars="none"
android:visibility="gone" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1.0"
android:orientation="horizontal" >
<FrameLayout
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="@android:color/transparent"
android:divider="@drawable/ic_line"
android:drawSelectorOnTop="false"
android:fadingEdge="none"
android:listSelector="@android:color/transparent"
android:scrollbars="none" />
<TextView
android:id="@+id/first_letter_overlay"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="50.0dip"
android:layout_marginTop="49.0dip"
android:background="@drawable/fast_scroller_overlay"
android:gravity="center"
android:paddingBottom="5.0dip"
android:scaleType="center"
android:textSize="43.0dip"
android:visibility="gone" />
<include layout="@layout/common_loading" />
</FrameLayout>
<ImageView
android:id="@+id/alphabet_scroller"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:paddingRight="0dip"
android:scaleType="fitXY"
android:src="@drawable/alphabet_scroller_bg" />
</LinearLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/sd_bar_bg" >
<ProgressBar
android:id="@android:id/progress"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="5dip"
android:visibility="gone" />
<TextView
android:id="@+id/sd_block"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dip"
android:textColor="@color/white" />
</RelativeLayout>
</LinearLayout>
================================================
FILE: res/layout/fragment_file_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearlayout_row"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ImageView
android:layout_width="92.0dip"
android:layout_height="68.0dip"
android:scaleType="fitXY"
android:src="@drawable/video_back" />
<ImageView
android:id="@+id/thumbnail"
android:layout_width="83.0dip"
android:layout_height="60.0dip"
layout_gravity="center_vertical"
android:layout_centerVertical="true"
android:layout_marginLeft="4.0dip"
android:background="@drawable/default_thumbnail"
android:scaleType="fitXY" />
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10.0dip"
android:layout_marginTop="5.0dip"
android:layout_toRightOf="@+id/thumbnail"
android:layout_toLeftOf="@+id/status"
android:marqueeRepeatLimit="marquee_forever"
android:maxLines="2"
android:singleLine="false"
android:textColor="@color/title"
android:textSize="16sp"
android:textStyle="normal" />
<TextView
android:id="@+id/file_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_below="@+id/title"
android:layout_marginLeft="10.0dip"
android:layout_toRightOf="@+id/thumbnail"
android:paddingBottom="3.0dip"
android:textColor="@color/title"
android:textSize="12sp" />
<ImageView
android:id="@+id/status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="4.0dip"
android:layout_marginRight="4.0dip"
android:visibility="gone" />
</RelativeLayout>
================================================
FILE: res/layout/fragment_online.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="@android:color/transparent"
android:divider="@drawable/ic_line"
android:drawSelectorOnTop="false"
android:fadingEdge="none"
android:listSelector="#e8e8e8"
android:scrollbars="none" />
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone" >
</WebView>
<include layout="@layout/common_loading" />
<TextView
android:id="@+id/url" android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom" android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:layout_marginBottom="5dip"
android:layout_marginLeft="5dip"
android:background="@drawable/in_bubble" />
</FrameLayout>
================================================
FILE: res/layout/fragment_online_item.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearlayout_row"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/thumbnail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
layout_gravity="center_vertical"
android:layout_centerVertical="true"
android:layout_margin="4.0dip" />
<ImageView android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="5.0dip"
android:src="@drawable/arrow_right" />
<TextView
android:id="@+id/title"
android:layout_toLeftOf="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginRight="8.0dip"
android:marqueeRepeatLimit="marquee_forever"
android:maxLines="2"
android:singleLine="false"
android:textColor="@color/title"
android:textSize="16sp"
android:textStyle="normal" />
</RelativeLayout>
================================================
FILE: res/layout/fragment_pager.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:gravity="center_horizontal"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<RadioGroup android:gravity="center_vertical"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton android:id="@+id/radio_file" android:checked="true"
style="@style/main_tab_bottom" android:drawableTop="@drawable/video_file"
android:text="@string/title_file" />
<RadioButton android:id="@+id/radio_online"
android:drawableTop="@drawable/video_online" style="@style/main_tab_bottom"
android:text="@string/title_online" />
</RadioGroup>
<android.support.v4.view.ViewPager
android:background="@color/background" android:id="@+id/pager"
android:layout_width="fill_parent" android:layout_height="fill_parent">
</android.support.v4.view.ViewPager>
</LinearLayout>
================================================
FILE: res/layout/mediacontroller.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:id="@+id/mediacontroller"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="0.0dip"
android:orientation="horizontal"
android:visibility="invisible" >
<LinearLayout
android:id="@+id/info_panel"
style="@style/InfoPanel_Container"
android:layout_width="match_parent"
android:layout_height="@dimen/action_bar_default_height"
android:gravity="center_horizontal|center"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/mediacontroller_lock"
style="@style/MediaController_Button"
android:layout_width="@dimen/action_bar_default_height"
android:layout_height="match_parent"
android:contentDescription="@string/content_desc_lock"
android:src="@drawable/mediacontroller_unlock" />
<TextView
android:id="@+id/mediacontroller_file_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingLeft="8dip"
android:singleLine="true"
android:textColor="@android:color/white"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/download_rate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/video_download_rate"
android:drawablePadding="3.0dp"
android:paddingRight="12dp"
android:textColor="@android:color/white"
android:visibility="gone" />
<TextView
android:id="@+id/date_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="12dp"
android:textColor="@android:color/white" />
<TextView
android:id="@+id/battery_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="12dp"
android:textColor="@android:color/white" />
<ImageButton
android:id="@+id/video_menu"
style="@style/MediaController_Button"
android:layout_width="@dimen/action_bar_default_height"
android:layout_height="match_parent"
android:contentDescription="@string/imageview_content_description"
android:src="@drawable/video_more" />
</LinearLayout>
<LinearLayout
android:id="@+id/mediacontroller_controls"
style="@style/MediaController_Container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="0.0dip"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/mediacontroller_time_current"
style="@style/MediaController_Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />
<SeekBar
android:id="@+id/mediacontroller_seekbar"
style="@style/Widget.ZI.SeekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/mediacontroller_time_total"
android:layout_toRightOf="@+id/mediacontroller_time_current"
android:focusable="true"
android:max="1000" />
<TextView
android:id="@+id/mediacontroller_time_total"
style="@style/MediaController_Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/mediacontroller_controls_buttons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/mediacontroller_buttons_bottom_margin"
android:layout_marginTop="@dimen/mediacontroller_buttons_top_margin"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/mediacontroller_play_pause"
style="@style/MediaController_Button"
android:layout_width="64dip"
android:layout_height="48dip"
android:layout_centerInParent="true"
android:contentDescription="@string/imageview_content_description"
android:gravity="center"
android:src="@drawable/mediacontroller_pause" />
<ImageButton
android:id="@+id/mediacontroller_snapshot"
style="@style/MediaController_Button"
android:layout_width="64dip"
android:layout_height="42dip"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/mediacontroller_button_space"
android:layout_toLeftOf="@id/mediacontroller_play_pause"
android:contentDescription="@string/imageview_content_description"
android:gravity="center"
android:src="@drawable/mediacontroller_snapshot" />
<ImageButton
android:id="@+id/mediacontroller_screen_size"
style="@style/MediaController_Button"
android:layout_width="64dip"
android:layout_height="42dip"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/mediacontroller_button_space"
android:layout_toRightOf="@id/mediacontroller_play_pause"
android:contentDescription="@string/imageview_content_description"
android:gravity="center"
android:src="@drawable/mediacontroller_screen_size" />
<!--
<TextView
android:id="@+id/mediacontroller_definition"
style="@style/MediaController_Button"
android:layout_width="64dip"
android:layout_height="42dip"
android:layout_centerVertical="true"
android:layout_marginLeft="@dimen/mediacontroller_button_space"
android:layout_toRightOf="@id/mediacontroller_screen_size"
android:gravity="center"
android:text="普清"
android:textColor="@color/white"
android:textSize="18sp" />
-->
</RelativeLayout>
</LinearLayout>
</RelativeLayout>
<!--
<RelativeLayout
android:id="@+id/operation_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
-->
<TextView
android:id="@+id/operation_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@color/mediacontroller_bg"
android:paddingBottom="0dip"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:paddingTop="0dip"
android:textColor="@android:color/white"
android:textSize="46sp"
android:textStyle="bold"
android:visibility="gone" />
<include
android:id="@+id/operation_volume_brightness"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
layout="@layout/brightness_volumn"
android:visibility="gone" />
<!-- </RelativeLayout> -->
</RelativeLayout>
================================================
FILE: res/layout/mediaplayer.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView android:id="@+id/surface"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:layout_centerVertical="true" />
</RelativeLayout>
================================================
FILE: res/layout/my_media_controller.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#FFFFFFFF" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="74dip"
android:layout_marginLeft="0.0dip" android:layout_marginRight="0.0dip"
android:layout_marginBottom="0.0dip" android:layout_alignParentBottom="true">
<ImageButton android:id="@+id/mediacontroller_pause"
android:background="#00000000" android:layout_width="54dip"
android:layout_height="34dip" android:layout_marginRight="7.0dip"
android:layout_alignParentRight="true" android:layout_centerVertical="true"
android:layout_centerHorizontal="true" android:gravity="center" />
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_marginTop="2dip"
android:layout_marginBottom="2dip" android:layout_marginLeft="7.0dip"
android:layout_marginRight="7.0dip" android:layout_toLeftOf="@+id/mediacontroller_pause">
<RelativeLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/times">
<TextView android:id="@+id/mediacontroller_time_current"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentLeft="true" android:layout_alignParentTop="true" />
<TextView android:id="@+id/mediacontroller_time_total"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
<SeekBar android:id="@+id/mediacontroller_progress"
android:focusable="false" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_below="@+id/times"
android:layout_centerVertical="true" />
<TextView android:id="@+id/mediacontroller_file_name"
android:ellipsize="marquee" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:singleLine="true"
android:layout_alignParentBottom="true" />
</RelativeLayout>
</RelativeLayout>
================================================
FILE: res/layout/videoview.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<io.vov.vitamio.widget.VideoView
android:id="@+id/surface_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
<LinearLayout
android:id="@+id/video_loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center_vertical" >
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="7.0dip"
android:text="@string/video_layout_loading"
android:textColor="@color/white"
android:textSize="20.0sp" />
</LinearLayout>
<FrameLayout
android:id="@+id/operation_volume_brightness"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="#00000000"
android:orientation="horizontal"
android:padding="0dip"
android:visibility="invisible" >
<ImageView
android:id="@+id/operation_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/video_volumn_bg" />
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:paddingBottom="25dip" >
<ImageView
android:id="@+id/operation_full"
android:layout_width="94dip"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:src="@drawable/video_num_bg" />
<ImageView
android:id="@+id/operation_percent"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:scaleType="matrix"
android:src="@drawable/video_num_front" />
</FrameLayout>
</FrameLayout>
</RelativeLayout>
================================================
FILE: res/values/colors.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#ffffffff</color>
<color name="black">#ff000000</color>
<color name="blue">#ff0000ff</color>
<color name="green">#ff00ff00</color>
<color name="red">#ffff0000</color>
<color name="higtlight">#ff0078f0</color>
<color name="durationtext">#ff7d7d7d</color>
<color name="background">#ffc3ddea</color>
<color name="yellow">#ffffcc00</color>
<color name="title">#ff274462</color>
<color name="gray">#808080ff</color>
<color name="transparent">#00000000</color>
<color name="mediacontroller_bg_pressed">#ff53c1bd</color>
<color name="mediacontroller_bg">#99000000</color>
<color name="background_dark">#f4f4f4</color>
</resources>
================================================
FILE: res/values/dimens.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="LargeTextSize">16.0dip</dimen>
<dimen name="BasicTextSize">15.0dip</dimen>
<dimen name="TitleTextSize">18.0dip</dimen>
<dimen name="SmallTextSize">14.0dip</dimen>
<dimen name="SmallerTextSize">13.0dip</dimen>
<dimen name="LargestTextSize">30.0dip</dimen>
<dimen name="ChattingContentMinHeight">49.0dip</dimen>
<dimen name="ChuZhuangWH">40.0dip</dimen>
<dimen name="action_bar_default_height">48dp</dimen>
<dimen name="mediacontroller_button_space">32dp</dimen>
<dimen name="mediacontroller_buttons_top_margin">2dp</dimen>
<dimen name="mediacontroller_buttons_bottom_margin">0dp</dimen>
</resources>
================================================
FILE: res/values/strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">开播视频</string>
<string name="version_name">1.0</string>
<string name="title_file">本地视频</string>
<string name="title_online">在线视频</string>
<string name="init_decoders">初始化播放器...</string>
<string name="loadinfo">载入中,请稍后...</string>
<string name="file_oper">文件操作</string>
<string name="file_rename">重命名</string>
<string name="file_rename_failed">重命名失败</string>
<string name="file_rename_exists">文件已存在</string>
<string name="file_delete">删除</string>
<string name="file_delete_confirm">确定删除 (%s) ?</string>
<string name="video_layout_loading">正在缓冲...</string>
<string name="vitamio_theme_app_name">VPlayer codec</string>
<string name="VideoView_error_title">Cannot play video</string>
<string name="VideoView_error_text_invalid_progressive_playback">Sorry, this video is not valid for streaming to
this device.</string>
<string name="VideoView_error_text_unknown">对不起,这个视频不能播放。</string>
<string name="VideoView_error_button">OK</string>
<string name="mediacontroller_play_pause">Play/Pause</string>
<string name="imageview_content_description"></string>
<string name="content_desc_lock">锁定</string>
<string name="video_original">100%</string>
<string name="video_fit_screen">全屏</string>
<string name="video_stretch">拉伸</string>
<string name="video_crop">裁剪</string>
<string name="video_screen_locked">屏幕已锁定</string>
<string name="video_screen_unlocked">屏幕锁定已解除</string>
<string name="video_layout_buffering_progress">缓冲: %.2f%%</string>
<string name="video_cannot_play">对不起,这个视频不能播放。</string>
<string name="file_explorer_sdcard_not_available">SD卡无法读取</string>
<string name="video_screenshot_save_in">截图存放在 %s.</string>
<string name="video_screenshot_failed">截图失败</string>
<string name="closing_file">正在退出…</string>
</resources> <!-- <string name="VideoView_error_text_unknown">Sorry, this video cannot be played.</string> -->
================================================
FILE: res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@color/background_dark</item>
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
<style name="Widget.ZI.SeekBar" parent="android:Widget.SeekBar">
<item name="android:progressDrawable">@drawable/scrubber_progress_horizontal_holo_dark</item>
<item name="android:indeterminateDrawable">@drawable/scrubber_progress_horizontal_holo_dark</item>
<item name="android:minHeight">13dip</item>
<item name="android:maxHeight">13dip</item>
<item name="android:thumb">@drawable/scrubber_control_selector_holo</item>
<item name="android:thumbOffset">16dip</item>
<item name="android:paddingLeft">16dip</item>
<item name="android:paddingRight">16dip</item>
</style>
<style name="main_tab_bottom">
<item name="android:textSize">12.0sp</item>
<item name="android:textColor">#ffffffff</item>
<item name="android:ellipsize">marquee</item>
<item name="android:gravity">center_horizontal</item>
<item name="android:paddingTop">2.0dip</item>
<!-- <item name="android:paddingTop">5.0dip</item> -->
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:button">@null</item>
<item name="android:singleLine">true</item>
<!-- <item name="android:drawablePadding">3.0dip</item> -->
<item name="android:layout_weight">1.0</item>
<item name="android:background">@drawable/home_btn_bg</item>
</style>
<style name="MediaController_SeekBar">
<item name="android:minHeight">16dip</item>
<item name="android:maxHeight">16dip</item>
<item name="android:progressDrawable">@drawable/mediacontroller_seekbar</item>
<item name="android:thumb">@drawable/mediacontroller_seekbar_thumb</item>
</style>
<style name="MediaController_Text">
<item name="android:textColor">#ffffffff</item>
<item name="android:textSize">14sp</item>
<item name="android:textStyle">bold</item>
</style>
<style name="InfoPanel_Container">
<item name="android:background">@color/mediacontroller_bg</item>
</style>
<style name="MediaController_Container">
<item name="android:background">@color/mediacontroller_bg</item>
<item name="android:paddingTop">4dip</item>
<item name="android:paddingBottom">8dip</item>
<item name="android:paddingLeft">8dip</item>
<item name="android:paddingRight">8dip</item>
</style>
<style name="MediaController_Button">
<item name="android:background">@drawable/mediacontroller_btn_bg</item>
</style>
<style name="MediaController_Text">
<item name="android:textColor">#ffffffff</item>
<item name="android:textSize">14sp</item>
<item name="android:textStyle">bold</item>
</style>
</resources>
================================================
FILE: res/values-large/dimens.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="ChuZhuangWH">48.0dip</dimen>
</resources>
================================================
FILE: res/values-small/dimens.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="ChuZhuangWH">32.0dip</dimen>
</resources>
================================================
FILE: res/values-sw600dp/dimens.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="action_bar_default_height">56dp</dimen>
<dimen name="mediacontroller_buttons_top_margin">8dp</dimen>
<dimen name="mediacontroller_buttons_bottom_margin">2dp</dimen>
</resources>
================================================
FILE: res/values-v11/styles.xml
================================================
<resources>
<!--
Base application theme for API 11+. This theme completely replaces
AppBaseTheme from res/values/styles.xml on API 11+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
<!-- API 11 theme customizations can go here. -->
</style>
</resources>
================================================
FILE: res/values-v14/styles.xml
================================================
<resources>
<!--
Base application theme for API 14+. This theme completely replaces
AppBaseTheme from BOTH res/values/styles.xml and
res/values-v11/styles.xml on API 14+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
</style>
</resources>
================================================
FILE: res/values-xlarge/dimens.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<dimen name="ChuZhuangWH">64.0dip</dimen>
<dimen name="action_bar_default_height">56dp</dimen>
</resources>
================================================
FILE: src/com/nmbb/oplayer/OPlayerApplication.java
================================================
package com.nmbb.oplayer;
import android.app.Application;
import android.content.Context;
import android.os.Environment;
import com.nmbb.oplayer.util.FileUtils;
public class OPlayerApplication extends Application {
private static OPlayerApplication mApplication;
/** OPlayer SD卡缓存路径 */
public static final String OPLAYER_CACHE_BASE = Environment.getExternalStorageDirectory() + "/oplayer";
/** 视频截图缓冲路径 */
public static final String OPLAYER_VIDEO_THUMB = OPLAYER_CACHE_BASE + "/thumb/";
/** 首次扫描 */
public static final String PREF_KEY_FIRST = "application_first";
@Override
public void onCreate() {
super.onCreate();
mApplication = this;
init();
}
private void init() {
//创建缓存目录
FileUtils.createIfNoExists(OPLAYER_CACHE_BASE);
FileUtils.createIfNoExists(OPLAYER_VIDEO_THUMB);
}
public static OPlayerApplication getApplication() {
return mApplication;
}
public static Context getContext() {
return mApplication;
}
/** 销毁 */
public void destory() {
mApplication = null;
}
}
================================================
FILE: src/com/nmbb/oplayer/OPreference.java
================================================
package com.nmbb.oplayer;
import java.util.Map.Entry;
import android.content.ContentValues;
import android.content.Context;
import android.content.SharedPreferences;
/** 存储系统设置 */
public class OPreference {
private static final String PREFERENCE_NAME = "preference.db";
private SharedPreferences mPreference;
public OPreference(Context ctx) {
mPreference = ctx.getApplicationContext().getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE);
}
public boolean putStringAndCommit(String key, String value) {
return mPreference.edit().putString(key, value).commit();
}
public boolean putIntAndCommit(String key, int value) {
return mPreference.edit().putInt(key, value).commit();
}
public boolean putBooleanAndCommit(String key, boolean value) {
return mPreference.edit().putBoolean(key, value).commit();
}
public boolean putIntAndCommit(ContentValues values) {
SharedPreferences.Editor editor = mPreference.edit();
for (Entry<String, Object> value : values.valueSet()) {
editor.putString(value.getKey(), value.getValue().toString());
}
return editor.commit();
}
public String getString(String key) {
return getString(key, "");
}
public String getString(String key, String defValue) {
return mPreference.getString(key, defValue);
}
public int getInt(String key) {
return getInt(key, -1);
}
public int getInt(String key, int defValue) {
return mPreference.getInt(key, defValue);
}
public boolean getBoolean(String key) {
return getBoolean(key, false);
}
public boolean getBoolean(String key, boolean defValue) {
return mPreference.getBoolean(key, defValue);
}
}
================================================
FILE: src/com/nmbb/oplayer/business/FileBusiness.java
================================================
package com.nmbb.oplayer.business;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;
import com.nmbb.oplayer.database.SQLiteHelperOrm;
import com.nmbb.oplayer.exception.Logger;
import com.nmbb.oplayer.po.POMedia;
public final class FileBusiness {
private static final String TABLE_NAME = "files";
private static final String TAG = "FileBusiness";
public static List<POMedia> getAllSortFiles() {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao<POMedia, Long> dao = db.getDao(POMedia.class);
QueryBuilder<POMedia, Long> query = dao.queryBuilder();
query.orderBy("title_key", true);
return dao.query(query.prepare());
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return new ArrayList<POMedia>();
// new DbHelper<POMedia>().queryForAll(POMedia.class);
}
// /** 获取所有已经排好序的列表 */
// public static ArrayList<PFile> getAllSortFiles(final Context ctx) {
// ArrayList<PFile> result = new ArrayList<PFile>();
// SQLiteHelper sqlite = new SQLiteHelper(ctx);
// SQLiteDatabase db = sqlite.getReadableDatabase();
// Cursor c = null;
// try {
// c = db.rawQuery("SELECT " + FilesColumns.COL_ID + "," + FilesColumns.COL_TITLE + "," + FilesColumns.COL_TITLE_PINYIN + "," + FilesColumns.COL_PATH + "," + FilesColumns.COL_DURATION + "," + FilesColumns.COL_POSITION + "," + FilesColumns.COL_LAST_ACCESS_TIME + "," + FilesColumns.COL_THUMB + "," + FilesColumns.COL_FILE_SIZE + " FROM files", null);
// while (c.moveToNext()) {
// PFile po = new PFile();
// int index = 0;
// po._id = c.getLong(index++);
// po.title = c.getString(index++);
// po.title_pinyin = c.getString(index++);
// po.path = c.getString(index++);
// po.duration = c.getInt(index++);
// po.position = c.getInt(index++);
// po.last_access_time = c.getLong(index++);
// po.thumb = c.getString(index++);
// po.file_size = c.getLong(index++);
// result.add(po);
// }
// } finally {
// if (c != null)
// c.close();
// }
// db.close();
//
// Collections.sort(result, new Comparator<PFile>() {
//
// @Override
// public int compare(PFile f1, PFile f2) {
// char c1 = f1.title_pinyin.length() == 0 ? ' ' : f1.title_pinyin.charAt(0);
// char c2 = f2.title_pinyin.length() == 0 ? ' ' : f2.title_pinyin.charAt(0);
// return c1 == c2 ? 0 : (c1 > c2 ? 1 : -1);
// }//相等返回0,-1 f2 > f2,-1
//
// });
// return result;
// }
//
// /** 重命名文件 */
// public static void renameFile(final Context ctx, final PFile p) {
// SQLiteHelper sqlite = new SQLiteHelper(ctx);
// SQLiteDatabase db = sqlite.getWritableDatabase();
// try {
// ContentValues values = new ContentValues();
// values.put(FilesColumns.COL_TITLE, p.title);
// values.put(FilesColumns.COL_TITLE_PINYIN, PinyinUtils.chineneToSpell(p.title.charAt(0) + ""));
// values.put(FilesColumns.COL_PATH, p.path);
// db.update(TABLE_NAME, values, FilesColumns.COL_ID + " = ?", new String[] { p._id + "" });
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// try {
// db.close();
// } catch (Exception e) {
// }
// }
// }
//
// /** 删除文件 */
// public static int deleteFile(final Context ctx, final PFile p) {
// SQLiteHelper sqlite = new SQLiteHelper(ctx);
// SQLiteDatabase db = sqlite.getWritableDatabase();
// int result = -1;
// try {
// result = db.delete(TABLE_NAME, FilesColumns.COL_ID + " = ?", new String[] { p._id + "" });
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// try {
// db.close();
// } catch (Exception e) {
// }
// }
// return result;
// }
//
// public static void insertFile(final Context ctx, final PFile p) {
// SQLiteHelper sqlite = new SQLiteHelper(ctx);
// SQLiteDatabase db = sqlite.getWritableDatabase();
// try {
// ContentValues values = new ContentValues();
// values.put(FilesColumns.COL_TITLE, p.title);
// values.put(FilesColumns.COL_TITLE_PINYIN, PinyinUtils.chineneToSpell(p.title.charAt(0) + ""));
// values.put(FilesColumns.COL_PATH, p.path);
// values.put(FilesColumns.COL_LAST_ACCESS_TIME, System.currentTimeMillis());
// values.put(FilesColumns.COL_FILE_SIZE, p.file_size);
// db.insert(TABLE_NAME, "", values);
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// try {
// db.close();
// } catch (Exception e) {
// }
// }
// }
//
// /** 批量提取视频的缩略图已经视频的宽高 */
// public static ArrayList<PFile> batchBuildThumbnail(final Context ctx, final ArrayList<File> files) {
// ArrayList<PFile> result = new ArrayList<PFile>();
//
// for (File f : files) {
// PFile pf = new PFile();
// try {
// if (f.exists() && f.canRead()) {
// //取出视频的一帧图像
//// Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(ctx, f.getAbsolutePath(), Video.Thumbnails.MINI_KIND);
//// if (bitmap == null) {
//// //缩略图创建失败
//// bitmap = Bitmap.createBitmap(ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_WIDTH, ThumbnailUtils.TARGET_SIZE_MINI_THUMBNAIL_HEIGHT, Bitmap.Config.RGB_565);
//// Log.e(TAG, "batchBuildThumbnail createBitmap faild : " + f.getAbsolutePath());
//// }
////
//// pf.width = bitmap.getWidth();
//// pf.height = bitmap.getHeight();
////
//// //缩略图
//// bitmap = ThumbnailUtils.extractThumbnail(bitmap, ThumbnailUtils.dipToPX(ctx, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_WIDTH), ThumbnailUtils.dipToPX(ctx, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL_HEIGHT), ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
//// if (bitmap != null) {
//// File thum = new File(f.getParent(), f.getName() + ".jpg");
//// pf.thumb = thum.getAbsolutePath();
//// //thum.createNewFile();
//// FileOutputStream iStream = new FileOutputStream(thum);
//// bitmap.compress(Bitmap.CompressFormat.JPEG, 85, iStream);
//// iStream.close();
//// }
////
//// if (bitmap != null)
//// bitmap.recycle();
//
// }
// } catch (Exception e) {
// Log.e(TAG, e);
// continue;
// } finally {
// result.add(pf);
// }
// }
//
// return result;
// }
//
// /** 批量插入数据 */
// public static void batchInsertFiles(final Context ctx, final ArrayList<File> files) {
// SQLiteHelper sqlite = new SQLiteHelper(ctx);
// SQLiteDatabase db = sqlite.getWritableDatabase();
// try {
// db.beginTransaction();
//
// SQLiteStatement stat = db.compileStatement("INSERT INTO files(" + FilesColumns.COL_TITLE + "," + FilesColumns.COL_TITLE_PINYIN + "," + FilesColumns.COL_PATH + "," + FilesColumns.COL_LAST_ACCESS_TIME + "," + FilesColumns.COL_FILE_SIZE + ") VALUES(?,?,?,?,?)");
// for (File f : files) {
// String name = f.getName();
// int index = 1;
// stat.bindString(index++, name);// title
// stat.bindString(index++, PinyinUtils.chineneToSpell(name.charAt(0) + ""));// title_pinyin
// stat.bindString(index++, f.getPath());// path
// stat.bindLong(index++, System.currentTimeMillis());// last_access_time
// stat.bindLong(index++, f.length());
// stat.execute();
// }
// db.setTransactionSuccessful();
// } catch (BadHanyuPinyinOutputFormatCombination e) {
// e.printStackTrace();
// } catch (Exception e) {
// e.printStackTrace();
// } finally {
// db.endTransaction();
// try {
// db.close();
// } catch (Exception e) {
// }
// }
// }
}
================================================
FILE: src/com/nmbb/oplayer/database/DbHelper.java
================================================
package com.nmbb.oplayer.database;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import android.content.ContentValues;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.UpdateBuilder;
import com.nmbb.oplayer.exception.Logger;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class DbHelper<T> {
/** 新增一条记录 */
public int create(T po) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(po.getClass());
return dao.create(po);
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return -1;
}
public boolean exists(T po, Map<String, Object> where) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(po.getClass());
if (dao.queryForFieldValues(where).size() > 0) {
return true;
}
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return false;
}
public int createIfNotExists(T po, Map<String, Object> where) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(po.getClass());
if (dao.queryForFieldValues(where).size() < 1) {
return dao.create(po);
}
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return -1;
}
/** 查询一条记录 */
public List<T> queryForEq(Class<T> c, String fieldName, Object value) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(c);
return dao.queryForEq(fieldName, value);
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return new ArrayList<T>();
}
/** 删除一条记录 */
public int remove(T po) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(po.getClass());
return dao.delete(po);
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return -1;
}
/**
* 根据特定条件更新特定字段
*
* @param c
* @param values
* @param columnName where字段
* @param value where值
* @return
*/
public int update(Class<T> c, ContentValues values, String columnName, Object value) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(c);
UpdateBuilder<T, Long> updateBuilder = dao.updateBuilder();
updateBuilder.where().eq(columnName, value);
for (String key : values.keySet()) {
updateBuilder.updateColumnValue(key, values.get(key));
}
return updateBuilder.update();
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return -1;
}
/** 更新一条记录 */
public int update(T po) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(po.getClass());
return dao.update(po);
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return -1;
}
/** 查询所有记录 */
public List<T> queryForAll(Class<T> c) {
SQLiteHelperOrm db = new SQLiteHelperOrm();
try {
Dao dao = db.getDao(c);
return dao.queryForAll();
} catch (SQLException e) {
Logger.e(e);
} finally {
if (db != null)
db.close();
}
return new ArrayList<T>();
}
}
================================================
FILE: src/com/nmbb/oplayer/database/SQLiteHelperOrm.java
================================================
package com.nmbb.oplayer.database;
import java.sql.SQLException;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import com.nmbb.oplayer.OPlayerApplication;
import com.nmbb.oplayer.exception.Logger;
import com.nmbb.oplayer.po.POMedia;
public class SQLiteHelperOrm extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "oplayer.db";
private static final int DATABASE_VERSION = 1;
public SQLiteHelperOrm(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public SQLiteHelperOrm() {
super(OPlayerApplication.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, POMedia.class);
} catch (SQLException e) {
Logger.e(e);
}
}
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int arg2, int arg3) {
try {
TableUtils.dropTable(connectionSource, POMedia.class, true);
onCreate(db, connectionSource);
} catch (SQLException e) {
Logger.e(e);
}
}
}
================================================
FILE: src/com/nmbb/oplayer/exception/Logger.java
================================================
package com.nmbb.oplayer.exception;
import android.util.Log;
public class Logger {
private static boolean isLog = true;
private static final String TAG = "OPlayer";
public static void setLog(boolean isLog) {
Logger.isLog = isLog;
}
public static boolean getIsLog() {
return isLog;
}
public static void d(String tag, String msg) {
if (isLog) {
Log.d(tag, msg);
}
}
public static void d(String msg) {
Log.d(TAG, msg);
}
/**
* Send a {@link #DEBUG} log message and log the exception.
*
* @param tag Used to identify the source of a log message. It usually
* identifies the class or activity where the log call occurs.
* @param msg The message you would like logged.
* @param tr An exception to log
*/
public static void d(String tag, String msg, Throwable tr) {
if (isLog) {
Log.d(tag, msg, tr);
}
}
public static void e(Throwable tr) {
if (isLog) {
Log.e(TAG, "", tr);
}
}
public static void i(String msg) {
if (isLog) {
Log.i(TAG, msg);
}
}
public static void i(String tag, String msg) {
if (isLog) {
Log.i(tag, msg);
}
}
/**
* Send a {@link #INFO} log message and log the exception.
*
* @param tag Used to identify the source of a log message. It usually
* identifies the class or activity where the log call occurs.
* @param msg The message you would like logged.
* @param tr An exception to log
*/
public static void i(String tag, String msg, Throwable tr) {
if (isLog) {
Log.i(tag, msg, tr);
}
}
/**
* Send an {@link #ERROR} log message.
*
* @param tag Used to identify the source of a log message. It usually
* identifies the class or activity where the log call occurs.
* @param msg The message you would like logged.
*/
public static void e(String tag, String msg) {
if (isLog) {
Log.e(tag, msg);
}
}
public static void e(String msg) {
if (isLog) {
Log.e(TAG, msg);
}
}
/**
* Send a {@link #ERROR} log message and log the exception.
*
* @param tag Used to identify the source of a log message. It usually
* identifies the class or activity where the log call occurs.
* @param msg The message you would like logged.
* @param tr An exception to log
*/
public static void e(String tag, String msg, Throwable tr) {
if (isLog) {
Log.e(tag, msg, tr);
}
}
public static void e(String msg, Throwable tr) {
if (isLog) {
Log.e(TAG, msg, tr);
}
}
public static void systemErr(String msg) {
// if (true) {
if (isLog) {
if (msg != null) {
Log.e(TAG, msg);
}
}
}
}
================================================
FILE: src/com/nmbb/oplayer/po/OnlineVideo.java
================================================
package com.nmbb.oplayer.po;
import java.util.ArrayList;
public class OnlineVideo {
public String id;
/** 标题 */
public String title;
public String desc;
/** LOGO */
public int iconId = 0;
public String icon_url;
/** 播放地址 */
public String url;
/** 备用链接 */
public ArrayList<String> backup_url;
/** 是否目录 */
public boolean is_category = false;
/** 0视频 1电视 */
public int category;
/** */
public int level = 1;
public OnlineVideo() {
}
public OnlineVideo(String title, int iconId, int category) {
this.title = title;
this.iconId = iconId;
this.category = category;
}
public OnlineVideo(String title, int iconId, int category, String url) {
this.title = title;
this.iconId = iconId;
this.category = category;
this.url = url;
}
}
================================================
FILE: src/com/nmbb/oplayer/po/PFile.java
================================================
package com.nmbb.oplayer.po;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
public final class PFile {
public long _id;
/** 视频标题 */
public String title;
/** 视频标题拼音 */
public String title_pinyin;
/** 视频路径 */
public String path;
/** 最后一次访问时间 */
public long last_access_time;
/** 视频时长 */
public int duration;
/** 视频播放进度 */
public int position;
/** 视频缩略图 */
public String thumb;
/** 文件大小 */
public long file_size;
/** 文件状态0 - 10 分别代表 下载 0-100% */
public int status = -1;
/** 文件临时大小 用于下载 */
public long temp_file_size = -1L;
/** 视频宽度 */
public int width;
/** 视频高度 */
public int height;
public PFile() {
}
public PFile(Cursor c) {
//Video.Media._ID, Video.Media.TITLE, Video.Media.TITLE_KEY, Video.Media.SIZE, Video.Media.DURATION, Video.Media.DATA, Video.Media.WIDTH, Video.Media.HEIGHT
_id = c.getLong(0);
title = c.getString(1);
title_pinyin = c.getString(2);
file_size = c.getLong(3);
duration = c.getInt(4);
path = c.getString(5);
width = c.getInt(6);
height = c.getInt(7);
}
/** 获取缩略图 */
public Bitmap getThumb(Context ctx) {
return null;
// return Video.Thumbnails.getThumbnail(ctx.getApplicationContext(), ctx.getContentResolver(), _id, Video.Thumbnails.MICRO_KIND, null);
}
}
================================================
FILE: src/com/nmbb/oplayer/po/POMedia.java
================================================
package com.nmbb.oplayer.po;
import java.io.File;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
/**
* 视频PO类
*
* @author 农民伯伯
* @see http://www.cnblogs.com/over140
*
*/
@DatabaseTable(tableName = "media")
public class POMedia {
@DatabaseField(generatedId = true)
public long _id;
/** 视频标题 */
@DatabaseField
public String title;
/** 视频标题拼音 */
@DatabaseField
public String title_key;
/** 视频路径 */
@DatabaseField
public String path;
/** 最后一次访问时间 */
@DatabaseField
public long last_access_time;
/** 最后一次修改时间 */
@DatabaseField
public long last_modify_time;
/** 视频时长 */
@DatabaseField
public int duration;
/** 视频播放进度 */
@DatabaseField
public int position;
/** 视频缩略图路径 */
@DatabaseField
public String thumb_path;
/** 文件大小 */
@DatabaseField
public long file_size;
/** 视频宽度 */
@DatabaseField
public int width;
/** 视频高度 */
@DatabaseField
public int height;
/** MIME类型 */
public String mime_type;
/** 0 本地视频 1 网络视频 */
public int type = 0;
/** 文件状态0 - 10 分别代表 下载 0-100% */
public int status = -1;
/** 文件临时大小 用于下载 */
public long temp_file_size = -1L;
public POMedia() {
}
public POMedia(File f) {
title = f.getName();
path = f.getAbsolutePath();
last_modify_time = f.lastModified();
file_size = f.length();
}
public POMedia(String path, String mimeType) {
this(new File(path));
this.mime_type = mimeType;
}
}
================================================
FILE: src/com/nmbb/oplayer/preference/PreferenceUtils.java
================================================
package com.nmbb.oplayer.preference;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.preference.PreferenceManager;
import com.nmbb.oplayer.OPlayerApplication;
public final class PreferenceUtils {
/** 清空数据 */
public static void reset(final Context ctx) {
SharedPreferences.Editor edit = PreferenceManager.getDefaultSharedPreferences(ctx).edit();
edit.clear();
edit.commit();
}
public static String getString(String key, String defValue) {
return PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext()).getString(key, defValue);
}
public static long getLong(String key, long defValue) {
return PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext()).getLong(key, defValue);
}
public static float getFloat(String key, float defValue) {
return PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext()).getFloat(key, defValue);
}
public static void put(String key, String value) {
putString(key, value);
}
public static void put(String key, int value) {
putInt(key, value);
}
public static void put(String key, float value) {
putFloat(key, value);
}
public static void put(String key, boolean value) {
putBoolean(key, value);
}
public static void putFloat(String key, float value) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
Editor editor = sharedPreferences.edit();
editor.putFloat(key, value);
editor.commit();
}
public static SharedPreferences getPreferences() {
return PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
}
public static int getInt(String key, int defValue) {
return PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext()).getInt(key, defValue);
}
public static boolean getBoolean(String key, boolean defValue) {
return PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext()).getBoolean(key, defValue);
}
public static void putStringProcess(String key, String value) {
SharedPreferences sharedPreferences = OPlayerApplication.getContext().getSharedPreferences("preference_mu", Context.MODE_MULTI_PROCESS);
Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
}
public static String getStringProcess(String key, String defValue) {
SharedPreferences sharedPreferences = OPlayerApplication.getContext().getSharedPreferences("preference_mu", Context.MODE_MULTI_PROCESS);
return sharedPreferences.getString(key, defValue);
}
public static boolean hasString(String key) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
return sharedPreferences.contains(key);
}
public static void putString(String key, String value) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
}
public static void putLong(String key, long value) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
Editor editor = sharedPreferences.edit();
editor.putLong(key, value);
editor.commit();
}
public static void putBoolean(String key, boolean value) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
Editor editor = sharedPreferences.edit();
editor.putBoolean(key, value);
editor.commit();
}
public static void putInt(String key, int value) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
Editor editor = sharedPreferences.edit();
editor.putInt(key, value);
editor.commit();
}
public static void remove(String... keys) {
if (keys != null) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(OPlayerApplication.getContext());
Editor editor = sharedPreferences.edit();
for (String key : keys) {
editor.remove(key);
}
editor.commit();
}
}
}
================================================
FILE: src/com/nmbb/oplayer/receiver/MediaScannerReceiver.java
================================================
package com.nmbb.oplayer.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import com.nmbb.oplayer.service.MediaScannerService;
/** 文件扫描 */
public class MediaScannerReceiver extends BroadcastReceiver {
public static final String ACTION_MEDIA_SCANNER_SCAN_FILE = "";
public static final String ACTION_MEDIA_SCANNER_SCAN_DIRECTORY = "";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Uri uri = intent.getData();
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
//扫描整个SD卡目录
//FIXME 处理多个SD卡的问题
// Environment.getExternalStorageDirectory().getParentFile();
scanDirectory(context, Environment.getExternalStorageDirectory().getAbsolutePath());
} else if (uri.getScheme().equals("file")) {
String path = uri.getPath();
if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
scanDirectory(context, path);
} else if (action.equals(ACTION_MEDIA_SCANNER_SCAN_FILE) && path != null) {
scanFile(context, path);
} else if (action.equals(ACTION_MEDIA_SCANNER_SCAN_DIRECTORY) && path != null) {
scanDirectory(context, path);
}
}
}
/** 扫描文件夹 */
private void scanDirectory(Context context, String volume) {
Bundle args = new Bundle();
args.putString(MediaScannerService.EXTRA_DIRECTORY, volume);
context.startService(new Intent(context, MediaScannerService.class).putExtras(args));
}
private void scanFile(Context context, String path) {
Bundle args = new Bundle();
args.putString(MediaScannerService.EXTRA_FILE_PATH, path);
context.startService(new Intent(context, MediaScannerService.class).putExtras(args));
}
// private static boolean isScanning = false;
// // private boolean isScanningStarted = false;
// private IReceiverNotify mNotify;
//
// public MediaScannerReceiver() {
// }
//
// public MediaScannerReceiver(IReceiverNotify notify) {
// mNotify = notify;
// }
//
// public static boolean isScanning(Context ctx) {
// return isServiceRunning(ctx, "io.vov.vitamio.MediaScannerService");
// }
//
// @Override
// public void onReceive(Context context, Intent intent) {
// final String action = intent.getAction();
// Log.i("MediaScannerReceiver", action);
// }
//
// /** 服务是否正在运行 */
// public static boolean isServiceRunning(Context ctx, String name) {
// ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
// for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
// if (name.equals(service.service.getClassName()))
// return true;
// }
// return false;
// }
}
================================================
FILE: src/com/nmbb/oplayer/service/FileDownloadService.java
================================================
package com.nmbb.oplayer.service;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class FileDownloadService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
================================================
FILE: src/com/nmbb/oplayer/service/MediaScannerService.java
================================================
package com.nmbb.oplayer.service;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import com.nmbb.oplayer.OPlayerApplication;
import com.nmbb.oplayer.OPreference;
import com.nmbb.oplayer.database.DbHelper;
import com.nmbb.oplayer.exception.Logger;
import com.nmbb.oplayer.po.POMedia;
import com.nmbb.oplayer.util.FileUtils;
import com.nmbb.oplayer.util.PinyinUtils;
import com.nmbb.oplayer.util.StringUtils;
/** 媒体扫描 */
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> mDbHelper;
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 = key;
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(media.path, Images.Thumbnails.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);
// bitmap.compress(Bitmap.CompressFormat.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 mBinder;
}
}
================================================
FILE: src/com/nmbb/oplayer/ui/FragmentBase.java
================================================
package com.nmbb.oplayer.ui;
import com.nmbb.oplayer.R;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
public class FragmentBase extends Fragment {
protected ListView mListView;
protected View mLoadingLayout;
protected MainActivity mParent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mParent = (MainActivity) getActivity();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_file, container, false);
mListView = (ListView) v.findViewById(android.R.id.list);
mLoadingLayout = v.findViewById(R.id.loading);
return v;
}
public boolean onBackPressed() {
return false;
}
public void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
if (mParent != null)
mParent.registerReceiver(receiver, filter);
}
public void unregisterReceiver(BroadcastReceiver receiver) {
if (mParent != null)
mParent.unregisterReceiver(receiver);
}
public void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer) {
if (mParent != null)
mParent.getContentResolver().registerContentObserver(uri, notifyForDescendents, observer);
}
public void unregisterContentObserver(ContentObserver observer) {
if (mParent != null)
mParent.getContentResolver().unregisterContentObserver(observer);
}
}
================================================
FILE: src/com/nmbb/oplayer/ui/FragmentFileOld.java
================================================
package com.nmbb.oplayer.ui;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.nmbb.oplayer.R;
import com.nmbb.oplayer.business.FileBusiness;
import com.nmbb.oplayer.database.DbHelper;
import com.nmbb.oplayer.po.POMedia;
import com.nmbb.oplayer.service.MediaScannerService;
import com.nmbb.oplayer.service.MediaScannerService.IMediaScannerObserver;
import com.nmbb.oplayer.service.MediaScannerService.MediaScannerServiceBinder;
import com.nmbb.oplayer.ui.base.ArrayAdapter;
import com.nmbb.oplayer.ui.helper.FileDownloadHelper;
import com.nmbb.oplayer.ui.player.VideoActivity;
import com.nmbb.oplayer.util.FileUtils;
public class FragmentFileOld extends FragmentBase implements
OnItemClickListener, IMediaScannerObserver {
private FileAdapter mAdapter;
private FileAdapter mDownloadAdapter;
private TextView first_letter_overlay;
private ImageView alphabet_scroller;
/** 临时列表 */
private ListView mTempListView;
private MainActivity mParent;
private TextView mSDAvailable;
/** 左下角进度显示 */
private View mProgress;
private MediaScannerService mMediaScannerService;
private ServiceConnection mMediaScannerServiceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mMediaScannerService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mMediaScannerService = ((MediaScannerServiceBinder) service)
.getService();
mMediaScannerService.addObserver(FragmentFileOld.this);
// Toast.makeText(ComponentServiceActivity.this, "Service绑定成功!",
// Toast.LENGTH_SHORT).show();
}
};
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = 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);
mTempListView = (ListView) v.findViewById(R.id.templist);
mSDAvailable = (TextView) v.findViewById(R.id.sd_block);
mProgress = v.findViewById(android.R.id.progress);
// ~~~~~~~~~ 绑定事件
alphabet_scroller.setClickable(true);
alphabet_scroller.setOnTouchListener(asOnTouch);
mListView.setOnItemClickListener(this);
mTempListView.setOnItemClickListener(this);
mListView.setOnCreateContextMenuListener(OnListViewMenu);
mTempListView.setOnCreateContextMenuListener(OnTempListViewMenu);
// ~~~~~~~~~ 加载数据
mParent = (MainActivity) getActivity();
// if (new SQLiteHelper(getActivity()).isEmpty())
// new ScanVideoTask().execute();
// else
new DataTask().execute();
getActivity().bindService(
new Intent(getActivity().getApplicationContext(),
MediaScannerService.class),
mMediaScannerServiceConnection, Context.BIND_AUTO_CREATE);
return v;
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onDestroy() {
getActivity().unbindService(mMediaScannerServiceConnection);
super.onDestroy();
}
/**
*
* @param flag
* 0 开始扫描 1 正在扫描 2 扫描完成
* @param file
* 扫描到的视频文件
*/
@Override
public void update(int flag, POMedia media) {
// Logger.i(flag + " " + media.path);
switch (flag) {
case MediaScannerService.SCAN_STATUS_START:
break;
case MediaScannerService.SCAN_STATUS_END:// 扫描完成
if (mProgress != null)
mProgress.setVisibility(View.GONE);
new DataTask().execute();
break;
case MediaScannerService.SCAN_STATUS_RUNNING:// 扫到一个文件
if (mAdapter != null && media != null) {
mAdapter.add(media);
mAdapter.notifyDataSetChanged();
}
break;
}
}
@Override
public void onResume() {
super.onResume();
// SD卡剩余数量
mSDAvailable.setText(FileUtils.showFileAvailable());
if (MediaScannerService.isRunning())
mProgress.setVisibility(View.VISIBLE);
else
mProgress.setVisibility(View.GONE);
}
ListView.OnCreateContextMenuListener OnListViewMenu = new ListView.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle(R.string.file_oper);
menu.add(0, 0, 0, R.string.file_rename);
menu.add(0, 1, 0, R.string.file_delete);
}
};
ListView.OnCreateContextMenuListener OnTempListViewMenu = new ListView.OnCreateContextMenuListener() {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle(R.string.file_oper);
menu.add(0, 2, 0, R.string.file_rename);
menu.add(0, 3, 0, R.string.file_delete);
}
};
@Override
public boolean onContextItemSelected(MenuItem item) {
ContextMenuInfo info = item.getMenuInfo();
AdapterView.AdapterContextMenuInfo contextMenuInfo = (AdapterView.AdapterContextMenuInfo) info;
int position = contextMenuInfo.position;
switch (item.getItemId()) {
case 0:
renameFile(mAdapter, mAdapter.getItem(position), position);
break;
case 1:
deleteFile(mAdapter, mAdapter.getItem(position), position);
break;
case 2:
renameFile(mDownloadAdapter, mDownloadAdapter.getItem(position),
position);
break;
case 3:
deleteFile(mDownloadAdapter, mDownloadAdapter.getItem(position),
position);
break;
}
return super.onContextItemSelected(item);
};
/** 删除文件 */
private void deleteFile(final FileAdapter adapter, final POMedia f,
final int position) {
new AlertDialog.Builder(getActivity())
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.file_delete)
.setMessage(getString(R.string.file_delete_confirm, f.title))
.setNegativeButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
try {
File file = new File(f.path);
if (file.canRead() && file.exists())
file.delete();
// FileBusiness.deleteFile(getActivity(),
// f);
new DbHelper<POMedia>().remove(f);
adapter.delete(position);
} catch (Exception e) {
}
}
}).setPositiveButton(android.R.string.no, null).show();
}
/** 重命名文件 */
private void renameFile(final FileAdapter adapter, final POMedia f,
final int position) {
final EditText et = new EditText(getActivity());
et.setText(f.title);
new AlertDialog.Builder(getActivity())
.setTitle(R.string.file_rename)
.setIcon(android.R.drawable.ic_dialog_info)
.setView(et)
.setNegativeButton(android.R.string.yes,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
String name = et.getText().toString().trim();
if (name == null || name.trim().equals("")
|| name.trim().equals(f.title))
return;
try {
File fromFile = new File(f.path);
File nf = new File(fromFile.getParent(),
name.trim());
if (nf.exists()) {
Toast.makeText(getActivity(),
R.string.file_rename_exists,
Toast.LENGTH_LONG).show();
} else if (fromFile.renameTo(nf)) {
f.title = name;
f.path = nf.getPath();
// FileBusiness.renameFile(getActivity(),
// f);
new DbHelper<POMedia>().update(f);
adapter.notifyDataSetChanged();
}
} catch (SecurityException se) {
Toast.makeText(getActivity(),
R.string.file_rename_failed,
Toast.LENGTH_LONG).show();
}
}
}).setPositiveButton(android.R.string.no, null).show();
}
public Handler mDownloadHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
POMedia p;
String url = msg.obj.toString();
switch (msg.what) {
case FileDownloadHelper.MESSAGE_START:// 开始下载
p = new POMedia();
p.path = mParent.mFileDownload.mDownloadUrls.get(url);
p.title = new File(p.path).getName();
p.status = 0;
p.file_size = 0;
if (mDownloadAdapter == null) {
mDownloadAdapter = new FileAdapter(getActivity(),
new ArrayList<POMedia>());
mDownloadAdapter.add(p, url);
mTempListView.setAdapter(mDownloadAdapter);
mTempListView.setVisibility(View.VISIBLE);
} else {
mDownloadAdapter.add(p, url);
mDownloadAdapter.notifyDataSetChanged();
}
break;
case FileDownloadHelper.MESSAGE_PROGRESS:// 正在下载
p = mDownloadAdapter.getItem(url);
p.temp_file_size = msg.arg1;
p.file_size = msg.arg2;
int status = (int) ((msg.arg1 * 1.0 / msg.arg2) * 10);
if (status > 10)
status = 10;
p.status = status;
mDownloadAdapter.notifyDataSetChanged();
break;
case FileDownloadHelper.MESSAGE_STOP:// 下载结束
p = mDownloadAdapter.getItem(url);
new DbHelper<POMedia>().create(p);
// FileBusiness.insertFile(getActivity(), p);
break;
case FileDownloadHelper.MESSAGE_ERROR:
Toast.makeText(getActivity(), url, Toast.LENGTH_LONG).show();
break;
}
super.handleMessage(msg);
}
};
/** 单击启动播放 */
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
final POMedia f = parent == mListView ? mAdapter.getItem(position)
: mDownloadAdapter.getItem(position);
Intent intent = new Intent(getActivity(), VideoActivity.class);
intent.setData(Uri.parse(f.path));
// intent.putExtra("path", f.path);
intent.putExtra("displayName", f.title);
startActivity(intent);
}
private class DataTask extends AsyncTask<Void, Void, List<POMedia>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mLoadingLayout.setVisibility(View.VISIBLE);
mListView.setVisibility(View.GONE);
}
@Override
protected List<POMedia> doInBackground(Void... params) {
return FileBusiness.getAllSortFiles();
}
@Override
protected void onPostExecute(List<POMedia> result) {
super.onPostExecute(result);
mAdapter = new FileAdapter(getActivity(), result);
mListView.setAdapter(mAdapter);
mLoadingLayout.setVisibility(View.GONE);
mListView.setVisibility(View.VISIBLE);
}
}
private class FileAdapter extends ArrayAdapter<POMedia> {
private HashMap<String, POMedia> maps = new HashMap<String, POMedia>();
public FileAdapter(Context ctx, List<POMedia> l) {
super(ctx, l);
maps.clear();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final POMedia f = getItem(position);
if (convertView == null) {
final LayoutInflater mInflater = getActivity()
.getLayoutInflater();
convertView = mInflater.inflate(R.layout.fragment_file_item,
null);
}
((TextView) convertView.findViewById(R.id.title)).setText(f.title);
// 显示文件大小
String file_size;
if (f.temp_file_size > 0) {
file_size = FileUtils.showFileSize(f.temp_file_size) + " / "
+ FileUtils.showFileSize(f.file_size);
} else {
file_size = FileUtils.showFileSize(f.file_size);
}
((TextView) convertView.findViewById(R.id.file_size))
.setText(file_size);
// 显示进度表
final ImageView status = (ImageView) convertView
.findViewById(R.id.status);
if (f.status > -1) {
int resStauts = getStatusImage(f.status);
if (resStauts > 0) {
if (status.getVisibility() != View.VISIBLE)
status.setVisibility(View.VISIBLE);
status.setImageResource(resStauts);
}
} else {
if (status.getVisibility() != View.GONE)
status.setVisibility(View.GONE);
}
return convertView;
}
public void add(POMedia item, String url) {
super.add(item);
if (!maps.containsKey(url))
maps.put(url, item);
}
public void delete(int position) {
synchronized (mLock) {
mObjects.remove(position);
}
notifyDataSetChanged();
}
public POMedia getItem(String url) {
return maps.get(url);
}
}
private int getStatusImage(int status) {
int resStauts = -1;
switch (status) {
case 0:
resStauts = R.drawable.down_btn_0;
break;
case 1:
resStauts = R.drawable.down_btn_1;
break;
case 2:
resStauts = R.drawable.down_btn_2;
break;
case 3:
resStauts = R.drawable.down_btn_3;
break;
case 4:
resStauts = R.drawable.down_btn_4;
break;
case 5:
resStauts = R.drawable.down_btn_5;
break;
case 6:
resStauts = R.drawable.down_btn_6;
break;
case 7:
resStauts = R.drawable.down_btn_7;
break;
case 8:
resStauts = R.drawable.down_btn_8;
break;
case 9:
resStauts = R.drawable.down_btn_9;
break;
case 10:
resStauts = R.drawable.down_btn_10;
break;
}
return resStauts;
}
/**
* A-Z
*/
private OnTouchListener asOnTouch = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:// 0
alphabet_scroller.setPressed(true);
first_letter_overlay.setVisibility(View.VISIBLE);
mathScrollerPosition(event.getY());
break;
case MotionEvent.ACTION_UP:// 1
alphabet_scroller.setPressed(false);
first_letter_overlay.setVisibility(View.GONE);
break;
case MotionEvent.ACTION_MOVE:
mathScrollerPosition(event.getY());
break;
}
return false;
}
};
/**
* 显示字符
*
* @param y
*/
private void mathScrollerPosition(float y) {
int height = alphabet_scroller.getHeight();
float charHeight = height / 28.0f;
char c = 'A';
if (y < 0)
y = 0;
else if (y > height)
y = height;
int index = (int) (y / charHeight) - 1;
if (index < 0)
index = 0;
else if (index > 25)
index = 25;
String key = String.valueOf((char) (c + index));
first_letter_overlay.setText(key);
int position = 0;
if (index == 0)
mListView.setSelection(0);
else if (index == 25)
mListView.setSelection(mAdapter.getCount() - 1);
else {
if (mAdapter != null && mAdapter.getAll() != null) {
for (POMedia item : mAdapter.getAll()) {
if (item.title_key.startsWith(key)) {
mListView.setSelection(position);
break;
}
position++;
}
}
}
}
// ~~~~~~~~~~~~~~ 后续弃用,直接使用Vitamio提供的
// /** 扫描SD卡 */
// private class ScanVideoTask extends AsyncTask<Void, File,
// ArrayList<PFile>> {
// private ProgressDialog pd;
// private ArrayList<File> files = new ArrayList<File>();
//
// @Override
// protected void onPreExecute() {
// super.onPreExecute();
// pd = new ProgressDialog(getActivity());
// pd.setMessage("正在扫描视频文件...");
// pd.setCanceledOnTouchOutside(false);
// pd.setCancelable(false);
// pd.show();
// }
//
// @Override
// protected ArrayList<PFile> doInBackground(Void... params) {
// // ~~~ 遍历文件夹
// eachAllMedias(Environment.getExternalStorageDirectory());
//
// // ~~~ 提取缩略图、视频尺寸等。
// FileBusiness.batchBuildThumbnail(getActivity(), files);
//
// // ~~~ 入库
// FileBusiness.batchInsertFiles(getActivity(), files);
//
// // ~~~ 查询数据
// return FileBusiness.getAllSortFiles(getActivity());
// }
//
// @Override
// protected void onProgressUpdate(final File... values) {
// pd.setMessage(values[0].getName());
// }
//
// /** 遍历所有文件夹,查找出视频文件 */
// public void eachAllMedias(File f) {
// if (f != null && f.exists() && f.isDirectory()) {
// File[] files = f.listFiles();
// if (files != null) {
// for (File file : f.listFiles()) {
// if (file.isDirectory()) {
// eachAllMedias(file);
// } else if (file.exists() && file.canRead() && FileUtils.isVideo(file)) {
// this.files.add(file);
// }
// publishProgress(file);
// }
// }
// }
// }
//
// @Override
// protected void onPostExecute(ArrayList<PFile> result) {
// super.onPostExecute(result);
// mAdapter = new FileAdapter(getActivity(), result);
// mListView.setAdapter(mAdapter);
// pd.dismiss();
// }
// }
}
================================================
FILE: src/com/nmbb/oplayer/ui/FragmentOnline.java
================================================
package com.nmbb.oplayer.ui;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import com.nmbb.oplayer.R;
import com.nmbb.oplayer.po.OnlineVideo;
import com.nmbb.oplayer.ui.base.ArrayAdapter;
import com.nmbb.oplayer.ui.helper.XmlReaderHelper;
import com.nmbb.oplayer.ui.player.VideoActivity;
import com.nmbb.oplayer.util.FileUtils;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class FragmentOnline extends FragmentBase implements OnItemClickListener {
/** 缓存视频列表 */
private static ArrayList<String[]> mOnlineList = new ArrayList<String[]>();
/** 缓存视频LOGO列表 */
private static ArrayList<Integer> mOnlineLogoList = new ArrayList<Integer>();
private WebView mWebView;
private ListView mListView;
/** 网页正在加载 */
private View mLoading;
/** 历史记录 */
private List<String> mHistory = new ArrayList<String>();
/** 显示当前正在加载的url */
private TextView mUrl;
private String mTitle;
private final static ArrayList<OnlineVideo> root = new ArrayList<OnlineVideo>();
private ArrayList<OnlineVideo> tvs;
private final static ArrayList<OnlineVideo> videos = new ArrayList<OnlineVideo>();
private int level = 1;
private DataAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View mView = inflater.inflate(R.layout.fragment_online, container,
false);
mListView = (ListView) mView.findViewById(android.R.id.list);
mWebView = (WebView) mView.findViewById(R.id.webview);
mUrl = (TextView) mView.findViewById(R.id.url);
mLoading = mView.findViewById(R.id.loading);
mListView.setOnItemClickListener(this);
initWebView();
mAdapter = new DataAdapter(getActivity());
mListView.setAdapter(new DataAdapter(getActivity()));
return mView;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
final OnlineVideo item = mAdapter.getItem(position);
switch (level) {
case 1:// 顶级
level = 2;
if (position == 0) {
// 直播
if (tvs == null)
tvs = XmlReaderHelper.getAllCategory(getActivity());
mAdapter.replace(tvs);
} else {
// 视频
mAdapter.replace(videos);
}
mListView.setAdapter(mAdapter);
break;
case 2://
level = 3;
if (item.id != null) {
// 直播
mAdapter.replace(XmlReaderHelper.getVideos(getActivity(),
item.id));
mListView.setAdapter(mAdapter);
} else {
clearAndLoad(item.url);
}
break;
case 3:
level = 4;
// clearAndLoad(item.url);
Intent intent = new Intent(getActivity(), VideoActivity.class);
intent.setData(Uri.parse(item.url));
// intent.putExtra("path", item.url);
intent.putExtra(
"displayName ",
item.title);
startActivity(intent);
break;
}
}
private void clearAndLoad(String url) {
mLoading.setVisibility(View.VISIBLE);
mWebView.setVisibility(View.GONE);
mListView.setVisibility(View.GONE);
mHistory.clear();
mWebView.clearView();
mWebView.loadUrl(url);
}
@Override
public boolean onBackPressed() {
switch (level) {
case 1:
return super.onBackPressed();
case 2:
level = 1;
mAdapter.replace(root);
break;
case 3://
level = 2;
if (mListView == null || mListView.getVisibility() == View.VISIBLE) {
mAdapter.replace(tvs);
} else {
switchWebViewToListView();
}
break;
case 4:
level = 3;
switchWebViewToListView();
break;
}
mListView.setAdapter(mAdapter);
return true;
}
private void switchWebViewToListView() {
mWebView.clearView();
mUrl.setVisibility(View.GONE);
mListView.setVisibility(View.VISIBLE);
mWebView.setVisibility(View.GONE);
mLoading.setVisibility(View.GONE);
}
/** 初始化WebView */
private void initWebView() {
mWebView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setPluginsEnabled(true);
mWebView.setWebViewClient(new WebViewClient() {
/** 页面开始加载 */
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mUrl.setText(url);
mUrl.setVisibility(View.VISIBLE);
}
/** 页面加载完成 */
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mLoading.setVisibility(View.GONE);
mWebView.setVisibility(View.VISIBLE);
if (!mHistory.contains(url))
mHistory.add(0, url);
mUrl.setVisibility(View.GONE);
// 取得title
mTitle = view.getTitle();
};
/** 页面跳转 */
@Override
public boolean shouldOverrideUrlLoading(WebView view,
final String url) {
if (FileUtils.isVideoOrAudio(url)) {
Dialog dialog = new AlertDialog.Builder(getActivity())
.setIcon(android.R.drawable.btn_star)
.setTitle("播放/下载").setMessage(url)
.setPositiveButton("播放", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Intent intent = new Intent(getActivity(),
VideoPlayerActivity.class);
intent.putExtra("path", url);
intent.putExtra("title", mTitle);
startActivity(intent);
}
}).setNeutralButton("下载", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
if (Environment.MEDIA_MOUNTED
.equals(Environment
.getExternalStorageState())) {
MainActivity activity = (MainActivity) getActivity();
String savePath = Environment
.getExternalStorageDirectory()
+ "/";
if (TextUtils.isEmpty(mTitle))
savePath += FileUtils
.getUrlFileName(url);
else {
savePath += mTitle
+ "."
+ FileUtils
.getUrlExtension(url);
}
activity.mFileDownload.newDownloadFile(
url, savePath);
Toast.makeText(
getActivity(),
"正在下载 .."
+ FileUtils
.getUrlFileName(savePath)
+ " ,可从本地视频查看进度!",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getActivity(),
"请检测SD卡!", Toast.LENGTH_LONG)
.show();
}
}
}).setNegativeButton("取消", null).create();
dialog.show();
return true;
}
return false;
};
});
/** 处理后退键 */
mWebView.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView != null
&& mWebView.canGoBack()) {
if (mHistory.size() > 1) {
mHistory.remove(0);
mWebView.loadUrl(mHistory.get(0));
return true;
}
}
return false;
}
});
}
/** 数据适配 */
private class DataAdapter extends ArrayAdapter<OnlineVideo> {
public DataAdapter(Context ctx) {
super(ctx, root);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final OnlineVideo item = getItem(position);
if (convertView == null) {
final LayoutInflater mInflater = getActivity()
.getLayoutInflater();
convertView = mInflater.inflate(R.layout.fragment_online_item,
null);
}
ImageView thumbnail = (ImageView) convertView
.findViewById(R.id.thumbnail);
if (item.iconId > 0)
thumbnail.setImageResource(item.iconId);
else
thumbnail.setImageDrawable(null);
((TextView) convertView.findViewById(R.id.title))
.setText(item.title);
return convertView;
}
}
// ~~~~~~~~~~~~~处理FLASH退出的问题 ~~~~~~~~
private void callHiddenWebViewMethod(String name) {
if (mWebView != null) {
try {
Method method = WebView.class.getMethod(name);
method.invoke(mWebView);
} catch (NoSuchMethodException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
}
}
@Override
public void onPause() {
super.onPause();
if (mWebView != null) {
gitextract_kw23pxwu/
├── .classpath
├── .gitignore
├── .project
├── AndroidManifest.xml
├── LICENSE
├── README.md
├── assets/
│ └── online.xml
├── libs/
│ ├── android-support-v13.jar
│ ├── ormlite-android-4.42-SNAPSHOT.jar
│ ├── ormlite-core-4.42-SNAPSHOT.jar
│ └── pinyin4j-2.5.0.jar
├── project.properties
├── res/
│ ├── anim/
│ │ ├── slide_in_bottom.xml
│ │ ├── slide_in_top.xml
│ │ ├── slide_out_bottom.xml
│ │ └── slide_out_top.xml
│ ├── drawable/
│ │ ├── alphabet_scroller_bg.xml
│ │ ├── home_btn_bg.xml
│ │ ├── mediacontroller_btn_bg.xml
│ │ ├── mediacontroller_pause_button.xml
│ │ ├── mediacontroller_play_button.xml
│ │ ├── mediacontroller_seekbar.xml
│ │ ├── mediacontroller_seekbar_thumb.xml
│ │ ├── scrubber_control_selector_holo.xml
│ │ └── scrubber_progress_horizontal_holo_dark.xml
│ ├── layout/
│ │ ├── activity_video.xml
│ │ ├── brightness_volumn.xml
│ │ ├── common_loading.xml
│ │ ├── fragment_file.xml
│ │ ├── fragment_file_item.xml
│ │ ├── fragment_online.xml
│ │ ├── fragment_online_item.xml
│ │ ├── fragment_pager.xml
│ │ ├── mediacontroller.xml
│ │ ├── mediaplayer.xml
│ │ ├── my_media_controller.xml
│ │ └── videoview.xml
│ ├── values/
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── values-large/
│ │ └── dimens.xml
│ ├── values-small/
│ │ └── dimens.xml
│ ├── values-sw600dp/
│ │ └── dimens.xml
│ ├── values-v11/
│ │ └── styles.xml
│ ├── values-v14/
│ │ └── styles.xml
│ └── values-xlarge/
│ └── dimens.xml
└── src/
└── com/
└── nmbb/
└── oplayer/
├── OPlayerApplication.java
├── OPreference.java
├── business/
│ └── FileBusiness.java
├── database/
│ ├── DbHelper.java
│ └── SQLiteHelperOrm.java
├── exception/
│ └── Logger.java
├── po/
│ ├── OnlineVideo.java
│ ├── PFile.java
│ └── POMedia.java
├── preference/
│ └── PreferenceUtils.java
├── receiver/
│ └── MediaScannerReceiver.java
├── service/
│ ├── FileDownloadService.java
│ └── MediaScannerService.java
├── ui/
│ ├── FragmentBase.java
│ ├── FragmentFileOld.java
│ ├── FragmentOnline.java
│ ├── MainActivity.java
│ ├── PlayerActivity.java
│ ├── VideoPlayerActivity.java
│ ├── adapter/
│ │ ├── FileAdapter.java
│ │ └── FileDownloadAdapter.java
│ ├── base/
│ │ ├── ArrayAdapter.java
│ │ ├── FilterArrayAdapter.java
│ │ └── ThreadPool.java
│ ├── helper/
│ │ ├── FileDownloadHelper.java
│ │ ├── VideoHelper.java
│ │ └── XmlReaderHelper.java
│ ├── player/
│ │ ├── CommonGestures.java
│ │ ├── MediaController.java
│ │ ├── PlayerService.java
│ │ ├── VP.java
│ │ ├── VideoActivity.java
│ │ └── VideoView.java
│ └── vitamio/
│ ├── InitActivity.java
│ └── LibsChecker.java
├── util/
│ ├── ApplicationUtils.java
│ ├── ArrayUtils.java
│ ├── ConvertUtils.java
│ ├── DeviceUtils.java
│ ├── FileUtils.java
│ ├── FractionalTouchDelegate.java
│ ├── ImageUtils.java
│ ├── IntentHelper.java
│ ├── MediaUtils.java
│ ├── PinyinUtils.java
│ ├── StringUtils.java
│ └── ToastUtils.java
└── video/
└── VideoThumbnailUtils.java
SYMBOL INDEX (673 symbols across 48 files)
FILE: src/com/nmbb/oplayer/OPlayerApplication.java
class OPlayerApplication (line 9) | public class OPlayerApplication extends Application {
method onCreate (line 20) | @Override
method init (line 28) | private void init() {
method getApplication (line 34) | public static OPlayerApplication getApplication() {
method getContext (line 38) | public static Context getContext() {
method destory (line 43) | public void destory() {
FILE: src/com/nmbb/oplayer/OPreference.java
class OPreference (line 10) | public class OPreference {
method OPreference (line 16) | public OPreference(Context ctx) {
method putStringAndCommit (line 20) | public boolean putStringAndCommit(String key, String value) {
method putIntAndCommit (line 24) | public boolean putIntAndCommit(String key, int value) {
method putBooleanAndCommit (line 28) | public boolean putBooleanAndCommit(String key, boolean value) {
method putIntAndCommit (line 32) | public boolean putIntAndCommit(ContentValues values) {
method getString (line 40) | public String getString(String key) {
method getString (line 44) | public String getString(String key, String defValue) {
method getInt (line 48) | public int getInt(String key) {
method getInt (line 52) | public int getInt(String key, int defValue) {
method getBoolean (line 56) | public boolean getBoolean(String key) {
method getBoolean (line 60) | public boolean getBoolean(String key, boolean defValue) {
FILE: src/com/nmbb/oplayer/business/FileBusiness.java
class FileBusiness (line 13) | public final class FileBusiness {
method getAllSortFiles (line 18) | public static List<POMedia> getAllSortFiles() {
FILE: src/com/nmbb/oplayer/database/DbHelper.java
class DbHelper (line 14) | @SuppressWarnings({ "unchecked", "rawtypes" })
method create (line 18) | public int create(T po) {
method exists (line 32) | public boolean exists(T po, Map<String, Object> where) {
method createIfNotExists (line 48) | public int createIfNotExists(T po, Map<String, Object> where) {
method queryForEq (line 65) | public List<T> queryForEq(Class<T> c, String fieldName, Object value) {
method remove (line 80) | public int remove(T po) {
method update (line 103) | public int update(Class<T> c, ContentValues values, String columnName,...
method update (line 123) | public int update(T po) {
method queryForAll (line 139) | public List<T> queryForAll(Class<T> c) {
FILE: src/com/nmbb/oplayer/database/SQLiteHelperOrm.java
class SQLiteHelperOrm (line 15) | public class SQLiteHelperOrm extends OrmLiteSqliteOpenHelper {
method SQLiteHelperOrm (line 19) | public SQLiteHelperOrm(Context context) {
method SQLiteHelperOrm (line 23) | public SQLiteHelperOrm() {
method onCreate (line 27) | @Override
method onUpgrade (line 36) | @Override
FILE: src/com/nmbb/oplayer/exception/Logger.java
class Logger (line 5) | public class Logger {
method setLog (line 10) | public static void setLog(boolean isLog) {
method getIsLog (line 14) | public static boolean getIsLog() {
method d (line 18) | public static void d(String tag, String msg) {
method d (line 24) | public static void d(String msg) {
method d (line 36) | public static void d(String tag, String msg, Throwable tr) {
method e (line 42) | public static void e(Throwable tr) {
method i (line 48) | public static void i(String msg) {
method i (line 54) | public static void i(String tag, String msg) {
method i (line 68) | public static void i(String tag, String msg, Throwable tr) {
method e (line 82) | public static void e(String tag, String msg) {
method e (line 88) | public static void e(String msg) {
method e (line 102) | public static void e(String tag, String msg, Throwable tr) {
method e (line 108) | public static void e(String msg, Throwable tr) {
method systemErr (line 114) | public static void systemErr(String msg) {
FILE: src/com/nmbb/oplayer/po/OnlineVideo.java
class OnlineVideo (line 5) | public class OnlineVideo {
method OnlineVideo (line 24) | public OnlineVideo() {
method OnlineVideo (line 28) | public OnlineVideo(String title, int iconId, int category) {
method OnlineVideo (line 34) | public OnlineVideo(String title, int iconId, int category, String url) {
FILE: src/com/nmbb/oplayer/po/PFile.java
class PFile (line 7) | public final class PFile {
method PFile (line 35) | public PFile() {
method PFile (line 39) | public PFile(Cursor c) {
method getThumb (line 52) | public Bitmap getThumb(Context ctx) {
FILE: src/com/nmbb/oplayer/po/POMedia.java
class POMedia (line 15) | @DatabaseTable(tableName = "media")
method POMedia (line 62) | public POMedia() {
method POMedia (line 66) | public POMedia(File f) {
method POMedia (line 73) | public POMedia(String path, String mimeType) {
FILE: src/com/nmbb/oplayer/preference/PreferenceUtils.java
class PreferenceUtils (line 10) | public final class PreferenceUtils {
method reset (line 13) | public static void reset(final Context ctx) {
method getString (line 19) | public static String getString(String key, String defValue) {
method getLong (line 23) | public static long getLong(String key, long defValue) {
method getFloat (line 27) | public static float getFloat(String key, float defValue) {
method put (line 31) | public static void put(String key, String value) {
method put (line 35) | public static void put(String key, int value) {
method put (line 39) | public static void put(String key, float value) {
method put (line 43) | public static void put(String key, boolean value) {
method putFloat (line 47) | public static void putFloat(String key, float value) {
method getPreferences (line 54) | public static SharedPreferences getPreferences() {
method getInt (line 58) | public static int getInt(String key, int defValue) {
method getBoolean (line 62) | public static boolean getBoolean(String key, boolean defValue) {
method putStringProcess (line 66) | public static void putStringProcess(String key, String value) {
method getStringProcess (line 73) | public static String getStringProcess(String key, String defValue) {
method hasString (line 78) | public static boolean hasString(String key) {
method putString (line 83) | public static void putString(String key, String value) {
method putLong (line 90) | public static void putLong(String key, long value) {
method putBoolean (line 97) | public static void putBoolean(String key, boolean value) {
method putInt (line 104) | public static void putInt(String key, int value) {
method remove (line 111) | public static void remove(String... keys) {
FILE: src/com/nmbb/oplayer/receiver/MediaScannerReceiver.java
class MediaScannerReceiver (line 13) | public class MediaScannerReceiver extends BroadcastReceiver {
method onReceive (line 18) | @Override
method scanDirectory (line 41) | private void scanDirectory(Context context, String volume) {
method scanFile (line 47) | private void scanFile(Context context, String path) {
FILE: src/com/nmbb/oplayer/service/FileDownloadService.java
class FileDownloadService (line 7) | public class FileDownloadService extends Service {
method onBind (line 9) | @Override
FILE: src/com/nmbb/oplayer/service/MediaScannerService.java
class MediaScannerService (line 30) | public class MediaScannerService extends Service implements Runnable {
method onCreate (line 55) | @Override
method isRunning (line 63) | public static boolean isRunning() {
method onStartCommand (line 72) | @Override
method parseIntent (line 81) | private void parseIntent(final Intent intent) {
method run (line 108) | @Override
method scan (line 114) | private void scan() {
method handleMessage (line 158) | @Override
method scanFile (line 170) | private void scanFile(String path, String mimeType) {
method scanDirectory (line 175) | private void scanDirectory(String path) {
method eachAllMedias (line 180) | private void eachAllMedias(File f) {
method save (line 203) | private void save(POMedia media) {
method extractThumbnail (line 229) | private void extractThumbnail(POMedia media) {
method notifyObservers (line 268) | private void notifyObservers(int flag, POMedia media) {
method addObserver (line 273) | public void addObserver(IMediaScannerObserver s) {
method deleteObserver (line 282) | public synchronized void deleteObserver(IMediaScannerObserver s) {
method deleteObservers (line 287) | public synchronized void deleteObservers() {
type IMediaScannerObserver (line 291) | public interface IMediaScannerObserver {
method update (line 297) | public void update(int flag, POMedia media);
class MediaScannerServiceBinder (line 304) | public class MediaScannerServiceBinder extends Binder {
method getService (line 305) | public MediaScannerService getService() {
method onBind (line 310) | @Override
FILE: src/com/nmbb/oplayer/ui/FragmentBase.java
class FragmentBase (line 16) | public class FragmentBase extends Fragment {
method onCreate (line 22) | @Override
method onCreateView (line 28) | @Override
method onBackPressed (line 36) | public boolean onBackPressed() {
method registerReceiver (line 40) | public void registerReceiver(BroadcastReceiver receiver, IntentFilter ...
method unregisterReceiver (line 45) | public void unregisterReceiver(BroadcastReceiver receiver) {
method registerContentObserver (line 50) | public void registerContentObserver(Uri uri, boolean notifyForDescende...
method unregisterContentObserver (line 55) | public void unregisterContentObserver(ContentObserver observer) {
FILE: src/com/nmbb/oplayer/ui/FragmentFileOld.java
class FragmentFileOld (line 48) | public class FragmentFileOld extends FragmentBase implements
method onServiceDisconnected (line 66) | @Override
method onServiceConnected (line 71) | @Override
method onCreateView (line 81) | @Override
method onStart (line 115) | @Override
method onDestroy (line 120) | @Override
method update (line 133) | @Override
method onResume (line 154) | @Override
method onCreateContextMenu (line 168) | @Override
method onCreateContextMenu (line 179) | @Override
method onContextItemSelected (line 188) | @Override
method deleteFile (line 213) | private void deleteFile(final FileAdapter adapter, final POMedia f,
method renameFile (line 242) | private void renameFile(final FileAdapter adapter, final POMedia f,
method handleMessage (line 289) | @Override
method onItemClick (line 335) | @Override
class DataTask (line 347) | private class DataTask extends AsyncTask<Void, Void, List<POMedia>> {
method onPreExecute (line 349) | @Override
method doInBackground (line 356) | @Override
method onPostExecute (line 361) | @Override
class FileAdapter (line 373) | private class FileAdapter extends ArrayAdapter<POMedia> {
method FileAdapter (line 377) | public FileAdapter(Context ctx, List<POMedia> l) {
method getView (line 382) | @Override
method add (line 421) | public void add(POMedia item, String url) {
method delete (line 427) | public void delete(int position) {
method getItem (line 434) | public POMedia getItem(String url) {
method getStatusImage (line 439) | private int getStatusImage(int status) {
method onTouch (line 484) | @Override
method mathScrollerPosition (line 509) | private void mathScrollerPosition(float y) {
FILE: src/com/nmbb/oplayer/ui/FragmentOnline.java
class FragmentOnline (line 39) | public class FragmentOnline extends FragmentBase implements OnItemClickL...
method onCreateView (line 60) | @Override
method onItemClick (line 77) | @Override
method clearAndLoad (line 120) | private void clearAndLoad(String url) {
method onBackPressed (line 129) | @Override
method switchWebViewToListView (line 155) | private void switchWebViewToListView() {
method initWebView (line 164) | private void initWebView() {
class DataAdapter (line 271) | private class DataAdapter extends ArrayAdapter<OnlineVideo> {
method DataAdapter (line 273) | public DataAdapter(Context ctx) {
method getView (line 277) | @Override
method callHiddenWebViewMethod (line 302) | private void callHiddenWebViewMethod(String name) {
method onPause (line 314) | @Override
method onResume (line 326) | @Override
FILE: src/com/nmbb/oplayer/ui/MainActivity.java
class MainActivity (line 22) | public class MainActivity extends FragmentActivity implements OnClickLis...
method onCreate (line 30) | @Override
method onBackPressed (line 59) | @Override
method onDestroy (line 67) | @Override
method getFragmentByPosition (line 75) | private FragmentBase getFragmentByPosition(int position) {
method getItem (line 82) | @Override
method getCount (line 98) | @Override
method onPageSelected (line 105) | @Override
method onClick (line 118) | @Override
FILE: src/com/nmbb/oplayer/ui/PlayerActivity.java
class PlayerActivity (line 21) | public class PlayerActivity extends Activity implements OnBufferingUpdat...
method onCreate (line 34) | @Override
method playVideo (line 43) | private void playVideo() {
method onBufferingUpdate (line 60) | @Override
method onCompletion (line 66) | @Override
method onVideoSizeChanged (line 72) | @Override
method onPrepared (line 87) | @Override
method surfaceChanged (line 96) | @Override
method surfaceDestroyed (line 101) | @Override
method surfaceCreated (line 106) | @Override
method onPause (line 112) | @Override
method onDestroy (line 119) | @Override
method releaseMediaPlayer (line 126) | private void releaseMediaPlayer() {
method doCleanUp (line 133) | private void doCleanUp() {
method startVideoPlayback (line 140) | private void startVideoPlayback() {
FILE: src/com/nmbb/oplayer/ui/VideoPlayerActivity.java
class VideoPlayerActivity (line 37) | public class VideoPlayerActivity extends Activity implements OnCompletio...
method onCreate (line 58) | @Override
method onPause (line 106) | @Override
method onResume (line 113) | @Override
method onDestroy (line 120) | @Override
method onTouchEvent (line 127) | @Override
method endGesture (line 143) | private void endGesture() {
class MyGestureListener (line 152) | private class MyGestureListener extends SimpleOnGestureListener {
method onDoubleTap (line 155) | @Override
method onScroll (line 167) | @Override
method handleMessage (line 186) | @Override
method onVolumeSlide (line 197) | private void onVolumeSlide(float percent) {
method onBrightnessSlide (line 228) | private void onBrightnessSlide(float percent) {
method onConfigurationChanged (line 253) | @Override
method onCompletion (line 260) | @Override
method stopPlayer (line 265) | private void stopPlayer() {
method startPlayer (line 270) | private void startPlayer() {
method isPlaying (line 275) | private boolean isPlaying() {
method onInfo (line 282) | @Override
FILE: src/com/nmbb/oplayer/ui/adapter/FileAdapter.java
class FileAdapter (line 18) | public class FileAdapter extends CursorAdapter {
method FileAdapter (line 23) | public FileAdapter(Context context, Cursor c) {
method newView (line 28) | @Override
method changeCursor (line 33) | @Override
method initKeys (line 39) | private void initKeys(Cursor c) {
method getPositionByName (line 50) | public int getPositionByName(char key) {
method getItem (line 54) | @Override
method bindView (line 62) | @Override
FILE: src/com/nmbb/oplayer/ui/adapter/FileDownloadAdapter.java
class FileDownloadAdapter (line 18) | public class FileDownloadAdapter extends ArrayAdapter<PFile> {
method FileDownloadAdapter (line 23) | public FileDownloadAdapter(Context ctx, ArrayList<PFile> l) {
method getView (line 29) | @Override
method getStatusImage (line 62) | private int getStatusImage(int status) {
method add (line 102) | public void add(PFile item, String url) {
method delete (line 108) | public void delete(int position) {
method getItem (line 115) | public PFile getItem(String url) {
FILE: src/com/nmbb/oplayer/ui/base/ArrayAdapter.java
class ArrayAdapter (line 12) | public abstract class ArrayAdapter<T> extends BaseAdapter {
method ArrayAdapter (line 19) | public ArrayAdapter(final Context ctx, final ArrayList<T> l) {
method ArrayAdapter (line 24) | public ArrayAdapter(final Context ctx, final T... l) {
method ArrayAdapter (line 30) | public ArrayAdapter(final Context ctx, final List<T> l) {
method ArrayAdapter (line 37) | public ArrayAdapter(final Context ctx, final Collection<T> l) {
method getCount (line 44) | @Override
method getItem (line 49) | @Override
method getItemId (line 54) | @Override
method add (line 59) | public void add(T item) {
method replace (line 63) | public void replace(ArrayList<T> newObjects) {
method addAll (line 74) | public void addAll(T... items) {
method addAll (line 86) | public void addAll(Collection<? extends T> collection) {
method clear (line 93) | public void clear() {
method getAll (line 102) | public final ArrayList<T> getAll() {
FILE: src/com/nmbb/oplayer/ui/base/FilterArrayAdapter.java
class FilterArrayAdapter (line 13) | public abstract class FilterArrayAdapter<T> extends ArrayAdapter<T> {
method FilterArrayAdapter (line 23) | public FilterArrayAdapter(Context ctx, ArrayList<T> l) {
method getFilter (line 27) | public Filter getFilter() {
method getFilterString (line 39) | public String getFilterString() {
method highlightText (line 50) | public CharSequence highlightText(String text) {
method filter (line 71) | public abstract ArrayList<T> filter(final ArrayList<T> values, CharSeq...
class ListFilter (line 80) | private class ListFilter extends Filter {
method performFiltering (line 81) | @Override
method publishResults (line 108) | @SuppressWarnings("unchecked")
FILE: src/com/nmbb/oplayer/ui/base/ThreadPool.java
class ThreadPool (line 12) | public class ThreadPool {
method ThreadPool (line 16) | public ThreadPool() {
method start (line 25) | public void start(Runnable run) {
method stop (line 29) | public void stop() {
method newThread (line 39) | @Override
FILE: src/com/nmbb/oplayer/ui/helper/FileDownloadHelper.java
class FileDownloadHelper (line 23) | public class FileDownloadHelper {
method FileDownloadHelper (line 40) | public FileDownloadHelper(Handler handler) {
method stopALl (line 47) | public void stopALl() {
method newDownloadFile (line 58) | public void newDownloadFile(final String url, final String savePath) {
FILE: src/com/nmbb/oplayer/ui/helper/VideoHelper.java
class VideoHelper (line 15) | public class VideoHelper {
class OnlineVideo (line 18) | public static class OnlineVideo {
method OnlineVideo (line 22) | public OnlineVideo() {
method OnlineVideo (line 25) | public OnlineVideo(String url) {
method getYoukuVideo (line 31) | public static OnlineVideo getYoukuVideo(String url) {
method substring (line 54) | public static String substring(String search, String start, String end...
method substring (line 67) | public static String substring(String search, String start, String end) {
method connect (line 71) | private static String connect(String uri) {
method connect (line 75) | private static String connect(String uri, String charsetName) {
method readData (line 96) | public static String readData(InputStream inSream, String charsetName)...
FILE: src/com/nmbb/oplayer/ui/helper/XmlReaderHelper.java
class XmlReaderHelper (line 22) | public class XmlReaderHelper {
method getAllCategory (line 25) | public static ArrayList<OnlineVideo> getAllCategory(final Context cont...
method getVideos (line 63) | public static ArrayList<OnlineVideo> getVideos(final Context context,
FILE: src/com/nmbb/oplayer/ui/player/CommonGestures.java
class CommonGestures (line 28) | public class CommonGestures {
method CommonGestures (line 41) | public CommonGestures(Activity ctx) {
method onTouchEvent (line 48) | public boolean onTouchEvent(MotionEvent event) {
class TapGestureListener (line 76) | private class TapGestureListener extends SimpleOnGestureListener {
method onSingleTapConfirmed (line 77) | @Override
method onLongPress (line 84) | @Override
class ScaleDetectorListener (line 91) | @SuppressLint("NewApi")
method onScale (line 93) | @Override
method onScaleEnd (line 100) | @Override
method onScaleBegin (line 106) | @Override
class DoubleTapGestureListener (line 114) | private class DoubleTapGestureListener extends SimpleOnGestureListener {
method onDown (line 117) | @Override
method onScroll (line 123) | @Override
method onDoubleTap (line 144) | @Override
method setTouchListener (line 152) | public void setTouchListener(TouchListener l, boolean enable) {
type TouchListener (line 159) | public interface TouchListener {
method onGestureBegin (line 160) | public void onGestureBegin();
method onGestureEnd (line 162) | public void onGestureEnd();
method onLeftSlide (line 164) | public void onLeftSlide(float percent);
method onRightSlide (line 166) | public void onRightSlide(float percent);
method onSingleTap (line 168) | public void onSingleTap();
method onDoubleTap (line 170) | public void onDoubleTap();
method onScale (line 172) | public void onScale(float scaleFactor, int state);
method onLongPress (line 174) | public void onLongPress();
FILE: src/com/nmbb/oplayer/ui/player/MediaController.java
class MediaController (line 58) | public class MediaController extends FrameLayout {
method MediaController (line 109) | public MediaController(Context context) {
method MediaController (line 116) | public MediaController(Context context, boolean locked) {
method initFloatingWindow (line 122) | private void initFloatingWindow() {
method setWindowLayoutType (line 129) | @TargetApi(11)
method initResources (line 142) | @SuppressLint("NewApi")
method inflateLayout (line 193) | private View inflateLayout() {
method findViewItems (line 197) | private void findViewItems(View v) {
method setAnchorView (line 240) | public void setAnchorView(View view) {
method release (line 249) | public void release() {
method onClick (line 257) | @Override
method setOperationInfo (line 263) | private void setOperationInfo(String info, long time) {
method setBrightnessScale (line 270) | private void setBrightnessScale(float scale) {
method setVolumeScale (line 274) | private void setVolumeScale(float scale) {
method setGraphicOperationProgress (line 278) | private void setGraphicOperationProgress(int bgID, float scale) {
method setFileName (line 287) | public void setFileName(String name) {
method setDownloadRate (line 291) | public void setDownloadRate(String rate) {
method setBatteryLevel (line 296) | public void setBatteryLevel(String level) {
method setMediaPlayer (line 301) | public void setMediaPlayer(MediaPlayerControl player) {
method show (line 306) | public void show() {
method show (line 310) | public void show(int timeout) {
method hide (line 334) | public void hide() {
method toggleVideoMode (line 348) | private void toggleVideoMode(boolean larger, boolean recycle) {
method lock (line 383) | private void lock(boolean toLock) {
method isLocked (line 404) | public boolean isLocked() {
class MHandler (line 415) | private static class MHandler extends Handler {
method MHandler (line 418) | public MHandler(MediaController mc) {
method handleMessage (line 422) | @Override
method setProgress (line 458) | private long setProgress() {
method onTouchEvent (line 479) | @Override
method onGestureBegin (line 487) | @Override
method onGestureEnd (line 499) | @Override
method onLeftSlide (line 504) | @Override
method onRightSlide (line 510) | @Override
method onSingleTap (line 516) | @Override
method onDoubleTap (line 526) | @Override
method onLongPress (line 531) | @Override
method onScale (line 536) | @Override
method setVolume (line 554) | private void setVolume(int v) {
method setBrightness (line 563) | private void setBrightness(float f) {
method onTrackballEvent (line 573) | @Override
method dispatchKeyEvent (line 579) | @Override
method showSystemUi (line 621) | @TargetApi(11)
method showButtons (line 629) | private void showButtons(boolean showButtons) {
method updatePausePlay (line 642) | private void updatePausePlay() {
method doPauseResume (line 649) | private void doPauseResume() {
method onClick (line 658) | @Override
method onClick (line 669) | @Override
method onClick (line 678) | @Override
method onClick (line 686) | @Override
method onStartTrackingTouch (line 698) | @Override
method onProgressChanged (line 712) | @Override
method onStopTrackingTouch (line 725) | @Override
type MediaPlayerControl (line 741) | public interface MediaPlayerControl {
method start (line 742) | void start();
method pause (line 744) | void pause();
method stop (line 746) | void stop();
method seekTo (line 748) | void seekTo(long pos);
method isPlaying (line 750) | boolean isPlaying();
method getDuration (line 752) | long getDuration();
method getCurrentPosition (line 754) | long getCurrentPosition();
method getBufferPercentage (line 756) | int getBufferPercentage();
method previous (line 758) | void previous();
method next (line 760) | void next();
method goForward (line 762) | long goForward();
method goBack (line 764) | long goBack();
method toggleVideoMode (line 766) | void toggleVideoMode(int mode);
method showMenu (line 768) | void showMenu();
method removeLoadingView (line 770) | void removeLoadingView();
method scale (line 772) | float scale(float scale);
method snapshot (line 774) | void snapshot();
FILE: src/com/nmbb/oplayer/ui/player/PlayerService.java
class PlayerService (line 50) | public class PlayerService extends Service implements
class LocalBinder (line 79) | public class LocalBinder extends Binder {
method getService (line 80) | public PlayerService getService() {
method onCreate (line 85) | @Override
method onStartCommand (line 95) | @Override
method vplayerInit (line 106) | private void vplayerInit(boolean isHWCodec) {
method releaseContext (line 124) | public void releaseContext() {
method onBind (line 130) | @Override
method onDestroy (line 136) | @Override
method isInitialized (line 143) | public boolean isInitialized() {
method initialize (line 149) | public boolean initialize(Uri filePath, String displayName,
method setMediaTrack (line 176) | private void setMediaTrack() {
method openVideo (line 179) | private void openVideo() {
method getUri (line 208) | public Uri getUri() {
method getMediaId (line 212) | public long getMediaId() {
method getLastAudioTrack (line 216) | public int getLastAudioTrack() {
method getLastSubTrack (line 220) | public String getLastSubTrack() {
method getLastSubTrackId (line 224) | public int getLastSubTrackId() {
method setVPlayerListener (line 228) | public void setVPlayerListener(VPlayerListener listener) {
method setState (line 232) | public void setState(int state) {
method needResume (line 236) | public boolean needResume() {
method ringingState (line 241) | public boolean ringingState() {
method release (line 245) | public void release() {
method release (line 249) | private void release(boolean all) {
method stop (line 266) | public void stop() {
method start (line 272) | public void start() {
method setDisplay (line 279) | public void setDisplay(SurfaceHolder surface) {
method releaseSurface (line 285) | public void releaseSurface() {
method isPlaying (line 290) | public boolean isPlaying() {
method getVideoWidth (line 294) | public int getVideoWidth() {
method getVideoHeight (line 300) | public int getVideoHeight() {
method getVideoAspectRatio (line 306) | public float getVideoAspectRatio() {
method getDuration (line 312) | public long getDuration() {
method getCurrentPosition (line 318) | public long getCurrentPosition() {
method getCurrentFrame (line 324) | public Bitmap getCurrentFrame() {
method getBufferProgress (line 330) | public float getBufferProgress() {
method seekTo (line 336) | public void seekTo(float percent) {
method getMetaEncoding (line 341) | public String getMetaEncoding() {
method setAudioTrack (line 347) | public void setAudioTrack(int num) {
method getAudioTrack (line 353) | public int getAudioTrack() {
method setSubShown (line 403) | public void setSubShown(boolean shown) {
method isBuffering (line 409) | protected boolean isBuffering() {
method setBuffer (line 413) | protected void setBuffer(int bufSize) {
method setVolume (line 418) | protected void setVolume(float left, float right) {
method setVideoQuality (line 432) | protected void setVideoQuality(int quality) {
method setDeinterlace (line 437) | protected void setDeinterlace(boolean deinterlace) {
method setSubEncoding (line 448) | protected void setSubEncoding(String encoding) {
method setSubPath (line 457) | public void setSubPath(String subPath) {
type VPlayerListener (line 463) | public static interface VPlayerListener {
method onHWRenderFailed (line 464) | public void onHWRenderFailed();
method onVideoSizeChanged (line 466) | public void onVideoSizeChanged(int width, int height);
method onSubChanged (line 468) | public void onSubChanged(String text);
method onSubChanged (line 470) | public void onSubChanged(byte[] pixels, int width, int height);
method onOpenStart (line 472) | public void onOpenStart();
method onOpenSuccess (line 474) | public void onOpenSuccess();
method onOpenFailed (line 476) | public void onOpenFailed();
method onBufferStart (line 478) | public void onBufferStart();
method onBufferComplete (line 480) | public void onBufferComplete();
method onDownloadRateChanged (line 482) | public void onDownloadRateChanged(int kbPerSec);
method onPlaybackComplete (line 484) | public void onPlaybackComplete();
method onCloseStart (line 486) | public void onCloseStart();
method onCloseComplete (line 488) | public void onCloseComplete();
method onCallStateChanged (line 492) | @Override
method onVideoSizeChanged (line 513) | @Override
method onPrepared (line 520) | @Override
method openSuccess (line 526) | private void openSuccess() {
method onCompletion (line 542) | @Override
method onBufferingUpdate (line 551) | @Override
method onSeekComplete (line 555) | @Override
method onInfo (line 559) | @Override
method onError (line 582) | @Override
method getSubFiles (line 588) | private String[] getSubFiles(String videoPath) {
method onTimedText (line 605) | @Override
method onTimedTextUpdate (line 611) | @Override
FILE: src/com/nmbb/oplayer/ui/player/VP.java
class VP (line 6) | public class VP {
method getTypeface (line 43) | public static Typeface getTypeface(int type) {
FILE: src/com/nmbb/oplayer/ui/player/VideoActivity.java
class VideoActivity (line 67) | @SuppressLint("HandlerLeak")
method onCreate (line 121) | @Override
method attachMediaController (line 153) | private void attachMediaController() {
method onStart (line 165) | @Override
method onResume (line 176) | @Override
method onPause (line 193) | @Override
method onStop (line 206) | @Override
method onDestroy (line 221) | @Override
method onConfigurationChanged (line 233) | @Override
method onBackPressed (line 243) | @Override
method onSaveInstanceState (line 248) | @Override
method showMenu (line 256) | @Override
method loadView (line 261) | private void loadView(int id) {
method parseIntent (line 280) | private void parseIntent(Intent i) {
method manageReceivers (line 305) | private void manageReceivers() {
method setFileName (line 332) | private void setFileName() {
method applyResult (line 347) | private void applyResult(int resultCode) {
method resultFinish (line 368) | private void resultFinish(int resultCode) {
method release (line 377) | private void release() {
method reOpen (line 388) | private void reOpen(Uri path, String name, boolean fromStart) {
method reOpen (line 410) | public void reOpen() {
method startPlayer (line 414) | protected void startPlayer() {
method stopPlayer (line 424) | protected void stopPlayer() {
method setBatteryLevel (line 430) | private void setBatteryLevel() {
class BatteryReceiver (line 435) | private class BatteryReceiver extends BroadcastReceiver {
method onReceive (line 436) | @Override
class UserPresentReceiver (line 448) | private class UserPresentReceiver extends BroadcastReceiver {
method onReceive (line 449) | @Override
method isRootActivity (line 457) | private boolean isRootActivity() {
class HeadsetPlugReceiver (line 466) | public class HeadsetPlugReceiver extends BroadcastReceiver {
method onReceive (line 467) | @Override
class ScreenReceiver (line 482) | private class ScreenReceiver extends BroadcastReceiver {
method onReceive (line 485) | @Override
method loadVPlayerPrefs (line 496) | private void loadVPlayerPrefs() {
method setTextViewStyle (line 516) | private void setTextViewStyle(OutlineTextView v) {
method isInitialized (line 524) | private boolean isInitialized() {
method handleMessage (line 536) | @Override
method handleMessage (line 589) | @Override
method setVideoLoadingLayoutVisibility (line 665) | private void setVideoLoadingLayoutVisibility(int visibility) {
method onHWRenderFailed (line 674) | @Override
method onSubChanged (line 682) | @Override
method onSubChanged (line 692) | @Override
method onOpenStart (line 704) | @Override
method onOpenSuccess (line 709) | @Override
method onOpenFailed (line 714) | @Override
method onBufferStart (line 719) | @Override
method onBufferComplete (line 725) | @Override
method onPlaybackComplete (line 733) | @Override
method onCloseStart (line 744) | @Override
method onCloseComplete (line 749) | @Override
method onVideoSizeChanged (line 754) | @Override
method onDownloadRateChanged (line 761) | @Override
method setVideoLayout (line 774) | private void setVideoLayout() {
method savePosition (line 780) | private void savePosition() {
method getStartPosition (line 799) | private float getStartPosition() {
method getBufferPercentage (line 808) | @Override
method getCurrentPosition (line 815) | @Override
method getDuration (line 822) | @Override
method isPlaying (line 829) | @Override
method pause (line 836) | @Override
method seekTo (line 842) | @Override
method start (line 848) | @Override
method previous (line 854) | @Override
method next (line 858) | @Override
method scale (line 865) | @Override
method snapshot (line 889) | @SuppressLint("SimpleDateFormat")
method toggleVideoMode (line 926) | @Override
method stop (line 932) | @Override
method goForward (line 937) | @Override
method goBack (line 942) | @Override
method removeLoadingView (line 947) | @Override
method onSurfaceCreated (line 952) | @Override
method onSurfaceChanged (line 962) | @Override
method onSurfaceDestroyed (line 970) | @Override
FILE: src/com/nmbb/oplayer/ui/player/VideoView.java
class VideoView (line 29) | public class VideoView extends SurfaceView {
method VideoView (line 41) | public VideoView(Context context, AttributeSet attrs) {
method initialize (line 47) | @SuppressWarnings("deprecation")
method setSurfaceLayout (line 61) | private void setSurfaceLayout(float userRatio, int videoWidth, int vid...
method setVideoLayout (line 89) | public void setVideoLayout(int layout, float userRatio, int videoWidth...
method surfaceChanged (line 95) | @Override
method surfaceCreated (line 102) | @Override
method surfaceDestroyed (line 109) | @Override
type SurfaceCallback (line 118) | public interface SurfaceCallback {
method onSurfaceCreated (line 119) | public void onSurfaceCreated(SurfaceHolder holder);
method onSurfaceChanged (line 121) | public void onSurfaceChanged(SurfaceHolder holder, int format, int w...
method onSurfaceDestroyed (line 123) | public void onSurfaceDestroyed(SurfaceHolder holder);
FILE: src/com/nmbb/oplayer/ui/vitamio/InitActivity.java
class InitActivity (line 15) | public class InitActivity extends Activity {
method onCreate (line 21) | @Override
method handleMessage (line 73) | @Override
FILE: src/com/nmbb/oplayer/ui/vitamio/LibsChecker.java
class LibsChecker (line 7) | public final class LibsChecker {
method checkVitamioLibs (line 29) | public static final boolean checkVitamioLibs(Activity ctx, int msgID) {
FILE: src/com/nmbb/oplayer/util/ApplicationUtils.java
class ApplicationUtils (line 18) | public class ApplicationUtils {
method backupApp (line 27) | public static void backupApp(String packageName, Activity mActivity)
method getVerCode (line 75) | public static int getVerCode(Context context) {
method getVerName (line 85) | public static String getVerName(Context context) {
method isTopActivity (line 101) | public static boolean isTopActivity(Context context, String packageNam...
method checkAppExist (line 126) | public static boolean checkAppExist(Context context, String packageNam...
FILE: src/com/nmbb/oplayer/util/ArrayUtils.java
class ArrayUtils (line 20) | public class ArrayUtils {
method concat (line 21) | public static <T> T[] concat(T[] A, T[] B) {
method indexOf (line 31) | public static <T> int indexOf(T[] array, T s) {
FILE: src/com/nmbb/oplayer/util/ConvertUtils.java
class ConvertUtils (line 12) | public final class ConvertUtils {
method ms2s (line 22) | public static float ms2s(long time) {
method us2s (line 32) | public static float us2s(long time) {
method ns2s (line 42) | public static float ns2s(long time) {
method toBoolean (line 52) | public static boolean toBoolean(String str) {
method toBoolean (line 63) | public static boolean toBoolean(String str, boolean def) {
method toFloat (line 80) | public static float toFloat(String str) {
method toFloat (line 91) | public static float toFloat(String str, float def) {
method toLong (line 107) | public static long toLong(String str) {
method toLong (line 118) | public static long toLong(String str, long def) {
method toShort (line 134) | public static short toShort(String str) {
method toShort (line 145) | public static short toShort(String str, short def) {
method toInt (line 161) | public static int toInt(String str) {
method toInt (line 172) | public static int toInt(String str, int def) {
method toString (line 182) | public static String toString(Object o) {
method toString (line 186) | public static String toString(Object o, String def) {
method dipToPX (line 193) | public static int dipToPX(final Context ctx, int dip) {
FILE: src/com/nmbb/oplayer/util/DeviceUtils.java
class DeviceUtils (line 35) | public class DeviceUtils {
method hasFroyo (line 38) | public static boolean hasFroyo() {
method hasGingerbread (line 43) | public static boolean hasGingerbread() {
method hasHoneycomb (line 48) | public static boolean hasHoneycomb() {
method hasHoneycombMR1 (line 53) | public static boolean hasHoneycombMR1() {
method hasICS (line 58) | public static boolean hasICS() {
method getSDKVersionInt (line 62) | public static int getSDKVersionInt() {
method getSDKVersion (line 66) | @SuppressWarnings("deprecation")
method isTablet (line 77) | public static boolean isTablet(Context context) {
method isHoneycombTablet (line 81) | public static boolean isHoneycombTablet(Context context) {
method getDeviceModel (line 90) | public static String getDeviceModel() {
method isMeizu (line 95) | public static boolean isMeizu() {
method isHTC (line 100) | public static boolean isHTC() {
method isXiaomi (line 104) | public static boolean isXiaomi() {
method getManufacturer (line 113) | public static String getManufacturer() {
method getScreenHeight (line 117) | @SuppressWarnings("deprecation")
method getScreenWidth (line 125) | @SuppressWarnings("deprecation")
method getScreenDensity (line 135) | public static float getScreenDensity(Context context) {
method getScreenSize (line 141) | public static int[] getScreenSize(int w, int h, Context context) {
method getScreenSize (line 154) | public static int[] getScreenSize(int w, int h, int phoneW, int phoneH) {
method setBrightness (line 164) | public static void setBrightness(final Activity context, float f) {
method getAvailableStorage (line 187) | public static long getAvailableStorage() {
method hideSoftInput (line 203) | public static void hideSoftInput(Context ctx, View v) {
method showSoftInput (line 212) | public static void showSoftInput(Context ctx) {
method isHardKeyboardOpen (line 224) | protected boolean isHardKeyboardOpen(Context ctx) {
method getCpuInfo (line 228) | public static String getCpuInfo() {
method startApkActivity (line 248) | public static void startApkActivity(final Context ctx, String packageN...
FILE: src/com/nmbb/oplayer/util/FileUtils.java
class FileUtils (line 14) | public class FileUtils {
method isVideoOrAudio (line 105) | public static boolean isVideoOrAudio(File f) {
method isVideoOrAudio (line 110) | public static boolean isVideoOrAudio(String f) {
method isVideo (line 115) | public static boolean isVideo(File f) {
method getFileExtension (line 121) | public static String getFileExtension(File f) {
method getUrlFileName (line 132) | public static String getUrlFileName(String url) {
method getUrlExtension (line 144) | public static String getUrlExtension(String url) {
method getFileNameNoEx (line 154) | public static String getFileNameNoEx(String filename) {
method showFileSize (line 164) | public static String showFileSize(long size) {
method showFileAvailable (line 179) | public static String showFileAvailable() {
method createIfNoExists (line 195) | public static boolean createIfNoExists(String path) {
method getMimeType (line 244) | public static String getMimeType(String path) {
method getExternalStorageDirectory (line 253) | public static String getExternalStorageDirectory() {
method getCanonical (line 269) | public static String getCanonical(File f) {
method sdAvailable (line 280) | public static boolean sdAvailable() {
FILE: src/com/nmbb/oplayer/util/FractionalTouchDelegate.java
class FractionalTouchDelegate (line 38) | public class FractionalTouchDelegate extends TouchDelegate {
method FractionalTouchDelegate (line 54) | public FractionalTouchDelegate(View source, View target, RectF sourceF...
method setupDelegate (line 73) | public static void setupDelegate(View source, View target, RectF sourc...
method updateSourcePartial (line 81) | private void updateSourcePartial() {
method onTouchEvent (line 97) | @Override
FILE: src/com/nmbb/oplayer/util/ImageUtils.java
class ImageUtils (line 28) | public class ImageUtils {
method getBitmapSize (line 35) | @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR1)
method rotate (line 45) | public static Bitmap rotate(Bitmap b, int degrees) {
method decodeSampledBitmapFromFile (line 80) | public static synchronized Bitmap decodeSampledBitmapFromFile(
method calculateInSampleSize (line 117) | public static int calculateInSampleSize(BitmapFactory.Options options,
method saveBitmap (line 151) | public static boolean saveBitmap(String path, Bitmap bitmap) {
method saveBitmap (line 156) | public static boolean saveBitmap(File f, Bitmap bitmap) {
method decodeUriAsBitmap (line 188) | public static Bitmap decodeUriAsBitmap(Context ctx, Uri uri) {
method zoomBitmap (line 215) | public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
method drawableToBitmap (line 227) | public static Bitmap drawableToBitmap(Drawable drawable) {
method getRoundedCornerBitmap (line 248) | public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float round...
method toBitmap (line 275) | public static Bitmap toBitmap(Drawable drawable) {
method scaledBitmap (line 298) | public static Bitmap scaledBitmap(Bitmap src, int dstWidth, int dstHei...
method scaledBitmap (line 321) | public static Bitmap scaledBitmap(Bitmap src, int scale) {
method toBytes (line 336) | public static byte[] toBytes(Bitmap bitmap) {
FILE: src/com/nmbb/oplayer/util/IntentHelper.java
class IntentHelper (line 35) | public final class IntentHelper {
method getIntentUri (line 44) | public static Uri getIntentUri(Intent intent) {
method getTextUri (line 67) | private static Uri getTextUri(String sharedUrl) {
method existPackage (line 78) | public static boolean existPackage(final Context ctx, String packageNa...
method startApkActivity (line 88) | public static void startApkActivity(final Context ctx, String packageN...
FILE: src/com/nmbb/oplayer/util/MediaUtils.java
class MediaUtils (line 23) | public final class MediaUtils {
method isVideoOrAudio (line 42) | public static boolean isVideoOrAudio(String url) {
method isVideoOrAudio (line 46) | public static boolean isVideoOrAudio(File file) {
method isVideo (line 50) | public static boolean isVideo(String url) {
method isVideo (line 54) | public static boolean isVideo(File file) {
method isAudio (line 58) | public static boolean isAudio(String url) {
method isAudio (line 62) | public static boolean isAudio(File file) {
method isSubTrack (line 66) | public static boolean isSubTrack(File file) {
method isNative (line 70) | public static boolean isNative(String uri) {
method generatePattern (line 75) | private static Pattern generatePattern(String[] args) {
FILE: src/com/nmbb/oplayer/util/PinyinUtils.java
class PinyinUtils (line 9) | public final class PinyinUtils {
method chineneToSpell (line 19) | public static String chineneToSpell(String chineseStr) throws BadHanyu...
FILE: src/com/nmbb/oplayer/util/StringUtils.java
class StringUtils (line 22) | public class StringUtils {
method currentTimeString (line 36) | public static String currentTimeString() {
method chatAt (line 40) | public static char chatAt(String pinyin, int index) {
method GetTextWidth (line 47) | public static float GetTextWidth(String Sentence, float Size) {
method formatDate (line 62) | public static String formatDate(Date date, String pattern) {
method formatDate (line 73) | public static String formatDate(Date date) {
method formatDate (line 77) | public static String formatDate(long date) {
method getDate (line 86) | public static String getDate() {
method createFileName (line 91) | public static String createFileName() {
method getDateTime (line 102) | public static String getDateTime() {
method formatDateTime (line 112) | public static String formatDateTime(Date date) {
method formatDateTime (line 116) | public static String formatDateTime(long date) {
method formatGMTDate (line 126) | public static String formatGMTDate(String gmt) {
method join (line 139) | public static String join(final ArrayList<String> array,
method join (line 152) | public static String join(final Iterator<String> iter,
method isEmpty (line 173) | public static boolean isEmpty(String str) {
method trim (line 182) | public static String trim(String str) {
method generateTime (line 193) | public static String generateTime(long time) {
method gennerTime (line 204) | public static String gennerTime(int totalSeconds) {
method generateFileSize (line 216) | public static String generateFileSize(long size) {
method getTimeDiff (line 230) | public static String getTimeDiff(long time) {
method substring (line 272) | public static String substring(String search, String start, String end,
method substring (line 298) | public static String substring(String search, String start, String end) {
method concat (line 308) | public static String concat(String... strs) {
method getChineseCharCount (line 320) | public static int getChineseCharCount(String str) {
method getEnglishCount (line 333) | public static int getEnglishCount(String str) {
method encode (line 345) | public static String encode(String url) {
FILE: src/com/nmbb/oplayer/util/ToastUtils.java
class ToastUtils (line 11) | public class ToastUtils {
method showToast (line 13) | public static void showToast(int resID) {
method showToast (line 17) | public static void showToast(String text) {
method showToast (line 21) | public static void showToast(Context ctx, int resID) {
method showToast (line 25) | public static void showToast(Context ctx, String text) {
method showLongToast (line 29) | public static void showLongToast(Context ctx, int resID) {
method showLongToast (line 33) | public static void showLongToast(int resID) {
method showLongToast (line 37) | public static void showLongToast(Context ctx, String text) {
method showLongToast (line 41) | public static void showLongToast(String text) {
method showToast (line 45) | public static void showToast(Context ctx, int duration, int resID) {
method showToast (line 49) | public static void showToast(Context ctx, int duration, String text) {
method showToastOnUiThread (line 63) | public static void showToastOnUiThread(final Activity ctx, final Strin...
FILE: src/com/nmbb/oplayer/video/VideoThumbnailUtils.java
class VideoThumbnailUtils (line 5) | public final class VideoThumbnailUtils {
method createVideoThumbnail (line 8) | public static Bitmap createVideoThumbnail() {
method getDuration (line 13) | public int getDuration() {
method getVideoHeight (line 18) | public int getVideoHeight() {
method getVideoWidth (line 23) | public int getVideoWidth() {
Condensed preview — 95 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (434K chars).
[
{
"path": ".classpath",
"chars": 466,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<classpath>\n\t<classpathentry kind=\"src\" path=\"src\"/>\n\t<classpathentry kind=\"src\" "
},
{
"path": ".gitignore",
"chars": 187,
"preview": "# built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n\n# generated files\nbin/\n"
},
{
"path": ".project",
"chars": 810,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>OPlayer</name>\n\t<comment></comment>\n\t<projects>\n\t</pr"
},
{
"path": "AndroidManifest.xml",
"chars": 11445,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package="
},
{
"path": "LICENSE",
"chars": 0,
"preview": ""
},
{
"path": "README.md",
"chars": 495,
"preview": "OPlayer\n=======\n\nAndroid平台基于Vitamio的开源播放器\n\n支持以下协议的音频和视频播放:\n* MMS\n* RTSP (RTP, SDP)\n* HTTP流式传输(progressive streaming)\n* H"
},
{
"path": "assets/online.xml",
"chars": 64892,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<list>\n <head>\n <version>1.1.0</version>\n <title>default stream</title>\n "
},
{
"path": "project.properties",
"chars": 406,
"preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
},
{
"path": "res/anim/slide_in_bottom.xml",
"chars": 1027,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n /* //device/apps/common/res/anim/slide_in_left.xml ** ** Copyright 2007"
},
{
"path": "res/anim/slide_in_top.xml",
"chars": 1027,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n /* //device/apps/common/res/anim/slide_in_right.xml ** ** Copyright \n\t2"
},
{
"path": "res/anim/slide_out_bottom.xml",
"chars": 1028,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n /* //device/apps/common/res/anim/slide_out_left.xml ** ** Copyright \n\t2"
},
{
"path": "res/anim/slide_out_top.xml",
"chars": 1028,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n /* //device/apps/common/res/anim/slide_out_right.xml ** ** Copyright \n\t"
},
{
"path": "res/drawable/alphabet_scroller_bg.xml",
"chars": 295,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<selector\r\n xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n <i"
},
{
"path": "res/drawable/home_btn_bg.xml",
"chars": 293,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\r\n\t<item an"
},
{
"path": "res/drawable/mediacontroller_btn_bg.xml",
"chars": 401,
"preview": "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <item android:drawable=\"@color/mediacontrolle"
},
{
"path": "res/drawable/mediacontroller_pause_button.xml",
"chars": 558,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <item "
},
{
"path": "res/drawable/mediacontroller_play_button.xml",
"chars": 554,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <item "
},
{
"path": "res/drawable/mediacontroller_seekbar.xml",
"chars": 1026,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n <it"
},
{
"path": "res/drawable/mediacontroller_seekbar_thumb.xml",
"chars": 257,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:sha"
},
{
"path": "res/drawable/scrubber_control_selector_holo.xml",
"chars": 1083,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2011 The Android Open Source Project Licensed under the \n\tApac"
},
{
"path": "res/drawable/scrubber_progress_horizontal_holo_dark.xml",
"chars": 1107,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2010 The Android Open Source Project Licensed under the \n\tApac"
},
{
"path": "res/layout/activity_video.xml",
"chars": 3592,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<io.vov.vitamio.widget.CenterLayout xmlns:android=\"http://schemas.android.com/apk"
},
{
"path": "res/layout/brightness_volumn.xml",
"chars": 1309,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "res/layout/common_loading.xml",
"chars": 891,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\r\n "
},
{
"path": "res/layout/fragment_file.xml",
"chars": 3564,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "res/layout/fragment_file_item.xml",
"chars": 2165,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "res/layout/fragment_online.xml",
"chars": 1253,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andro"
},
{
"path": "res/layout/fragment_online_item.xml",
"chars": 1332,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "res/layout/fragment_pager.xml",
"chars": 1005,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandroid"
},
{
"path": "res/layout/mediacontroller.xml",
"chars": 9048,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "res/layout/mediaplayer.xml",
"chars": 432,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandro"
},
{
"path": "res/layout/my_media_controller.xml",
"chars": 2102,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\tandro"
},
{
"path": "res/layout/videoview.xml",
"chars": 2662,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n an"
},
{
"path": "res/values/colors.xml",
"chars": 773,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n <color name=\"white\">#ffffffff</color>\r\n <color name=\"black\">"
},
{
"path": "res/values/dimens.xml",
"chars": 728,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<resources>\r\n\r\n <dimen name=\"LargeTextSize\">16.0dip</dimen>\r\n <dimen name="
},
{
"path": "res/values/strings.xml",
"chars": 2031,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n <string name=\"app_name\">开播视频</string>\n <string name=\"version_"
},
{
"path": "res/values/styles.xml",
"chars": 3745,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n\r\n <!--\r\n Base application theme, dependent on API level."
},
{
"path": "res/values-large/dimens.xml",
"chars": 112,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<resources>\r\n <dimen name=\"ChuZhuangWH\">48.0dip</dimen>\r\n</resources>"
},
{
"path": "res/values-small/dimens.xml",
"chars": 112,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<resources>\r\n <dimen name=\"ChuZhuangWH\">32.0dip</dimen>\r\n</resources>"
},
{
"path": "res/values-sw600dp/dimens.xml",
"chars": 259,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<resources>\n \n <dimen name=\"action_bar_default_height\">56dp</dimen>\n <di"
},
{
"path": "res/values-v11/styles.xml",
"chars": 323,
"preview": "<resources>\n\n <!--\n Base application theme for API 11+. This theme completely replaces\n AppBaseTheme fr"
},
{
"path": "res/values-v14/styles.xml",
"chars": 380,
"preview": "<resources>\n\n <!--\n Base application theme for API 14+. This theme completely replaces\n AppBaseTheme fr"
},
{
"path": "res/values-xlarge/dimens.xml",
"chars": 174,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<resources>\r\n\r\n <dimen name=\"ChuZhuangWH\">64.0dip</dimen>\r\n <dimen name=\"a"
},
{
"path": "src/com/nmbb/oplayer/OPlayerApplication.java",
"chars": 1020,
"preview": "package com.nmbb.oplayer;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.os.Environment"
},
{
"path": "src/com/nmbb/oplayer/OPreference.java",
"chars": 1633,
"preview": "package com.nmbb.oplayer;\n\nimport java.util.Map.Entry;\n\nimport android.content.ContentValues;\nimport android.content.Con"
},
{
"path": "src/com/nmbb/oplayer/business/FileBusiness.java",
"chars": 7752,
"preview": "package com.nmbb.oplayer.business;\r\n\r\nimport java.sql.SQLException;\r\nimport java.util.ArrayList;\r\nimport java.util.List;"
},
{
"path": "src/com/nmbb/oplayer/database/DbHelper.java",
"chars": 3208,
"preview": "package com.nmbb.oplayer.database;\n\nimport java.sql.SQLException;\nimport java.util.ArrayList;\nimport java.util.List;\nimp"
},
{
"path": "src/com/nmbb/oplayer/database/SQLiteHelperOrm.java",
"chars": 1340,
"preview": "package com.nmbb.oplayer.database;\r\n\r\nimport java.sql.SQLException;\r\n\r\nimport android.content.Context;\r\nimport android.d"
},
{
"path": "src/com/nmbb/oplayer/exception/Logger.java",
"chars": 2687,
"preview": "package com.nmbb.oplayer.exception;\r\n\r\nimport android.util.Log;\r\n\r\npublic class Logger {\r\n\r\n\tprivate static boolean isLo"
},
{
"path": "src/com/nmbb/oplayer/po/OnlineVideo.java",
"chars": 765,
"preview": "package com.nmbb.oplayer.po;\n\nimport java.util.ArrayList;\n\npublic class OnlineVideo {\n\tpublic String id;\n\t/** 标题 */\n\tpub"
},
{
"path": "src/com/nmbb/oplayer/po/PFile.java",
"chars": 1345,
"preview": "package com.nmbb.oplayer.po;\r\n\r\nimport android.content.Context;\r\nimport android.database.Cursor;\r\nimport android.graphic"
},
{
"path": "src/com/nmbb/oplayer/po/POMedia.java",
"chars": 1415,
"preview": "package com.nmbb.oplayer.po;\n\nimport java.io.File;\n\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite"
},
{
"path": "src/com/nmbb/oplayer/preference/PreferenceUtils.java",
"chars": 4421,
"preview": "package com.nmbb.oplayer.preference;\r\n\r\nimport android.content.Context;\r\nimport android.content.SharedPreferences;\r\nimpo"
},
{
"path": "src/com/nmbb/oplayer/receiver/MediaScannerReceiver.java",
"chars": 2744,
"preview": "package com.nmbb.oplayer.receiver;\n\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport and"
},
{
"path": "src/com/nmbb/oplayer/service/FileDownloadService.java",
"chars": 263,
"preview": "package com.nmbb.oplayer.service;\r\n\r\nimport android.app.Service;\r\nimport android.content.Intent;\r\nimport android.os.IBin"
},
{
"path": "src/com/nmbb/oplayer/service/MediaScannerService.java",
"chars": 8324,
"preview": "package com.nmbb.oplayer.service;\n\nimport java.io.File;\nimport java.io.FileNotFoundException;\nimport java.util.ArrayList"
},
{
"path": "src/com/nmbb/oplayer/ui/FragmentBase.java",
"chars": 1778,
"preview": "package com.nmbb.oplayer.ui;\r\n\r\nimport com.nmbb.oplayer.R;\r\n\r\nimport android.content.BroadcastReceiver;\r\nimport android."
},
{
"path": "src/com/nmbb/oplayer/ui/FragmentFileOld.java",
"chars": 17371,
"preview": "package com.nmbb.oplayer.ui;\r\n\r\nimport java.io.File;\r\nimport java.util.ArrayList;\r\nimport java.util.HashMap;\r\nimport jav"
},
{
"path": "src/com/nmbb/oplayer/ui/FragmentOnline.java",
"chars": 11481,
"preview": "package com.nmbb.oplayer.ui;\r\n\r\nimport java.lang.reflect.InvocationTargetException;\r\nimport java.lang.reflect.Method;\r\ni"
},
{
"path": "src/com/nmbb/oplayer/ui/MainActivity.java",
"chars": 3537,
"preview": "package com.nmbb.oplayer.ui;\r\n\r\n\r\nimport android.content.Intent;\r\nimport android.os.Bundle;\r\nimport android.os.Environme"
},
{
"path": "src/com/nmbb/oplayer/ui/PlayerActivity.java",
"chars": 3796,
"preview": "/*\n * Copyright (C) 2011 VOV IO (http://vov.io/)\n */\n\npackage com.nmbb.oplayer.ui;\n\nimport com.nmbb.oplayer.R;\n\nimport i"
},
{
"path": "src/com/nmbb/oplayer/ui/VideoPlayerActivity.java",
"chars": 8153,
"preview": "/*\n * Copyright (C) 2011 VOV IO (http://vov.io/)\n */\n\npackage com.nmbb.oplayer.ui;\n\nimport com.nmbb.oplayer.R;\nimport co"
},
{
"path": "src/com/nmbb/oplayer/ui/adapter/FileAdapter.java",
"chars": 2036,
"preview": "package com.nmbb.oplayer.ui.adapter;\n\nimport java.util.ArrayList;\n\nimport com.nmbb.oplayer.R;\nimport com.nmbb.oplayer.po"
},
{
"path": "src/com/nmbb/oplayer/ui/adapter/FileDownloadAdapter.java",
"chars": 2843,
"preview": "package com.nmbb.oplayer.ui.adapter;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.content.Cont"
},
{
"path": "src/com/nmbb/oplayer/ui/base/ArrayAdapter.java",
"chars": 2428,
"preview": "package com.nmbb.oplayer.ui.base;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Arrays;\r\nimport java.util.Collection;"
},
{
"path": "src/com/nmbb/oplayer/ui/base/FilterArrayAdapter.java",
"chars": 2997,
"preview": "package com.nmbb.oplayer.ui.base;\r\n\r\nimport java.util.ArrayList;\r\n\r\nimport android.content.Context;\r\nimport android.grap"
},
{
"path": "src/com/nmbb/oplayer/ui/base/ThreadPool.java",
"chars": 1265,
"preview": "package com.nmbb.oplayer.ui.base;\n\nimport java.util.concurrent.LinkedBlockingQueue;\nimport java.util.concurrent.ThreadFa"
},
{
"path": "src/com/nmbb/oplayer/ui/helper/FileDownloadHelper.java",
"chars": 3355,
"preview": "package com.nmbb.oplayer.ui.helper;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStrea"
},
{
"path": "src/com/nmbb/oplayer/ui/helper/VideoHelper.java",
"chars": 2981,
"preview": "package com.nmbb.oplayer.ui.helper;\r\n\r\nimport java.io.ByteArrayOutputStream;\r\nimport java.io.IOException;\r\nimport java.i"
},
{
"path": "src/com/nmbb/oplayer/ui/helper/XmlReaderHelper.java",
"chars": 3816,
"preview": "package com.nmbb.oplayer.ui.helper;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\n\nimport javax.xml.parsers.D"
},
{
"path": "src/com/nmbb/oplayer/ui/player/CommonGestures.java",
"chars": 4955,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/ui/player/MediaController.java",
"chars": 22544,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/ui/player/PlayerService.java",
"chars": 15110,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/ui/player/VP.java",
"chars": 2210,
"preview": "package com.nmbb.oplayer.ui.player;\n\nimport io.vov.vitamio.MediaPlayer;\nimport android.graphics.Typeface;\n\npublic class "
},
{
"path": "src/com/nmbb/oplayer/ui/player/VideoActivity.java",
"chars": 27116,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/ui/player/VideoView.java",
"chars": 4721,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/ui/vitamio/InitActivity.java",
"chars": 2551,
"preview": "package com.nmbb.oplayer.ui.vitamio;\n\nimport io.vov.vitamio.Vitamio;\nimport android.app.Activity;\nimport android.app.Pro"
},
{
"path": "src/com/nmbb/oplayer/ui/vitamio/LibsChecker.java",
"chars": 1571,
"preview": "package com.nmbb.oplayer.ui.vitamio;\n\nimport io.vov.vitamio.Vitamio;\nimport android.app.Activity;\nimport android.content"
},
{
"path": "src/com/nmbb/oplayer/util/ApplicationUtils.java",
"chars": 3654,
"preview": "package com.nmbb.oplayer.util;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileOutputStream;\nim"
},
{
"path": "src/com/nmbb/oplayer/util/ArrayUtils.java",
"chars": 1164,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/util/ConvertUtils.java",
"chars": 3076,
"preview": "package com.nmbb.oplayer.util;\n\nimport android.content.Context;\n\n/**\n * 数据转换类\n * \n * @author 农民伯伯\n * @see http://www.cnb"
},
{
"path": "src/com/nmbb/oplayer/util/DeviceUtils.java",
"chars": 7309,
"preview": "package com.nmbb.oplayer.util;\n\nimport java.io.BufferedReader;\nimport java.io.File;\nimport java.io.FileReader;\nimport ja"
},
{
"path": "src/com/nmbb/oplayer/util/FileUtils.java",
"chars": 11459,
"preview": "package com.nmbb.oplayer.util;\r\n\r\nimport java.io.File;\r\nimport java.io.IOException;\r\nimport java.util.Arrays;\r\nimport ja"
},
{
"path": "src/com/nmbb/oplayer/util/FractionalTouchDelegate.java",
"chars": 5310,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/util/ImageUtils.java",
"chars": 10226,
"preview": "package com.nmbb.oplayer.util;\r\n\r\nimport java.io.ByteArrayOutputStream;\r\nimport java.io.File;\r\nimport java.io.FileNotFou"
},
{
"path": "src/com/nmbb/oplayer/util/IntentHelper.java",
"chars": 3262,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/util/MediaUtils.java",
"chars": 9610,
"preview": "/*\n * Copyright (C) 2012 YIXIA.COM\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not "
},
{
"path": "src/com/nmbb/oplayer/util/PinyinUtils.java",
"chars": 1157,
"preview": "package com.nmbb.oplayer.util;\r\n\r\nimport net.sourceforge.pinyin4j.PinyinHelper;\r\nimport net.sourceforge.pinyin4j.format."
},
{
"path": "src/com/nmbb/oplayer/util/StringUtils.java",
"chars": 8257,
"preview": "package com.nmbb.oplayer.util;\n\nimport java.io.UnsupportedEncodingException;\nimport java.net.URLEncoder;\nimport java.tex"
},
{
"path": "src/com/nmbb/oplayer/util/ToastUtils.java",
"chars": 1986,
"preview": "package com.nmbb.oplayer.util;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.view.View;\ni"
},
{
"path": "src/com/nmbb/oplayer/video/VideoThumbnailUtils.java",
"chars": 404,
"preview": "package com.nmbb.oplayer.video;\r\n\r\nimport android.graphics.Bitmap;\r\n\r\npublic final class VideoThumbnailUtils {\r\n\t\r\n\t/** "
}
]
// ... and 4 more files (download for full content)
About this extraction
This page contains the full source code of the over140/OPlayer GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 95 files (369.9 KB), approximately 106.7k tokens, and a symbol index with 673 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.