基本原理:通过Android手机向路由器发送一个请求,获取一个snapshot,然后使用线程不断更新界面,形成连续的视频画面。
主要代码如下: 1、wificar.java的代码:
import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.io.*; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import java.io.InputStream;
public class wificar extends Activity {
/* Called when the activity is first created. */ EditText edAlias,edIP,edPort,edUser,edPW; TextView t; Button button1; URL videoUrl; private HttpURLConnection conn; Bitmap bmp; public static String CameraIp; private Handler mHandler ; private ImageView iv; MySurfaceView r; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); edIP=(EditText)findViewById(R.id.editIP); edPort=(EditText)findViewById(R.id.editPort); button1=(Button)findViewById(R.id.button1); edIP.setText("http://192.168.1.1:8080/?action=snapshot"); CameraIp =edIP.getText().toString(); button1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub
r=new MySurfaceView(wificar .this); setContentView(r); r.GetCameraIP(CameraIp);
}
});
}
} 2、MySurfaceView 类的代码:
import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; 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.Paint; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.animation.Animation; public class MySurfaceView extends SurfaceView implements Callback, Runnable{ private SurfaceHolder sfh; private Thread th; private Canvas canvas; private Paint paint; private int ScreenW, ScreenH; URL videoUrl; private String url; HttpURLConnection conn; Bitmap bmp; public MySurfaceView(Context context) { super(context); th = new Thread(this); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.RED); this.setKeepScreenOn(true);// 保持屏幕常亮
} @Override public void startAnimation(Animation animation) { super.startAnimation(animation); } public void surfaceCreated(SurfaceHolder holder) { ScreenW = this.getWidth();// 获取屏幕宽度 ScreenH = this.getHeight(); th.start(); } private void draw() { try { InputStream inputstream; inputstream = null; videoUrl=new URL(url); conn = (HttpURLConnection)videoUrl.openConnection(); conn.setDoInput(true); conn.connect(); inputstream = conn.getInputStream(); bmp = BitmapFactory.decodeStream(inputstream);
canvas = sfh.lockCanvas(); canvas.drawColor(Color.WHITE); canvas.drawBitmap(bmp, 0, 0, paint); sfh.unlockCanvasAndPost(canvas); conn.disconnect(); } catch (Exception ex) { } finally { //if (canvas != null) //sfh.unlockCanvasAndPost(canvas); } } public void run() { while (true) { draw();
} } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } public void GetCameraIP(String p){url=p;} }
3、布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="视频地址" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <EditText android:layout_width="match_parent" android:id="@+id/editIP" android:layout_height="wrap_content" android:text="> <TextView android:text="端口" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <EditText android:layout_width="match_parent" android:id="@+id/editPort" android:layout_height="wrap_content" android:text="80"></EditText> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="go"></Button>
</LinearLayout>
4、别忘了在AndroidManifest.xml中加上权限声明,否则没法联网 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="bb.baibin" android:versionCode="1" android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".wificar" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
</application> </manifest>