美文网首页
查看和获取手机信息

查看和获取手机信息

作者: liuye099 | 来源:发表于2019-11-11 17:38 被阅读0次

    一. 查看或设置系统属性

    1. SystemProperties
      我们可以通过SystemProperties.set()和 SystemProperties.get()这两个接口来对系统属性进行读取和设置。系统属性是对整个系统全局共享的,属性系统是android的一个重要特性。它作为一个服务运行,管理系统配置和状态。所有这些配置和状态都是属性。这些属性是以键值对存在的,都是字符串类型。
    2. ADB命令
      可以通过ADB shell进行查看,具体方法是adb shell getprop +“具体的属性对应的名称”就可以读取你想要的属性了。如果不知道具体的属性是什么名称也可以先输入adb shell getprop命令回车,就会显示出所有手机所支持的属性名称及对应的值。
    3. 反射Method类的invoke()

    try {
    Method method = Class.forName("android.os.SystemProperties).getMethod("get",String.class);
    String model = (String)method.invoke(null,"ro.product.vendor.name");
    } catch(NoSuchMethodException e){
    e.printStackTrace();
    }

    1. android系统提供了TrafficStats可以获取流量
      网上列出的工具类代码:

    //接受总量
    TrafficStats.getUidRxBytes(uid);

    //发送总量
    TrafficStats.getUidTxBytes(uid);
    
    //接受总的手机流量  下载
    TrafficStats.getMobileRxBytes();
    
    //发送总的手机流量  上传
    TrafficStats.getMobileTxBytes();//获取手机3g/2g网络上传的总流
    
    // 手机下载wifi
    TrafficStats.getTotalRxBytes() - getMobileRexTotalBytes();
    
    // 手机上传wifi
    TrafficStats.getTotalTxBytes() - getMobileTrxTotalBytes();
    
    1. 获取当前前台应用的方法
      Android5.0以前,使用ActivityManager的getRunningTasks()方法,可以得到应用包名和Activity;Android5.0以后,可以通过UsageStatsManager.queryUsageStats方法替代,但是也只能得到应用包名。当然你也可以通过AccessibilityService,也可以得到应用包名和Activity。
      相关知识参见:(Android 9.0)应用使用数据统计服务——UsageStatsManager

    6.获取使用时长和点击次数
    Android5.0之前,通过PkgUsageStats这个类可以统计到应用的使用情况,但这些类在SDK不公开。
    解决方案:将sdk/platforms/android-19/data/layoutlib.jar使用User Library的方式(AndroidStudio可以使用Provided添加依赖),就可以使用这些类

    //  获取使用时长
    public static long getUseDuration(String pkgName) {
    
        // 注意适配性问题,无法找到该类
        try{
            com.android.internal.app.IUsageStats mUsageStatsService = com.android.internal.app.IUsageStats.Stub
                    .asInterface(ServiceManager.getService("usagestats"));
            PkgUsageStats[] stats;
            try {
                stats = mUsageStatsService.getAllPkgUsageStats();
            } catch (Exception e) {
                LogUtil.d("no permission get use duration");
                e.printStackTrace();
                return 0;
            }
            if (stats == null) {
                return 0;
            }
    
            for (PkgUsageStats ps : stats) {
                if (ps.packageName.equals(pkgName)) {
                    return ps.usageTime;
                }
            }
        }catch(Exception e){
    
        }
        return 0;
    }
    
    
    
    
    // 获取使用次数
    public static long getUseTime(String pkgName) {
        // 注意适配性问题,无法找到该类
        try{
            com.android.internal.app.IUsageStats mUsageStatsService = com.android.internal.app.IUsageStats.Stub
                    .asInterface(ServiceManager.getService("usagestats"));
            PkgUsageStats[] stats = null;
            try {
                stats = mUsageStatsService.getAllPkgUsageStats();
            } catch (Exception e) {
                LogUtil.d("no permission get use duration");
                e.printStackTrace();
                return 0;
            }
            if (stats == null) {
                return 0;
            }
            for (PkgUsageStats ps : stats) {
                if (ps.packageName.equals(pkgName)) {
                    return ps.launchCount;
                }
            }
        }catch(Exception e){
    
        }
        return 0;
    }
    

    注意使用这种方法需要:

        在应用程序的AndroidManifest.xml中的manifest节点中加入”android:sharedUserId=”android.uid.system”这个属性。
        使用目标系统的platform密钥来重新给apk文件重新签名。
    

    二. 特殊属性介绍
    build.prop是所有安卓手机都有的一些配置信息。位置在system/build.prop
    我们了解了这些配置的意义后,可以通过root后对这个配置文件做一定的修改,达到不同的自定义效果,如:更改dpi、更改版本号、更改网络首选项等等。
      如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
      如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
      如果属性名称以“net.”开头,都是与网络相关的信息,比如dns、主机名、为各功能预留的缓冲区大小,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)
    dhcp.wlan 是网关、IP地址等无线网络相关信息;
      属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中。客户端应用程序可以轮询那个属性值,以确定结果、
    external_sd_path 是外部存储SD卡的路径

    本文参考资料:

    1. https://blog.csdn.net/gyw520gyw/article/details/52692810 Android 获取应用的点击次数和使用时长
    2. https://www.jianshu.com/p/3b6bcf9cec67 (Android 9.0)应用使用数据统计服务——UsageStatsManager

    相关文章

      网友评论

          本文标题:查看和获取手机信息

          本文链接:https://www.haomeiwen.com/subject/wygtictx.html