安卓获取软硬件信息并上传给server(Socket实现)

首先,项目结构如图--A:分为client部分CheckInfo和server端CheckInfo_Server。CheckInfo获取手机信息(Mac,Cpu,内存,已安装软件信息等)并上传到server端,然后从已安装软件信息中查找有没有安装某一款软件,没有则定位到该软件下载页面。CheckInfo_Server将上传的信息输出。

图--A

AndroidManifest.xml:

<?

xml version="1.0" encoding="utf-8"?

>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xinab.checkinfo"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.xinab.checkinfo.CheckActivity"
            android:label="@string/app_name" >
            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />             

            </intent-filter>
        </activity>
        <activity
            android:name="com.xinab.checkinfo.MainActivity">

        </activity>
        <activity
            android:name="com.xinab.checkinfo.DsoftActivity">

        </activity>
    </application>

</manifest>

由于要获取mac地址,和网络通信,增加ACCESS_WIFI_STATE和INTERNET权限;

程序入口是CheckActivity.java:

package com.xinab.checkinfo;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.util.List;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.text.format.Formatter;
import android.util.Log;
import android.widget.Toast;

public class CheckActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
		WifiInfo info = wifi.getConnectionInfo();
		String mac="",softinfo="",pmac="",pinfo="",amem="",tmem="",ssid="",cpu="",str="";
		int a,b,c,d,e;
		mac=getMacAddress(pmac);
		amem=getAvailMemory(amem);//可用内存
		tmem=getTotalMemory(tmem);//总内存
		softinfo=getAllApp(pinfo);//安装软件信息
		ssid=info.getSSID();//wifi名
		cpu=getCpu(cpu);//cpu
		str=mac+";"+"\n"+"可用内存:"+amem+","+"总内存:"+tmem+";"+"\n"+softinfo+";"+"\n"+"SSID:"+ssid+";"+"\n"+cpu;
		UpToServer(str);
		/*
		 若软件安装了,则indexOf(String str)方法返回-1(在Java中是0,能够写个样例測试);
		 */
		a=softinfo.indexOf("IdsecSeat");
		b=softinfo.indexOf("金山手机卫士");
		c=softinfo.indexOf("QQ管家");
		d=softinfo.indexOf("金山手机毒霸");
		e=softinfo.indexOf("哈哈");
			if(a!=-1||b!=-1||c!=-1||d!=-1||e!=-1){
				Intent intent=new Intent();
				intent.setClass(CheckActivity.this, MainActivity.class);
				startActivity(intent);
				finish();
				}
			else{
				Toast.makeText(this, "手机未安装杀毒软件,请下载" , Toast.LENGTH_LONG).show();
				Intent intent=new Intent();
				intent.setClass(CheckActivity.this,DsoftActivity.class);
				startActivity(intent);
				finish();
				}
		}
	private  void UpToServer(String str){
		try{
				Socket socket =new Socket("192.168.2.63",8888);//电脑IP地址;
				DataOutputStream dout=new DataOutputStream(socket.getOutputStream());//获得输出流
//				String s="This is a test case!";
				dout.writeUTF(str);//向server发送信息
				dout.close();
				socket.close();
			}

		catch(Exception e){
			e.printStackTrace();
		}

	}			

	 /**
	  * .获取手机MAC地址
	  * 仅仅有手机开启wifi才干获取到mac地址
	  */
	private String getMacAddress(String mac){
	        String result = "";
	        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
	        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
	        result = wifiInfo.getMacAddress();
	        Log.i("text", "手机macAdd:" + result);
	        //return result;
	         mac="MAC:"+wifiInfo.getMacAddress();
	         return mac;
	    }
	  /**
	   * 获取安装软件信息
	   *
	   */
	private String getAllApp(String app) {
	         String result = "";
	         List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);
	         for (PackageInfo i : packages) {
	             if ((i.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
	                 result += i.applicationInfo.loadLabel(getPackageManager()).toString() + ",";
	             }
	         }
	        app="手机安装软件信息:"+result.substring(0, result.length() - 1);
	          return app;
	 }  

	 /**
	  *  获取android当前可用内存大小
	  *
	  */
	private String getAvailMemory(String amem) {// 获取android当前可用内存大小     

		        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
		        MemoryInfo mi = new MemoryInfo();
		        am.getMemoryInfo(mi);
		        //mi.availMem; 当前系统的可用内存     

		        return amem=Formatter.formatFileSize(getBaseContext(), mi.availMem);// 将获取的内存大小规格化
		    }    

	/**
	 *
	 * 获得系统总内存
	 */
	private String getTotalMemory(String tmem) {
		     String str1 = "/proc/meminfo";// 系统内存信息文件
		     String str2;
		     String[] arrayOfString;
		     long initial_memory = 0;
		     try {
		     FileReader localFileReader = new FileReader(str1);
		     BufferedReader localBufferedReader = new BufferedReader(
		     localFileReader, 8192);
		     str2 = localBufferedReader.readLine();// 读取meminfo第一行。系统总内存大小   

		     arrayOfString = str2.split("\\s+");
		     for (String num : arrayOfString) {
		     Log.i(str2, num + "\t");
		     }
		     initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存。单位是KB。乘以1024转换为Byte
		     localBufferedReader.close();
		     }
		     catch (IOException e) {
		     }
		     return  tmem= Formatter.formatFileSize(getBaseContext(), initial_memory);// Byte转换为KB或者MB,内存大小规格化
		     }  

	/**
	 * 获取Cpu
	 *
	 */
	private String getCpu(String cpu) {
		    ProcessBuilder cmd;
		    String result = "";
		    try {
		    String[] args = { "/system/bin/cat", "/proc/cpuinfo" };
		    cmd = new ProcessBuilder(args);
		    Process process = cmd.start();
		    InputStream in = process.getInputStream();
		    byte[] re = new byte[1024];
		    while (in.read(re) != -1) {
		    System.out.println(new String(re));
		    result = result + new String(re);
		    cpu="cpu信息:"+result.toString();
		    return cpu;
		          }
		            in.close();
		        }
		        catch (IOException ex) {
		            ex.printStackTrace();
		        }
		        cpu="cpu:"+result.toString();
		        return cpu;
		    }
//	@Override
//	public boolean onCreateOptionsMenu(Menu menu) {
//		// Inflate the menu; this adds items to the action bar if it is present.
//		getMenuInflater().inflate(R.menu.main, menu);
//		return true;
//	}

}

若安装的手机软件中有检測的软件(如金山毒霸)。则转到MainActivity.java,

MainActivity.java:

package com.xinab.checkinfo;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {
	TextView tx;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		tx=(TextView)findViewById(R.id.textView1);
		tx.setText("手机环境正常");
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

若没安装金山毒霸等软件。则定位到某一网页进行下载(这里的网页仅仅是測试所用),Activity也跳转到DsoftActivity.java:

DsoftActivity.java:

package com.xinab.checkinfo;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Toast;

public class DsoftActivity extends Activity {
	WebView wv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.dsoft);
		wv =(WebView)findViewById(R.id.wv);
		//设置载入的页面自适应手机屏幕
		WebSettings settings = wv.getSettings();
		settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
		try{
			wv.loadUrl("http://192.168.2.15:3000");
			//wv.loadUrl("http://m.baidu.com/s?st=10a001&tn=webmkt&word=%CA%D6%BB%FA%C9%B1%B6%BE%C8%ED%BC%FE&f=web_alad_5");

			}
		catch(Exception e){
			Toast.makeText(DsoftActivity.this, "错误:"+e.getMessage(), Toast.LENGTH_LONG).show();
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

布局文件:

main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="113dp"
        android:layout_marginTop="127dp"
        android:text="手机环境正常" />

</RelativeLayout>

dsoft.html:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

CheckInfo_Server接收软件信息并在控制台输出:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Vuamlhbmll/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

server.java:

package com.xinab.checkinfo_server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	public static void main(String aa[])
	{
		try{
			ServerSocket as=new ServerSocket(8888);
			System.out.print("Listenning...."+"\n");//在控制台打印提示信息;
			while(true){
				Socket socket=as.accept();//获取连接的socket对象
				System.out.print("Client Connected......"+"\n");//在控制台打印提示信息;
			DataInputStream din=new DataInputStream(socket.getInputStream());//获得输入流
			String msg=din.readUTF();//读取client发来的消息
			System.out.print(msg);//控制台输出信息
		}
		}
		catch(Exception e){
			e.printStackTrace();
		}

	}
}

刚接触安卓不久,把自己写的样例记录下来,以便积累经验。

參考资料:

《Android核心技术与实例具体解释》----欧阳零

http://blog.csdn.net/hytfly/article/details/8552483

时间: 2024-12-27 00:33:35

安卓获取软硬件信息并上传给server(Socket实现)的相关文章

commons-io在struts框架中无法获取upload.parseRequest(request)上传的文件解决方案

commons-io在struts框架中无法获取upload.parseRequest(request)上传的文件的主要原因是因为struts将request进行了封装,在文件上传时struts会将HttpServletRequest请求被转成了MultiPartRequestWrapper,所以如需使用request,则需要将struts封装好的的MultiPartRequestWrapper转换成HttpServletRequest,这里需要实行两部操作: 操作一:创建java类,继承Jak

动态获取爱奇艺上传视频mp4格式url地址

有时候,在工作中有些客户需要用到视频,我们大家都知道视频是非常的耗费流量的,因此,如果因为项目要求客户单独买台视频服务器是非常划不来的.那么将视频上传到优酷,爱奇艺等视频网站来托管那是一件很好的解决方案. 今天主要和大家聊下如果使用爱奇艺开放平台中来动态获取自己上传视频的mp4格式url地址.我们闲话少说,直接开始. 首先先看下通过这种方式获取的视频播放效果: 一.我们需要注册成为爱奇艺开发者       爱奇艺开放平台: http://open.iqiyi.com/index.html   二

Android简单实现将手机图片上传到server中

在本例中.将会简单的实现安卓手机将图片上传到server中.本例使用到了 server端:PHP+APACHE 客户端:JAVA 先简单实现一下server端的上传并測试上传效果,看实例 <?php if(empty($_GET['submit'])){?> <form enctype="multipart/form-data" action="<?php $_SERVER['PHP_SELF']? >?submit=1" method

与安卓交互的上传图片 与 上传语音、视频

1.与安卓语音的交互 注意:获取语音的src 需要用DOM元素获取 (1)HTML (点击按钮告诉安卓,录音开始与结束) <span class="voice" onclick="voicecli()">上传语音</span> (2)JS //点击语音 function voicecli() { $('.addPicture').hide(); $('.expaddVoice').show(); //调方法 //判断调安卓方法显示或隐藏语音

Android拍照获取照片路径并上传至服务器+Servlet代码

先来客户端代码[这里只写了主要代码] 先来张效果图, iv_photo.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { new ActionSheetDialog(SendGoodsDetailsActivity.this).builder().setTitle("上传车辆照片") .setCancelable(false).setCanceledOnTouchOuts

前端获取图片压缩后上传给后台

 此前有同事跟我聊过关于移动端用canvas压缩图片后再上传的功能,最近有了点空闲时间,所以就实践了一下.demo效果链接在文章底部贴出. 在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上传显然不是一个好办法. 目前来说,HTML5的各种新API都在移动端的webkit上得到了较好的 实现.根据查看caniuse,本demo里使用到的FileRe

获取txt md5值上传文件完整性校验

网络上传文件到服务器 做md5 校对.判断文件是否破坏 首先求txt文件的md5值 ,1万条数据 求出的值 文件MD5:e5467b6a8e3c26af8c5af0bda3739280 服务器处理程序 也对上传的txt文件求md5值,如果这两个值相同,则文件完整 c# 求txt文件md5代码 static void GetMD5(string s) { try { FileStream file = new FileStream(s,FileMode.Open); MD5 md5 = new M

HTML5_纯JS实现上传文件显示文件大小,文件信息,上传进度_不使用JS库

前台 html <input type="file" id="_netLogo" onchange="fileSelected();"> <div id="fileName"> </div> <div id="fileSize"> </div> <div id="fileType"> </div> <

安卓自定义View实现图片上传进度显示(仿QQ)

首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方开源库,其次,需要自定义一个View并重写onDraw方法,此例中的进度是开启了一个线程,然后模仿进度递增,然后将进度值通过自定义View调用一个自定义方法传进自定义View并根据进度进行重绘. 绘制分为三部分: 1.绘制矩形(图片面积)上半部分阴影区: 2.绘制矩形(图片面积)下半部分非阴影区: