1. 程式人生 > >安卓獲取軟硬件信息並上傳給server(Socket實現)

安卓獲取軟硬件信息並上傳給server(Socket實現)

獲取 acad soc 實現 環境 theme info fcm ntop

首先,項目結構如圖--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接收軟件信息並在控制臺輸出:

技術分享


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




安卓獲取軟硬件信息並上傳給server(Socket實現)