智能电视TV开发---手机直播视频客户端与智能电视通信

来源:互联网 发布:淘宝刷单首选米粒网 编辑:程序博客网 时间:2024/04/27 18:02

在智能电视TV开发---直播视频客户端结构设计和实现中,我们设计出了简单的客户端,这里这个客户端与智能电视上面的TV服务端进行通信,实现手机控制电视来播放节目。

一、手机端UDP的client实现

  在智能电视TV开发---客户端和服务器通信中我是使用PC端来做客户端与智能电视TV通信的,现在需要把PC端的代码移植到手机端就可以了,这一步很容易。代码如下:

package com.jwzhangjie.smarttv_client.server.service;import java.io.IOException;import java.io.Serializable;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import android.os.AsyncTask;public class UDPClient implements Serializable{private static final long serialVersionUID = 1L;private DatagramSocket udpSocket;private  DatagramPacket dataPacket;private static final int DEFAULT_PORT = 43701;private static final int MAX_DATA_PACKET_LENGTH = 40;private byte[] buffer = new byte[MAX_DATA_PACKET_LENGTH];private String scret = "jwzhangjie";//验证密钥private boolean connect = false;private static class SingleHolder{private static UDPClient instance = new UDPClient();}public static UDPClient getInstance(){return SingleHolder.instance;}/** * 在串行化和反串行化中 * 阻止产生新的实例,总是返回当前对象 * @return */private Object readResolve(){return SingleHolder.instance;}/** * 建立通信连接 */public boolean startUDP(){new startBack().execute(); return connect;}private class startBack extends AsyncTask<Void, Void, Void>{@Overrideprotected Void doInBackground(Void... params) {try {       udpSocket = new DatagramSocket(DEFAULT_PORT );       dataPacket = new DatagramPacket(buffer, MAX_DATA_PACKET_LENGTH);             dataPacket.setPort( DEFAULT_PORT );       InetAddress broadcastAddr;       broadcastAddr = InetAddress.getByName("255.255.255.255");       dataPacket.setAddress(broadcastAddr);       connect = true;   } catch (Exception e) {   e.printStackTrace();   } if (connect) { showInfo("初始化成功");}else {showInfo("初始化失败");}return null;}}/** * 发送数据 * @param data */public void sendMSG(String params){new sendBack().execute(params);}/** * 使用线程运行的目的是因为4.0之后不允许网络操作在主线程中 */private class sendBack extends AsyncTask<String, Void, Void>{@Overrideprotected Void doInBackground(String... params) {if (connect) {showInfo(params[0]);byte[] data = params[0].getBytes();dataPacket.setData(data);dataPacket.setLength(data.length);try {udpSocket.send(dataPacket);} catch (IOException e) {e.printStackTrace();}}return null;}}/** * 关闭客户端广播 */public void closeUDP(){if (connect) {if (udpSocket != null && !udpSocket.isClosed() && udpSocket.isConnected()) {udpSocket.close();udpSocket = null;dataPacket = null;}showInfo("关闭客户端");}}public void showInfo(String params){System.out.println(params);}}

上面的代码需要主要的地方就是Android系统功能是与权限挂钩,不同版本也是有差异的,就如上面的网络通信在4.0之后就不允许在主线程中运行。

二、手机客户端主界面代码

我们添加了发送广播的代码,相应的在主界面代码进行修改,代码如下:
package com.jwzhangjie.smarttv_client;import java.util.List;import com.jwzhangjie.smarttv_client.adapter.LiveVideoAdapter;import com.jwzhangjie.smarttv_client.model.LiveVideoModel;import com.jwzhangjie.smarttv_client.server.service.UDPClient;import com.jwzhangjie.smarttv_client.utils.DBUtils;import android.os.AsyncTask;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;public class Smart_TV_Client extends Activity {private ListView listView;private LiveVideoAdapter adapter;private DBUtils dbUtils;private List<LiveVideoModel> listDatas;public static Smart_TV_Client instance;@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setContentView(R.layout.activity_smart__tv__client);instance = this;dbUtils = new DBUtils(this);initView();initListener();UDPClient.getInstance().startUDP();loadData();}@Overrideprotected void onDestroy() {UDPClient.getInstance().closeUDP();super.onDestroy();}public void initView(){adapter = new LiveVideoAdapter(this);listView = (ListView)findViewById(R.id.listview);listView.setAdapter(adapter);}public void initListener(){listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {LiveVideoModel video = listDatas.get(position);UDPClient.getInstance().sendMSG(video.getUrl());}});}public void loadData(){new loadData().execute();}private class loadData extends AsyncTask<Void, Void, Void>{@Overrideprotected Void doInBackground(Void... params) {listDatas = dbUtils.getLiveVideoModels();return null;}@Overrideprotected void onPostExecute(Void result) {adapter.updateListDatas(listDatas);super.onPostExecute(result);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.smart__tv__client, menu);return true;}}

到现在实现了手机端能够操作智能电视上TV程序的视频播放,接下来就是抽取里面协议部分,最后会以jar和so的形式提供。
0 0
原创粉丝点击