安卓获取软硬件信息并上传给服务器(Socket实现)
来源:互联网 发布:华为 抢购软件 编辑:程序博客网 时间:2024/06/03 18:46
首先,项目结构如图--A:分为客户端部分CheckInfo和服务器端CheckInfo_Server。CheckInfo获取手机信息(Mac,Cpu,内存,已安装软件信息等)并上传到服务器端,然后从已安装软件信息中查找有没有安装某一款软件,没有则定位到该软件下载页面;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 {@Overrideprotected 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);//cpustr=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);//向服务器发送信息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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);tx=(TextView)findViewById(R.id.textView1);tx.setText("手机环境正常");}@Overridepublic 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;@Overrideprotected 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();}}@Overridepublic 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();//读取客户端发来的消息System.out.print(msg);//控制台输出信息}}catch(Exception e){e.printStackTrace();}}}刚接触安卓不久,把自己写的例子记录下来,以便积累经验。
参考资料:
《Android核心技术与实例详解》----欧阳零
http://blog.csdn.net/hytfly/article/details/8552483
0 0
- 安卓获取软硬件信息并上传给服务器(Socket实现)
- 获取安卓手机软硬件信息
- 安卓ListView获取信息并显示
- MFC实现socket编程--远程获取服务器主机信息
- android系统软硬件信息获取
- 获取电脑的软硬件信息
- 获取并输出当前安卓设备的系统信息
- 一行代码实现安卓照片选取上传服务器,并适配安卓7.0无法调起相机的问题
- 安卓向服务器提交数据,并获取数据
- 安卓使用socket实现客户端服务器通信问题
- 捕获异常信息并上传到服务器
- socket实现获取服务器时间
- 安卓socket连接服务器
- Flex编写安卓实现上传图片到服务器
- 安卓实现上传文件到服务器(转)
- 安卓实现okhttp上传视频到php服务器
- C# 获取机器软硬件常用信息
- shell获取系统运行状态、软硬件信息
- 学生信息管理系统系列博客五
- 关于局部指针的一点总结
- poj 1840 eps
- jQuery验证控件jquery.validate.js使用说明+中文API
- 黑马程序员——Java基础1 开篇
- 安卓获取软硬件信息并上传给服务器(Socket实现)
- UVa 11988 Broken Keyboard(链表的应用)
- RobHess sift源码配置
- PHP中刷新输出缓冲
- win7 64位系统下安装MySQLdb
- POJ 1005 I Think I Need a Houseboat
- 在线快速将pdf转换成word
- C# 日期格式
- 孪生素数问题--暴露弱点,怎么重用,让相邻两个相减