Android手机监控软件设计实现
一、需求分析:
随着IT信息技术的飞速发展,手机的普及,伴随着智能手机的出现及快速的更新换代,手机已不仅仅是一个通信工具,更是一个多功能的应用平台。
手机监控软件则是基于电脑监控软件的原理,植入手机平台的一款软件,由于手机具有良好的网络支持及出色的便携性,植入手机平台十分有现实意义。
二、概要设计:
服务器端:
1. 启动服务器,接收socket
2. 截取屏幕图像,压缩并编码发送
客户端:
1. 登陆服务器及验证
2. 接收服务器信息并解码显示
各个功能通过各自的类来完成。
三、详细设计:
1、手机客户端用ImageView来显示监控画面。
2、手机端使用线程完成接收信息、译码等费时操作。
3、完成Activity之间的数据传递。
4、使用流布局、相对布局等布局方式
5、使用布局与程序功能代码分离的设计方法
6、使用横向、全屏
四、程序结构
1、程序结构说明:
本程序采用模块化设计方法,各个功能的实现都有具体的方法,在主函数调用相应的方法即可实现程序的要求。程序的整体性很强。
2、重要数据说明:
程序通信中,使用字节流协议进行通信。
四个字节 |
一个字节 |
后N个字节 |
一个INT,代表信息长度 |
代表类型 |
信息 |
其中,类型:0代表图片类型数据 (针对客户端)
0代表移动命令 (针对服务器)
1代表鼠标点击命令 2代表鼠标释放命令
3代表键盘点击命令 4代表键盘释放命令
3、函数清单:
见代码
五、调试分析:
程序截图:
使用预览
欢迎界面
使用界面
六、源代码:
1.服务器端(电脑)
- package cn.netjava7;
- public class CharRoom {
- /**
- * 写一个服务器打开的程序
- * @param port:端口
- */
- public void startServer (int port){
- try{
- //建立一个Serverc 对象
- java.net.ServerSocket sc=new java.net.ServerSocket(port);
- System.out.println("服务器创建成功");
- //开始不断地接收数据
- while (true){
- //建立一个联结对象
- java.net.Socket client=sc.accept();
- UserThread ust=new UserThread(client);
- ust.init();
- ust.start();
- }
- }catch(Exception ef){
- ef.printStackTrace();
- }
- }
- /**
- * 主函数
- */
- public static void main(String args[]){
- CharRoom cr=new CharRoom();
- cr.startServer(9090);
- }
- }
- package cn.netjava7;
- import java.awt.Dimension;
- import java.awt.Graphics;
- import java.awt.Image;
- import java.awt.Rectangle;
- import java.awt.Robot;
- import java.awt.Toolkit;
- import java.awt.image.BufferedImage;
- import java.io.ByteArrayOutputStream;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import javax.imageio.ImageIO;
- import javax.swing.ImageIcon;
- import javax.swing.JFrame;
- public class UserThread extends Thread{
- //定义构造器,传入对client
- private java.net.Socket client;
- private java.io.InputStream ins;
- private java.io.OutputStream ous;
- public UserThread(java.net.Socket client){
- this.client=client;
- }
- //初始化
- public void init(){
- try {
- ins=client.getInputStream();
- ous=client.getOutputStream();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //写run方法
- public void run(){
- try {
- sendImg();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public void sendImg() throws Exception{
- DataOutputStream dous=new DataOutputStream(ous);
- Robot ro=new Robot();
- Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize();
- Rectangle r=new Rectangle(scrSize.width,scrSize.height);
- System.out.println("大小是:"+scrSize.height+" "+scrSize.width);
- while(true){
- BufferedImage bui=ro.createScreenCapture(r);
- ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
- boolean resultWrite = ImageIO.write(bui, "jpg", imageStream);
- byte [] tagInfo=imageStream.toByteArray();
- System.out.println(tagInfo.length);
- System.out.println(tagInfo[0]+" "+tagInfo[1]);
- Image img=Toolkit.getDefaultToolkit().createImage(tagInfo, 0,tagInfo.length);
- dous.writeInt(tagInfo.length+5);
- dous.writeByte((byte)4);
- dous.write(tagInfo);
- Thread.sleep(1000);
- }
- }
- }
2.手机端:
- package cn.netjava;
- import java.io.DataInputStream;
- import android.app.Activity;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.net.wifi.WifiManager;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.ImageView;
- import android.widget.TextView;
- public class FunctionViewActivity extends Activity{
- //定义各个stream
- private java.io.InputStream ins;
- private java.io.OutputStream ous;
- private java.io.DataInputStream dins;
- //定义各个组件
- private ImageView img;
- private TextView tvw;
- //定义一个Bitmap 用来存ImageView的每个图
- private Bitmap bmm;
- //放接收到数据的数组
- private byte[] data;
- //初始化
- public void init(String ip){
- try{
- System.out.println(ip);
- java.net.Socket soc=new java.net.Socket(ip,9090);
- ins=soc.getInputStream();
- dins=new DataInputStream(ins);
- ous=soc.getOutputStream();
- System.out.println("创建成功!");
- }catch(Exception ef){
- ef.printStackTrace();
- }
- }
- //内部类,myHandler
- class MyHandler extends Handler{
- public MyHandler(){
- }
- public MyHandler(Looper looper){
- super(looper);
- }
- public void handleMessage(Message msg){
- img.setImageBitmap((Bitmap)msg.obj);
- }
- }
- //onCreate
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.mainfunctionactivity);
- //得到各个组件
- img=(ImageView)findViewById(R.id.imgView);
- tvw=(TextView)findViewById(R.id.exitTextView);
- //textView 添加监听器
- tvw.setOnClickListener(new OnClickListener(){
- public void onClick(View v) {
- System.exit(0);
- }
- });
- init(this.getIntent().getStringExtra("ipaddress"));
- Looper looper = Looper.myLooper();
- //此处甚至可以不需要设置Looper,因为 Handler默认就使用当前线程的Looper
- final MyHandler myhandler= new MyHandler(looper);
- new Thread() {
- public void run() {
- while(true){
- try{
- data=new byte[dins.readInt()-5];
- dins.readByte();
- //注意,这里要用readfully
- dins.readFully(data);
- //注意,这里要回收bmm ,否则报错
- if (bmm!=null){
- bmm.recycle();
- }
- bmm=BitmapFactory.decodeByteArray(data, 0, data.length);
- System.out.println("decode after:"+System.currentTimeMillis());
- //每一百ms 执行 (可调)
- // Thread.sleep(100);
- //创建一个Message对象,并把得到的天气信息赋值给Message对象
- Message message = Message.obtain();
- message.obj = (Bitmap)bmm;
- myhandler.sendMessage(message);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }.start();
- }
- }
Android手机监控软件设计实现的更多相关文章
- Android手机安全软件的恶意程序检测靠谱吗--LBE安全大师、腾讯手机管家、360手机卫士恶意软件检测方法研究
转载请注明出处,谢谢. Android系统开放,各大论坛活跃,应用程序分发渠道广泛,这也就为恶意软件的传播提供了良好的环境.好在手机上安装了安全软件,是否能有效的检测出恶意软件呢?下边针对LBE安全大 ...
- 如何获得Android手机的软件安装列表
Android的PackageManager类用于检索目前安装在设备上的应用软件包的信息.你可以通过调用getpackagemanager()得到PackageManager类的一个实例.对查询和操作 ...
- Android手机_软件01
1.微信 下载:http://weixin.qq.com/ 2.QQ 下载:http://im.qq.com/download/ 3.滴滴打车(乘客端):http://www.xiaojukeji.c ...
- Android手机_软件安装目录
1. /data/data ==> 应该是 数据存放的位置 /data/app ==> 应该是 程序存放的位置 2.
- Android手机需要安装任务管理软件吗?
使用android手机的用户可能都安装了任务管理的软件,使用android手机真的有必要安装结束任务的软件吗?大家在使用中也都发现了,很多软件在被结束后,马上就会又出现在任务列表里,或是稍等一会自己也 ...
- GPS部标平台的架构设计(六)-Android手机客户端和手机查车设计
对于GPS软件平台,虽然有功能非常丰富的PC端或BS客户端,但是客户也是需要移动客户端来作为自己的辅助工具,也是需要的.做为GPS平台的设计者和开发者,在开发移动客户端的时候,也需要从常规的服务器开发 ...
- 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)
近期要在公司的会议上演示App,须要在投影仪上显示出来给大家演示.因为投影仪不是智能投影仪,仅仅能将App先投影到自己的笔记本上.然后再将笔记本上的内容投影到投影仪上.该App是个游戏,实时交互性比較 ...
- Android针对不同的手机屏幕大小设计图片资源与编码
注:本文转载于:http://blog.csdn.net/welovesunflower/article/details/7930248 一些术语 Screen Size 屏幕尺寸: 实际的物理尺寸, ...
- Android手机一键Root原理分析
图/文 非虫 一直以来,刷机与Root是Android手机爱好者最热衷的事情.即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲.就在前天晚上,一年一度的Google I/O大会拉开了帷 ...
随机推荐
- poj 1364 King(差分约束)
题目:http://poj.org/problem?id=1364 #include <iostream> #include <cstdio> #include <cst ...
- Treeview控件的Node节点延迟加载
Treeview控件是一个很常用的控件,用于展示资源或者组织结构的时候很方便,通常会在系统启动时进行资源的加载和节点目录的初始化,但在资源较多和层级较深的情况下,所有节点加载出来会耗费太多时间,影响体 ...
- YQL
YQL,(Yahoo! Query Language)是一种支持对互联网上的数据进行查询.过滤.连接.类似SQL语法的简单语言.用YQL官方的话:有了YQL,开发人员只需要使用一种 简单的查询语言即可 ...
- Tomcat配置JNDI数据源
经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定-还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.百度上那么花花绿绿的太多了,一个也没成功!...本例使用的数据 ...
- NET下RabbitMQ实践[配置篇]
这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况. 介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Publi ...
- u-boot向linux内核传递启动参数(详细)
U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式 ...
- ExtJs 5.0需要注意的问题
1.在网上查找到的一些例子当中,存在new Ext.grid.ColumnModel()这样的操作,在5.0当中这是不允许的,在5.0当中这个已经被设置为私有方法,不允许用户调用,在5.0中我们不需要 ...
- 判断A树是否包含B树结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构 分析:根据数的遍历方法,首先想到的是采用递归的方式要更简单些,树A从根节点进行遍历,首先判断与B的根节点值是否相等,如果相等则进行递归遍历验证,否则 ...
- bzoj 3295 [Cqoi2011]动态逆序对(cdq分治,BIT)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3295 [题意] n个元素依次删除m个元素,求删除元素之前序列有多少个逆序对. [思路] ...
- Nullable问题
在代码中经常遇到int? 其实int?是Nullable<int>的简写方式. int到int?转化 int? i=null; int j=0; i=j; int?到int转化 ; int ...