安卓獲取軟硬件信息並上傳給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>
程序入口是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實現)