Android之獲取手機信息匯總

逆向過程中有某些加密算法常常使用設(shè)備信息作為加密參數(shù),這時需要我們把設(shè)備信息全部打出來,然后配合敏銳的洞察能力去分析。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.List;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.text.format.Formatter;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
import android.widget.Toast;

public class MainActivity extends Activity {
         @Override
         protected void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.activity_main);
                 Log.d("SystemInfo:", getSystemInfo());
          }

private String getSystemInfo(){
      Log.i("Memory:",getSystemMemInfo());
}
private String getSystemMemInfo() {
//通常系統(tǒng)內(nèi)存信息存儲在"/proc/meminfo"文件中,只需讀取文件第一行即可獲取手機總內(nèi)存大小,可用內(nèi)存通過ActivityManager.MemoryInfo獲取
      String availMemory = getAvailMemory();
      String totalMemory = getTotalMemory();
      return "availMemory:" + availMemory + "\n" + "totalMemory:" + totalMemory;
}
// 獲取android當(dāng)前可用內(nèi)存大小
private String getAvailMemory() { 
      ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
      MemoryInfo mi = new MemoryInfo();
      am.getMemoryInfo(mi);
      return Formatter.formatFileSize(getBaseContext(), mi.availMem);
}
//獲取總內(nèi)存
private String getTotalMemory() {
      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();
              arrayOfString = str2.split("\\s+");
              for (String num : arrayOfString) {
                    Log.i(str2, num + "\t");
              }
      initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;
      localBufferedReader.close();
      } catch (IOException e) {
          Log.i("TotalMemError",Log.getStackTraceString(e));
      }
      return Formatter.formatFileSize(getBaseContext(), initial_memory);
}
獲取手機ip方法1

需要權(quán)限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

public String getLocalIpAddress() {
      try {
      for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                  InetAddress inetAddress = enumIpAddr.nextElement();
                  if (!inetAddress.isLoopbackAddress()) {
                        Toast.makeText(this,inetAddress.getHostAddress().toString(), 3000).show();
                        return inetAddress.getHostAddress().toString();
                   }
            }
         }
} catch (SocketException ex) {
        ex.printStackTrace();
        Log.e("ifo", ex.toString());
}
return "";
}
獲取手機ip方法2

需要用戶權(quán)限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

public String getLocalIpAddress2() {
      // 獲取wifi服務(wù)
      WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      // 判斷wifi是否開啟
      if (!wifiManager.isWifiEnabled()) {
          wifiManager.setWifiEnabled(true);
      }
      WifiInfo wifiInfo = wifiManager.getConnectionInfo();
      int ipAddress = wifiInfo.getIpAddress();
      String ip = intToIp(ipAddress);
      return ip;
}
private String intToIp(int i) {
      return (i & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + ((i >> 16) & 0xFF)+ "." + (i >> 24 & 0xFF);
}
獲取手機MAC地址方法1
private String getMacAddress() {
      String result = "";
      WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      WifiInfo wifiInfo = wifiManager.getConnectionInfo();
      result = wifiInfo.getMacAddress();
      Log.i(TAG, "macAdd:" + result);
      return result;
}
獲取手機MAC地址方法2

讀文件/sys/class/net/wlan0/address;

獲取手機MAC地址方法3
public static String getLocalMacAddressFromIp(Context context) {
    String mac_s= "";
    try {
        byte[] mac;
        NetworkInterface ne=NetworkInterface.getByInetAddress(InetAddress.getByName(getLocalIpAddress()));
        mac = ne.getHardwareAddress();
        mac_s = byte2hex(mac);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mac_s;
}
獲取手機經(jīng)緯度
public void getLocation() {
      LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
      LocationListener myGPSListener = new LocationListener() {
             public void onLocationChanged(Location location) {
                   double latitude = location.getLatitude();
                   double longitude = location.getLongitude();
             }
            public void onStatusChanged(String provider, int status,Bundle extras) {}
            public void onProviderEnabled(String provider) {}
            public void onProviderDisabled(String provider) {}
      };
      Criteria criteria = new Criteria();
      criteria.setAccuracy(Criteria.ACCURACY_COARSE);
      criteria.setAltitudeRequired(false);
      criteria.setCostAllowed(true);
      criteria.setPowerRequirement(Criteria.POWER_LOW);
      String provider = locationManager.getBestProvider(criteria, true); 
      // 選擇最佳Provider
      locationManager.requestLocationUpdates(provider, 5000, 0, myGPSListener);
      // 移除LocationListener
      locationManager.removeUpdates(myGPSListener);
}
當(dāng)前網(wǎng)絡(luò)狀態(tài)(是否連接)
public boolean isNetConnecting() {
      ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
      NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
      if (networkInfo == null || !networkInfo.isConnected()) {
            // info.setConnected(false);
            return false;
} else {
            // info.setConnected(true);
            return true;
        }
}
獲取手機CPU信息方法1

讀取/proc/cpuinfo文件,第一行是型號,第二行是頻率

private String getCpuInfo() {
      String str1 = "/proc/cpuinfo";
      String str2 = "";
      String[] cpuInfo = { "", "" }; //cpu型號和頻率
      String[] arrayOfString;
      try {
            FileReader fr = new FileReader(str1);
            BufferedReader localBufferedReader = new BufferedReader(fr, 8192);
            str2 = localBufferedReader.readLine();
            arrayOfString = str2.split("\\s+");
            for (int i = 2; i < arrayOfString.length; i++) {
                  cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " ";
            }
            str2 = localBufferedReader.readLine();
            arrayOfString = str2.split("\\s+");
            cpuInfo[1] += arrayOfString[2];
            localBufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Log.i(TAG, "cpuinfo:" + cpuInfo[0] + " " + cpuInfo[1]);
            return "cpu model:" + cpuInfo[0] + "cpu rate:" + cpuInfo[1];
}
獲取手機CPU信息方法2

直接通過api獲取cpu型號

android.os.Build.BOARD

獲取sim卡信息

需要權(quán)限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

public String getSimCardInfo() {
      TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
      tm.getCallState();
      CellLocation location = tm.getCellLocation();//通過運營商獲取的設(shè)備終端位置
      location.requestLocationUpdate();
      tm.getDataActivity();      //獲取數(shù)據(jù)活動狀態(tài)
      tm.getDataState();      //獲取數(shù)據(jù)連接狀態(tài)
      String Imei = tm.getDeviceId();//獲取設(shè)備id
      tm.getDeviceSoftwareVersion();//獲取軟件版本
      String phoneNum = tm.getLine1Number();//獲取手機號,但是目前這種方法基本都獲取不到,因為手機號信息不再保存在本地
      tm.getSimCountryIso();//獲取國家碼
      tm.getNetworkCountryIso();//和上一個相同,具體區(qū)別不大
      tm.getNetworkType();//獲取網(wǎng)絡(luò)類型
      tm.getSimSerialNumber();//獲取sim卡序列號
      tm.getSubscriberId();//獲取imsi,IMSI號前面3位460是國家,緊接著后面2位00 02是中國移動,01是中國聯(lián)通,03是中國電信。
      String IMSI = tm.getSubscriberId(); 
      String ProvidersName = null;
      if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {
            ProvidersName = "中國移動";
      } else if (IMSI.startsWith("46001")) {
            ProvidersName = "中國聯(lián)通";
      } else if (IMSI.startsWith("46003")) {
            ProvidersName = "中國電信";
      }      
}
獲取手機中已安裝apk文件信息

通過PackageManager可獲取手機端已安裝的apk文件的信息,具體代碼如下:

PackageManager packageManager = this.getPackageManager(); 
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);

通過上述方法,可得到手機中安裝的所有應(yīng)用程序,包括手動安裝的apk包的信息、系統(tǒng)預(yù)裝的應(yīng)用軟件的信息,要區(qū)分這兩類軟件可使用以下方法:`

  1. 從packageInfoList獲取的packageInfo,再通過packageInfo.applicationInfo獲取applicationInfo。
  2. 判斷(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,該值大于0時,表示獲取的應(yīng)用為系統(tǒng)預(yù)裝的應(yīng)用,反之則為手動安裝的應(yīng)用。`
public static List<PackageInfo> getAllApps(Context context) {
      List<PackageInfo> apps = new ArrayList<PackageInfo>(); 
      PackageManager pManager = context.getPackageManager(); 
      //獲取手機內(nèi)所有應(yīng)用 
      List<PackageInfo> paklist = pManager.getInstalledPackages(0); 
      for (int i = 0; i < paklist.size(); i++) { 
            PackageInfo pak = (PackageInfo) paklist.get(i);
            //判斷是否為非系統(tǒng)預(yù)裝的應(yīng)用程序 
            if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
                  apps.add(pak); 
            }
      } 
return apps;
 } 

獲取圖片、應(yīng)用名、包名:

PackageManager pManager = MessageSendActivity.this.getPackageManager(); 
List<PackageInfo> appList = Utils.getAllApps(MessageSendActivity.this); 
for(int i=0;i<appList.size();i++) { 
      PackageInfo pinfo = appList.get(i); 
      appInfo = new AppInfo(); 
      appInfo.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));
      appInfo.setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString());  
      appInfo.setPackageName(pinfo.applicationInfo.packageName); 
}//appInfo是自定義保存類

通過PackageInfo獲取具體信息方法

包名獲取方法:packageInfo.packageName
icon獲取獲取方法:packageManager.getApplicationIcon(applicationInfo)
應(yīng)用名稱獲取方法:packageManager.getApplicationLabel(applicationInfo)

通過 ResolveInfo 獲取具體信息方法:

包名獲取方法:resolve.activityInfo.packageName
icon獲取方法:resolve.loadIcon(packageManager)
應(yīng)用名稱獲取方法:resolve.loadLabel(packageManager).toString()

獲取IMEI的兩種方法:

String imei = ((TelephonyManager) context.getSystemService(TELEPHONY_SERVICE)).getDeviceId();
String IMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容