android获得关于手机上的信息

本文介绍如何在Android应用中获取设备的联网信息(如Mobile和Wifi),并展示如何使用DisplayMetrics类获取屏幕分辨率、密度、高度、宽度等参数。此外,文章还涉及如何通过APN获取手机号码,并提供了相应的Java代码实现。
摘要由CSDN通过智能技术生成

获取设备可用联网的信息以及使用的是何种方式联网

检测系统可以连接网络的方式,一般是两种方式,一种是Mobile,另一种是Wifi
第一种即使用的是当前手机的SIM卡的GPRS功能区连接
第二种是使用Wifi功能去搜索无线网连接
但是现在的智能机一般都同时拥有两张联网方式,但是当在模拟器上测试的时候只能有一种方式,那就是Mobile方式,因为模拟器没有Wifi的硬件支持。
安卓上面获取联网状态的类是ConnectivityManager,看到这个类的名称我们毫无疑问就能看出是一个安卓系统的服务管理来,先了解一下如何获取系统服务getSystemService(this.CONNECTIVITY_SERVICE);
还有一个类NetworkInfo,这是网络信息描述的类,具体不多说,看一下在模拟器上的效果吧!

第一个boolean值是代表当前设备是否支持此种联网方式,第二个boolean值是表示这种联网方式的连接状态,可以看出Mobile方式支持并且处于连接,而模拟器不支持wifi,所以wifi:false,false

[mw_shl_code=java,true]private ConnectivityManager cm;
        private TextView tv1,tv2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tv1=(TextView) findViewById(R.id.tv1);
        tv2=(TextView) findViewById(R.id.tv2);
        
        cm=(ConnectivityManager) this.getSystemService(this.CONNECTIVITY_SERVICE);
        findViewById(R.id.button).setOnClickListener(new OnClickListener() {
                        public void onClick(View arg0) {
                                NetworkInfo ni=cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                                boolean isMobileava=ni.isAvailable();
                                boolean ismobilecon=ni.isConnected();
                                tv1.setText("Mobile:"+isMobileava+"   "+ismobilecon);
                                
                                ni=cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                                boolean iswifiava=ni.isAvailable();
                                boolean iswificon=ni.isConnected();
                                tv2.setText("Wifi:"+iswifiava+"   "+iswificon);
                        }
                });
    }[/mw_shl_code]

信息设备

未命名.jpg (46.49 KB, 下载次数: 0)

未命名.jpg
Android获取手机信息[转]

1.获取手机安装的应用信息(排除系统自带):


private String getAllApp() { 
        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() + ","; 
         } 
        } 
        return result.substring(0, result.length() - 1); 
}


以字符串的形式返回应用的名字app1,app2,app3,......,appn中间的以","分开。当然还可以得到包名,icon图标,等等 。

2.获取手机可用内存和总内存
手机的内存信息主要在/proc/meminfo文件中,其中第一行就是总内存,而剩余内存可通过ActivityManager.MemoryInfo得到 。
private String[] getTotalMemory() { 
        String[] result = {"",""};  //1-total 2-avail 
        ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();   
        mActivityManager.getMemoryInfo(mi);   
        long mTotalMem = 0; 
        long mAvailMem = mi.availMem; 
        String str1 = "/proc/meminfo"; 
        String str2; 
        String[] arrayOfString; 
        try { 
                FileReader localFileReader = new FileReader(str1); 
                BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192); 
                str2 = localBufferedReader.readLine(); 
                arrayOfString = str2.split("\\s+"); 
                mTotalMem = Integer.valueOf(arrayOfString[1]).intValue() * 1024; 
                localBufferedReader.close(); 
        } catch (IOException e) { 
                e.printStackTrace(); 
        } 
        result[0] = Formatter.formatFileSize(this, mTotalMem); 
        result[1] = Formatter.formatFileSize(this, mAvailMem);  
        Log.i(TAG, "meminfo total:" + result[0] + " used:" + result[1]); 
        return result; 
}


3.手机CPU信息

private String[] getCpuInfo() { 
        String str1 = "/proc/cpuinfo"; 
        String str2 = ""; 
        String[] cpuInfo = {"", ""};  //1-cpu型号  //2-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  + " "; 
         } 
         str2 = localBufferedReader.readLine(); 
         arrayOfString = str2.split("\\s+"); 
         cpuInfo[1] += arrayOfString[2]; 
         localBufferedReader.close(); 
        } catch (IOException e) { 
        } 
        Log.i(TAG, "cpuinfo:" + cpuInfo[0] + " " + cpuInfo[1]); 
        return cpuInfo; 
}
和内存信息同理,cpu信息可通过读取/proc/cpuinfo文件来得到,其中第一行为cpu型号,第二行为cpu频率。

4.获取手机MAC地址


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地址比较容易,直接通过WifiManager得到。

5.IMEI号,IESI号,手机型号等:
private void getInfo() { 
        TelephonyManager mTm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
        String imei = mTm.getDeviceId(); 
        String imsi = mTm.getSubscriberId(); 
        String mtype = android.os.Build.MODEL; // 手机型号 
        String numer = mTm.getLine1Number(); // 手机号码,有的可得,有的不可得 
}
6.获取手机屏幕高度:
private void getWeithAndHeight(){ 
        //这种方式在service中无法使用, 
        DisplayMetrics dm = new DisplayMetrics(); 
        getWindowManager().getDefaultDisplay().getMetrics(dm); 
        String width = dm.widthPixels;              //宽 
        String height = dm.heightPixels;           //高 

        //在service中也能得到高和宽 
        WindowManager mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
        width = mWindowManager.getDefaultDisplay().getWidth(); 
        height = mWindowManager.getDefaultDisplay().getHeight(); 
}



Android使用Displaymetrics类获取一下手机屏幕中的一些信息

今天学习一下使用Displaymetrics类获取一下手机屏幕中的一些信息
       首先看下文档中的讲解
这个类中包含 描述大小,宽度,字体缩放和其一些其他信息,我们要访问的DisplayMetrics成员,初始化一个这样的对象:
    DisplayMetrics metrics = new DisplayMetrics();
   getWindowManager().getDefaultDisplay().getMetrics(metrics);
返回值                              属性                      说明
    
       float                                           density                                显示屏幕密度   

       int                                               
densityDpi
                          
       int                                             
heightPixels
                        显示屏幕绝对高度  单位 像素
       float                                          scaledDensity
        int                                            widthPixels                         显示屏幕绝对宽度 单位 像素
       float                                          xdpi
       float                                           ydpi
 
 
   
     在上面比较常用的应该是我们要去获取屏幕的分辨率了,虽然我们在 Android开发的时候可以随着窗口的大小去调整改变缩放的比例,但是如果我们能清楚的知道手机屏幕的信息,这样我在布局的时候,不至于或出现因为缩放还造成布局出现变形等等问题
     下面看下Demo源代码:
  1. package com.android;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.DisplayMetrics;  
  6. import android.util.Log;  
  7.   
  8. /** 
  9. * Demo:通过DisplayMetrices类来获取手机屏幕的一些参数 
  10. *  
  11. * @author jiangqq 
  12. *  
  13. */  
  14. public class DisplayMetricsDemo extends Activity {  
  15.     private static final String TAG = "DisplayMetricsDemo";  
  16.   
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.   
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.displaymetrices);  
  22.         DisplayMetrics displayMetrics = new DisplayMetrics();  
  23.         getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);  
  24.         Log.i(TAG, "手机屏幕分辨率:" + displayMetrics.widthPixels + "X"  
  25.                 + displayMetrics.heightPixels);  
  26.         Log.i(TAG, "密度:" + displayMetrics.density);  
  27.         Log.i(TAG, "使用每英寸的像素点来显示密度:" + displayMetrics.densityDpi);  
  28.         Log.i(TAG, displayMetrics.xdpi + "," + displayMetrics.ydpi);  
  29.         Log.i(TAG, displayMetrics.scaledDensity + "");  
  30.   
  31.     }  
  32. }  
复制代码
打印出屏幕信息截图  这里打印出来的屏幕分辨都是以像素为单位的,而且是绝对的

Android 如何用APN来获取手机号
之前很多人说无法完全获取手机号,是因为现在有的卡不能获取,有的卡能获取,现在我们可以换一种思路来考虑问题,就是用VPN的方式请看代码。

java代码:
  1. /** * 电信APN列表 
  2. * @author wudongdong 

  3. */
  4. public class APNNET { 
  5. public static String CTWAP="ctwap"; 
  6. public static String CTNET="ctnet"; 

  7. /** * 电信APN列表 
  8. * @author wudongdong 

  9. */
  10. public class APNNET { 
  11. public static String CTWAP="ctwap"; 
  12. public static String CTNET="ctnet"; 

  13. //获得APN的类型
复制代码
java代码:
  1. /** 
  2. * 获得APN类型 
  3. * @author wudongdong 

  4. */   
  5. public class ApnUtil { 
  6. private static Uri PREFERRED_APN_URI = Uri .parse("content://telephony/carriers/preferapn"); 
  7. /** 
  8. * get apntype 
  9. * @param context 
  10. * @return 
  11. */   

  12. public static String getApnType(Context context){ 
  13. String apntype="nomatch"; 
  14. Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null); c.moveToFirst(); 
  15. String user=c.getString(c.getColumnIndex("user")); 
  16. if(user.startsWith(APNNET.CTNET)){ 
  17. apntype=APNNET.CTNET; 
  18. }else if(user.startsWith(APNNET.CTWAP)){ 
  19. apntype=APNNET.CTWAP; 

  20. return apntype; 

  21. }    
  22. /** * 获得APN类型 
  23. * @author wudongdong 

  24. */
  25. public class ApnUtil { 
  26. private static Uri PREFERRED_APN_URI = Uri .parse("content://telephony/carriers/preferapn"); 
  27. /** 
  28. * get apntype 
  29. * @param context 
  30. * @return 
  31. */   

  32. public static String getApnType(Context context){ 
  33. String apntype="nomatch"; 
  34. Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null); c.moveToFirst(); 
  35. String user=c.getString(c.getColumnIndex("user")); 
  36. if(user.startsWith(APNNET.CTNET)){ 
  37. apntype=APNNET.CTNET; 
  38. }else if(user.startsWith(APNNET.CTWAP)){ 
  39. apntype=APNNET.CTWAP; 

  40. return apntype; 

  41. }
复制代码
获得手机号码的话可以传IMSI码到指定接口,接口地址不方便说。但可以透露一点,必须走CTWAP,这也是判断APN类型的原因,发现很多应用如果APN是走代理的话就不能联网,那么再介绍一下用APN设置网络的代理信息。

java代码:
  1. Cursor c = context.getContentResolver().query(PREFERRED_APN_URI,null, null, null, null); c.moveToFirst();
  2. String proxy=c.getString(c.getColumnIndex("proxy")); 
  3. if (!"".equals(proxy) && proxy!=null) { 
  4. Properties prop = System.getProperties(); 
  5. System.getProperties().put("proxySet", "true"); 
  6. prop.setProperty("http.proxyHost", c.getString(c.getColumnIndex("proxy"))); 
  7. prop.setProperty("http.proxyPort", c.getString(c.getColumnIndex("port"))); 

  8. String authentication = c.getString(c.getColumnIndex("user")) + ":" + c.getString(c.getColumnIndex("password")); 
  9. String encodedLogin = Base64.encode(authentication); 
  10. uc.setRequestProperty("Proxy-Authorization", " BASIC "+ encodedLogin); 
  11. }    
  12. c.close();
复制代码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值