Android设备获取摄像头视频信息【基于Http】[转]

基本原理:通过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>

转载于:https://www.cnblogs.com/vicky-py/archive/2012/04/03/2430612.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值