视频APP是否可以理解为视频APP客户端端?

android一步一步实现视频客户端app(一)-android100学习网
android一步一步实现视频客户端app(一)
我开发完成了一个完整的视频客户端app,现在,分享出来,供初学者学习参考(大神就不用看了,比较简单,仅供入门),大家相互交流相互学习。项目有些功能,我时间也不是很多,只能时不时更新下。只能大概...
我开发完成了一个完整的视频客户端app,现在,分享出来,供初学者学习参考(大神就不用看了,比较简单,仅供入门),大家相互交流相互学习。项目有些功能,我时间也不是很多,只能时不时更新下。只能大概讲解怎么一步一步实现,相关的知识点,大家自己查阅相关资料了,本人很多地方也是会使用,要我说出个具体的原理什么的,确实说不清,还有本人表达能力有限,大家只能将就看看,不喜忽喷,哈哈。
还有为大家说下,怎么加入广告平台的广告,发布市场,获取收入(老实说本人app,加广告,基本没收入),这里只是抛砖引玉罢了,给刚入行的朋友说下有这么一回事就是了。当然如果你app有创意,做的好,下载量大,用户多,凭借一款app发家致富是件很容易的事。
界面随便弄的,美工不会,将就看吧,效果图:1.png (533.08 KB, 下载次数: 0)
下载附件 保存到相册
15 分钟前 上传
2.png (1.44 MB, 下载次数: 0)
下载附件 保存到相册
14 分钟前 上传
3.png (834.21 KB, 下载次数: 0)
下载附件 保存到相册
14 分钟前 上传
注意:视频资源是由开放平台提供的sdk,根据官方api文档,可以很容易的获取相应的数据,比较方便。(56视频开放平台)。
1.注册56视频开放平台账号,创建应用,获取应用的id和应用的秘钥,下载android版本的sdk,下载后,解压,可以看见详细的帮助文档和使用说明。
2.打开eclipse创建项目,我的项目名字:MyVideoPlayer,app名字:蝌蚪视频,包名:com.hck.videoplayer.
把解压文件里面libs里面的包,复制到项目的lib文件下面去。
3.引入外包lib库文件。说下这个,因为资源视频格式比较多,用android原生的sdk,不能支持这么多的格式,所以,这里我使用了一个开源的视频播放库,可以支持基本当前所有的视频格式。
下载后,解压,导入进eclipse,然后,点击我们创建的项目——右键》》properties》》android》》add》》点选我们导入的库文件,然后点击ok,ok
5.png (49.71 KB, 下载次数: 0)
下载附件 保存到相册
半小时前 上传
4.新建各个功能模块包。
我这里建如下几个包,你可以根据自己需要,建立自己的包。ui包,放置activity;adpter包,放置adpter;bean包,放置我们的实体对象;
data包,一些全局数据之类的;interfaces包,放置接口的;util包,一些工具类;widge包,一些自定义的view;
net包,和网络相关的。建好后如图:7.png (21.44 KB, 下载次数: 0)
下载附件 保存到相册
17 分钟前 上传
准备工作基本完成,今天就说这么多吧,后面我们再继续5654人阅读
android(152)
视频播放器制作(26)
在里面我们实现了客户端和服务端的简单通信,接下来我们做一个简单的客户端界面,来实现手机端来操控智能电视的TV端。
一、存储视频的结构设计
我们在做客户端的时候,通常是需要存储视频的相关信息,结构如下:
package com.jwzhangjie.smarttv_client.
import android.os.P
import android.os.P
public class LiveModel implements Parcelable{
* 数据库位置
private int db_
* 直播频道的id
private int channel_
* 直播频道的名称
private String channel_
* 直播频道的url
private String icon_
* 直播频道的省份
* 直播频道清晰度
* 直播频道的链接
* 直播频道的second_url
private String second_
* 直播频道所属的类型
public LiveModel(){
private LiveModel(Parcel parcel){
readFromParcel(parcel);
public int describeContents() {
public void readFromParcel(Parcel parcel){
db_id = parcel.readInt();
channel_id = parcel.readInt();
channel_name = parcel.readString();
icon_url = parcel.readString();
province = parcel.readString();
mode = parcel.readString();
= parcel.readString();
second_url = parcel.readString();
types = parcel.readString();
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(db_id);
dest.writeInt(channel_id);
dest.writeString(channel_name);
dest.writeString(icon_url);
dest.writeString(province);
dest.writeString(mode);
dest.writeString(url);
dest.writeString(second_url);
dest.writeString(types);
public static Creator&LiveModel& CREATOR = new Creator&LiveModel&() {
public LiveModel createFromParcel(Parcel source) {
return new LiveModel(source);
public LiveModel[] newArray(int size) {
return new LiveModel[size];
public int getDb_id() {
return db_
public void setDb_id(int db_id) {
this.db_id = db_
public int getChannel_id() {
return channel_
public void setChannel_id(int channel_id) {
this.channel_id = channel_
public String getChannel_name() {
return channel_
public void setChannel_name(String channel_name) {
this.channel_name = channel_
public String getIcon_url() {
return icon_
public void setIcon_url(String icon_url) {
this.icon_url = icon_
public String getProvince() {
public void setProvince(String province) {
this.province =
public String getMode() {
public void setMode(String mode) {
this.mode =
public String getUrl() {
public void setUrl(String url) {
this.url =
public String getSecond_url() {
return second_
public void setSecond_url(String second_url) {
this.second_url = second_
public String getTypes() {
public void setTypes(String types) {
this.types =
二、数据库设计
& 接下来我们设计数据库表格,代码如下:
&&package com.jwzhangjie.smarttv_client.
import android.content.C
import android.database.sqlite.SQLiteD
import android.database.sqlite.SQLiteDatabase.CursorF
import android.database.sqlite.SQLiteOpenH
import android.os.E
public class DBHelper extends SQLiteOpenHelper{
private static final String NAME = &tv_jie.sqlite&;
public static final String DB_PATH = Environment.getExternalStorageDirectory() + &/&;
private static final int DB_VERSION = 1;
public static final String LIVE_VIDEO=&CREATE TABLE live_video & +
&('db_id' INTEGER PRIMARY KEY
AUTOINCREMENT, 'channel_id' INTEGER,& +
& 'channel_name' VARCHAR, 'icon_url' VARCHAR, 'province' VARCHAR, 'mode' VARCHAR, & +
&'url' VARCHAR, 'second_url' VARCHAR, 'types' VARCHAR)&;
public DBHelper(Context context) {
super(context, DB_PATH + NAME, null, DB_VERSION);
public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
public void onCreate(SQLiteDatabase db) {
db.execSQL(LIVE_VIDEO);
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(&DROP TABLE IF live_video&);
三、调用数据库,首先数据的插入,或直播,获取直播的个数
package com.jwzhangjie.smarttv_client.
import java.io.S
import java.util.ArrayL
import java.util.L
import com.jwzhangjie.smarttv_client.db.DBH
import com.jwzhangjie.smarttv_client.model.LiveVideoM
import android.content.ContentV
import android.content.C
import android.database.C
import android.database.sqlite.SQLiteD
public class DBUtils implements Serializable{
private static final long serialVersionUID = 1L;
private static DBHelper mDBH
public DBUtils(Context paramContext) {
mDBHelper = new DBHelper(paramContext);
public void close() {
if (mDBHelper != null) {
mDBHelper.close();
public void insertLiveVideo(LiveVideoModel liveModel){
SQLiteDatabase db =
db = mDBHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(&channel_id&, liveModel.getChannel_id());
contentValues.put(&channel_name&, liveModel.getChannel_name());
contentValues.put(&icon_url&, liveModel.getIcon_url());
contentValues.put(&province&, liveModel.getProvince());
contentValues.put(&mode&, liveModel.getMode());
contentValues.put(&url&, liveModel.getUrl());
contentValues.put(&second_url&, liveModel.getSecond_url());
contentValues.put(&types&, liveModel.getTypes());
db.insertOrThrow(&live_video&, null, contentValues);
} catch (Exception e) {
e.printStackTrace();
* 获取所有的直播视频的个数
public int getMovieCount() {
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(&SELECT count(*) FROM live_video&, null);
cursor.moveToNext();
int coutn = cursor.getInt(0);
cursor.close();
db.close();
public List&LiveVideoModel& getLiveVideoModels(){
List&LiveVideoModel& listData = new ArrayList&LiveVideoModel&();
SQLiteDatabase db = mDBHelper.getReadableDatabase();
Cursor cursor = db.rawQuery(&SELECT * FROM live_video&, null);
while (cursor.moveToNext()) {
LiveVideoModel mVideoModel = new LiveVideoModel();
mVideoModel.setDb_id(cursor.getInt(0));
mVideoModel.setChannel_id(cursor.getInt(1));
mVideoModel.setChannel_name(cursor.getString(2));
mVideoModel.setIcon_url(cursor.getString(3));
mVideoModel.setProvince(cursor.getString(4));
mVideoModel.setMode(cursor.getString(5));
mVideoModel.setUrl(cursor.getString(6));
mVideoModel.setSecond_url(cursor.getString(7));
mVideoModel.setTypes(cursor.getString(8));
listData.add(mVideoModel);
} catch (Exception e) {
e.printStackTrace();
return listD
具体的数据自己去填充,这里我就不提供了,各大视频论坛都分享
四、客户端视频数据的显示
& 这里已经假设数据库已经有数据了,界面很简单就是一个listView来显示,自定义一个adapter
4.1ListView中Item的设计
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&horizontal& &
&ImageView
android:id=&@+id/item_icon&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:scaleType=&center&
android:layout_centerVertical=&true&
android:src=&@drawable/widget_progress_medium_rotation_image&
android:contentDescription=&@string/app_name&
&ImageView
android:id=&@+id/arrow_right&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:src=&@drawable/arrow_right&
android:layout_alignParentRight=&true&
android:layout_centerVertical=&true&
android:layout_marginRight=&10dip&
android:contentDescription=&@string/app_name&
&LinearLayout
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:layout_toRightOf=&@id/item_icon&
android:layout_toLeftOf=&@id/arrow_right&
android:orientation=&vertical&
android:gravity=&center_vertical&
android:layout_centerVertical=&true&
android:layout_marginLeft=&10dip&
android:id=&@+id/item_title&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&title&
android:id=&@+id/item_subtitle&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&subtitle&
&/LinearLayout&
&/RelativeLayout&
4.2网络图片加载方式
这里涉及的直播频道的图标都是网络图片,所以要实现加载网络图片的功能,这里我使用的是网络一个开源的库com.nostra13.universalimageloader,在网上一搜就能看见,所以要使用它我们要配置一些内容。
首先编写一个类继承Application,然后再AndroidManifest.xml里面设置Application的name属性,代码如下:
package com.jwzhangjie.smarttv_client.
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameG
import com.nostra13.universalimageloader.core.ImageL
import com.nostra13.universalimageloader.core.ImageLoaderC
import com.nostra13.universalimageloader.core.assist.QueueProcessingT
import android.app.A
import android.content.C
public class SmartTV_App extends Application {
public void onCreate() {
super.onCreate();
initImageLoader(getApplicationContext());
public static void initImageLoader(Context context) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
context).threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
ImageLoader.getInstance().init(config);
4.3ListView的adapter设计
package com.jwzhangjie.smarttv_client.
import java.util.L
import com.jwzhangjie.smarttv_client.R;
import com.jwzhangjie.smarttv_client.model.LiveVideoM
import com.nostra13.universalimageloader.core.DisplayImageO
import com.nostra13.universalimageloader.core.ImageL
import android.content.C
import android.graphics.B
import android.view.LayoutI
import android.view.V
import android.view.ViewG
import android.widget.BaseA
import android.widget.ImageV
import android.widget.TextV
public class LiveVideoAdapter extends BaseAdapter{
private LayoutInflater mI
private List&LiveVideoModel& listD
private ImageLoader imageLoader = ImageLoader.getInstance();
private DisplayImageO
public LiveVideoAdapter(Context context){
mInflater = LayoutInflater.from(context);
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.img_loading_bg)
.showImageForEmptyUri(R.drawable.img_loading_empty)
.showImageOnFail(R.drawable.img_loading_error)
.cacheInMemory(true)
.cacheOnDisc(true)
.bitmapConfig(Bitmap.Config.RGB_565)
public void updateListDatas(List&LiveVideoModel& listDatas){
this.listDatas = listD
notifyDataSetChanged();
public int getCount() {
return listDatas == null ?0:listDatas.size();
public Object getItem(int position) {
return listDatas.get(position);
public long getItemId(int position) {
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewH
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.item_live, null);
viewHolder.item_icon = (ImageView)convertView.findViewById(R.id.item_icon);
viewHolder.item_arrow = (ImageView)convertView.findViewById(R.id.arrow_right);
viewHolder.item_title = (TextView)convertView.findViewById(R.id.item_title);
viewHolder.item_subtitle = (TextView)convertView.findViewById(R.id.item_subtitle);
convertView.setTag(viewHolder);
viewHolder = (ViewHolder)convertView.getTag();
LiveVideoModel videoModel = listDatas.get(position);
viewHolder.item_title.setText(videoModel.getChannel_name());
viewHolder.item_subtitle.setText(&省份:&+videoModel.getProvince());
imageLoader.displayImage(videoModel.getIcon_url(), viewHolder.item_icon, options);
return convertV
class ViewHolder{
private ImageView item_
private ImageView item_
private TextView item_
private TextView item_
4.4主界面布局设计
&RelativeLayout xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
tools:context=&.Smart_TV_Client& &
&RelativeLayout
android:id=&@+id/title&
android:layout_width=&match_parent&
android:layout_height=&60dip&
android:background=&#d0d0d0&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:text=&直播界面测试&
android:layout_centerInParent=&true&
android:textSize=&16sp&
android:textStyle=&bold&
&/RelativeLayout&
android:id=&@+id/listview&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:layout_below=&@id/title&
android:cacheColorHint=&#&
android:divider=&@drawable/cbox_uc_divider&
android:fadeScrollbars=&false&
android:fastScrollEnabled=&false&
android:focusable=&true&
android:focusableInTouchMode=&true&
android:scrollbars=&none&
android:scrollingCache=&false&
&&/ListView&
&/RelativeLayout&
4.5 主界面代码编写
这里就是这章最后的一步,调用数据库数据,然后传值给adapter,显示在listview上面
package com.jwzhangjie.smarttv_
import java.util.L
import com.jwzhangjie.smarttv_client.adapter.LiveVideoA
import com.jwzhangjie.smarttv_client.model.LiveVideoM
import com.jwzhangjie.smarttv_client.utils.DBU
import android.os.AsyncT
import android.os.B
import android.app.A
import android.view.M
import android.view.W
import android.widget.ListV
public class Smart_TV_Client extends Activity {
private ListView listV
private LiveVideoA
private DBUtils dbU
private List&LiveVideoModel& listD
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_smart__tv__client);
dbUtils = new DBUtils(this);
initView();
loadData();
public void initView(){
adapter = new LiveVideoAdapter(this);
listView = (ListView)findViewById(R.id.listview);
listView.setAdapter(adapter);
public void loadData(){
new loadData().execute();
private class loadData extends AsyncTask&Void, Void, Void&{
protected Void doInBackground(Void... params) {
listDatas = dbUtils.getLiveVideoModels();
protected void onPostExecute(Void result) {
adapter.updateListDatas(listDatas);
super.onPostExecute(result);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.smart__tv__client, menu);
5.显示效果
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1562451次
积分:15038
积分:15038
排名:第583名
原创:199篇
转载:41篇
评论:745条
文章:16篇
阅读:90372
文章:19篇
阅读:150431
文章:10篇
阅读:196534
(1)(1)(2)(2)(4)(1)(4)(2)(5)(4)(2)(1)(2)(1)(9)(3)(3)(10)(4)(9)(7)(6)(9)(12)(3)(21)(14)(21)(14)(25)(7)(19)(18)手机视频APP竞品分析_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
手机视频APP竞品分析
上传于||文档简介
&&2015手机视频客户端(APP)竞品分析 初略
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩25页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢您的赞赏,是对我创作的最大鼓励。|赞赏
收藏已收藏 | 106赞 | 48
分享到微信扫码分享到微信
投稿、稿件问题联系Q:
1541篇作品18.9m阅读总量
热门问题12345678910

我要回帖

更多关于 APP客户端 的文章

 

随机推荐