主界面:
设置界面:
使用界面:
(由于这不是真正的演示,所以背景是黑色的,如果连上背景是视频头拍摄到的图像)
主要代码:
MyVideo:
(注意这里没有对socket连接的状态进行判断,所以连接失败后点击按钮程序会退出,解决方法请参考我的智能家居项目的安卓应用)
package cn.dong.mycar;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.URL;
import java.util.Scanner;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
* @author by dong
* function 发送指令
*/
public class MyVideo extends Activity{
private Button ForWard;
private Button BackWard;
private Button TurnLeft;
private Button TurnRight;
private TextView showSpace;
private Socket socket = null;
PrintWriter mPrintWriterClient;
URL videoUrl;
SharedPreferences sharedPreferences;
private String ipstr = null;
private String portstr = null;
private String forWordStr = null;
private String backWordStr = null;
private String leftStr = null;
private String rightStr = null;
// private String stopstr = null;
private String videostr = null;
MySurfaceView view;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.myvideo);
//获取parameter中的内容
sharedPreferences = getSharedPreferences("parameter", MODE_PRIVATE);
videostr = sharedPreferences.getString("video", null);
ipstr = sharedPreferences.getString("ip", null);
portstr = sharedPreferences.getString("port", null);
forWordStr = sharedPreferences.getString("up", null);
backWordStr = sharedPreferences.getString("down", null);
leftStr = sharedPreferences.getString("left", null);
rightStr = sharedPreferences.getString("right", null);
// stopstr = sharedPreferences.getString("stop", null);
//把SOCKET放在线程里面
new Thread(){
public void run() {
try {
// mSocketClient = new Socket("192.168.8.1", 2001);
socket=new Socket(ipstr, Integer.parseInt(portstr));
while(true){
//发
mPrintWriterClient = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
// //收
Scanner scan = new Scanner(socket.getInputStream());
String ret = scan.nextLine();
MyVideo.this.runOnUiThread(
new ChangeText(ret));
}
} catch (Exception EE) {
EE.printStackTrace();
}
}
}.start();
view = (MySurfaceView)findViewById(R.id.mySurfaceViewVideo);
ForWard = (Button)findViewById(R.id.ForWard);
BackWard = (Button)findViewById(R.id.BackWard);
TurnLeft = (Button)findViewById(R.id.TurnLeft);
TurnRight = (Button)findViewById(R.id.TurnRight);
showSpace = (TextView)findViewById(R.id.showspace);
view.GetCameraIP(videostr);
//前
ForWard.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
mPrintWriterClient.print(forWordStr);
mPrintWriterClient.flush();
break;
case MotionEvent.ACTION_UP:
stopcar();
break;
default:
stopcar();
break;
}
return false;
}
});
//后
BackWard.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
mPrintWriterClient.print(backWordStr);
mPrintWriterClient.flush();
break;
case MotionEvent.ACTION_UP:
stopcar();
break;
default:
stopcar();
break;
}
return false;
}
});
//左
TurnLeft.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
mPrintWriterClient.print(leftStr);
mPrintWriterClient.flush();
break;
case MotionEvent.ACTION_UP:
stopcar();
break;
default:
stopcar();
break;
}
return false;
}
});
//右
TurnRight.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event){
int action = event.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
mPrintWriterClient.print(rightStr);
mPrintWriterClient.flush();
break;
case MotionEvent.ACTION_UP:
stopcar();
break;
default:
stopcar();
break;
}
return false;
}
});
}
public void stopcar() {
mPrintWriterClient.print("e");
mPrintWriterClient.flush();
}
private long exitTime = 0;
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
if((System.currentTimeMillis()-exitTime)>2000){
Toast.makeText(getApplication(), "再按一次返回键退出到主界面", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
}else {
super.onBackPressed();
}
}
/**
* @author by dong
* function 用于接收超声波探测距离
*/
class ChangeText implements Runnable {
String recvstr;
ChangeText(String text) {
this.recvstr = text;
}
public void run() {
showSpace.setText(recvstr);
// Toast.makeText(getApplication(), recvstr, Toast.LENGTH_SHORT).show();
}
}
}
package cn.dong.mycar;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.SurfaceHolder.Callback;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RectF;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MySurfaceView extends SurfaceView implements Callback, Runnable{
private Thread mythread;
private SurfaceHolder holder;
private Canvas canvas;
private String urlstr;
URL videoUrl;
HttpURLConnection conn;
Bitmap bmp;
InputStream inputstream=null;
private static int mScreenWidth;
private static int mScreenHeight;
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
mythread = new Thread(this);
//获取屏幕宽高
DisplayMetrics dm = getResources().getDisplayMetrics();
mScreenWidth = dm.widthPixels;
mScreenHeight = dm.heightPixels;
// 保持屏幕常亮
this.setKeepScreenOn(true);
//获得SurfaceHolder对象
holder = this.getHolder();
//回调函数
holder.addCallback(this);
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
public void GetCameraIP(String p){urlstr=p;}
public void surfaceCreated(SurfaceHolder holder) {
mythread.start();
}
public void run() {
// TODO Auto-generated method stub
while (true) {
draw();
}
}
private void draw() {
// TODO Auto-generated method stub
try{
//创建一个URL对象
videoUrl = new URL(urlstr);
//利用HttpURLConnection对象从网络中获取网页数据
HttpURLConnection conn = (HttpURLConnection)videoUrl.openConnection();
//设置输入流
conn.setDoInput(true);
conn.connect();
//得到网络返回的输入流
inputstream = conn.getInputStream();
//创建一个bitmap
bmp = BitmapFactory.decodeStream(inputstream);
//获得Canvas对象并锁定画布
canvas = holder.lockCanvas();
//Canvas绘画
canvas.drawColor(Color.WHITE);
RectF rectf = new RectF(0, 0, mScreenWidth, mScreenHeight);
canvas.drawBitmap(bmp, null,rectf, null);
//结束锁定画图,并提交改变,将图形显示
holder.unlockCanvasAndPost(canvas);
//关闭HttpURLConnection连接
conn.disconnect();
}
catch (IOException ex){
ex.printStackTrace();
}
}
}