热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android全面获取系统状态

最近项目需要一个一键获取系统状态的功能,这里我写了一个demon简单的介绍一下如何获取系统的电量、手机的网络状况(包括2G、3G、4G)、蓝牙的开关情况等共功能。具体的各个代码的功能我就不详

最近项目需要一个一键获取系统状态的功能,这里我写了一个demon简单的介绍一下如何获取系统的电量、手机的网络状况(包括2G、3G、4G)、蓝牙的开关情况等共功能。具体的各个代码的功能我就不详细的讲解ovo。。 因为大部分我都做了注释。好了我就不废话了直接上代码:

首先就是大家关注的实现部分:



  

public class MainActivity extends Activity implements View.OnClickListener {
    private WifiManager mWifiManager;
    private LocationManager mLocationManager;
    //判断gps的状态
    private boolean isGpsOpen;
    private boolean isBatteryOpen;
    private boolean isGsmOpen;
    private Button bt_gps, bt_battery, bt_conn, bt_gsm, bt_bluetooth;
    private BatteryReceiver batteryReceiver;
    private IntentFilter intentFilter;
    private BluetoothAdapter mBluetoothAdapter;
    private TelephonyManager Tel;
    private MyPhoneStateListener MyListener;
    private ConnectionChangeReceiver myReceiver;
    private boolean isConnect;
    public static final String SIGNAL_STRENGTH_NONE_OR_UNKNOWN = "无信号";
    public static final String SIGNAL_STRENGTH_POOR = "信号差";
    public static final String SIGNAL_STRENGTH_MODERATE = "中等的";
    public static final String SIGNAL_STRENGTH_GOOD = "信号比较好";
    public static final String SIGNAL_STRENGTH_GREAT = "信号非常好";
    /**
     * Network type is unknown
     */
    public static final int NETWORK_TYPE_UNKNOWN = 0;
    /**
     * Current network is GPRS
     */
    public static final int NETWORK_TYPE_GPRS = 1;
    /**
     * Current network is EDGE
     */
    public static final int NETWORK_TYPE_EDGE = 2;
    /**
     * Current network is UMTS
     */
    public static final int NETWORK_TYPE_UMTS = 3;
    /**
     * Current network is CDMA: Either IS95A or IS95B
     */
    public static final int NETWORK_TYPE_CDMA = 4;
    /**
     * Current network is EVDO revision 0
     */
    public static final int NETWORK_TYPE_EVDO_0 = 5;
    /**
     * Current network is EVDO revision A
     */
    public static final int NETWORK_TYPE_EVDO_A = 6;
    /**
     * Current network is 1xRTT
     */
    public static final int NETWORK_TYPE_1xRTT = 7;
    /**
     * Current network is HSDPA
     */
    public static final int NETWORK_TYPE_HSDPA = 8;
    /**
     * Current network is HSUPA
     */
    public static final int NETWORK_TYPE_HSUPA = 9;
    /**
     * Current network is HSPA
     */
    public static final int NETWORK_TYPE_HSPA = 10;
    /**
     * Current network is iDen
     */
    public static final int NETWORK_TYPE_IDEN = 11;
    /**
     * Current network is EVDO revision B
     */
    public static final int NETWORK_TYPE_EVDO_B = 12;
    /**
     * Current network is LTE
     */
    public static final int NETWORK_TYPE_LTE = 13;
    /**
     * Current network is eHRPD
     */
    public static final int NETWORK_TYPE_EHRPD = 14;
    /**
     * Current network is HSPA+
     */
    public static final int NETWORK_TYPE_HSPAP = 15;
    /**
     * Current network is GSM
     */
    public static final int NETWORK_TYPE_GSM = 16;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        initEvent();
    }

    /**
     * 初始化对象
     */
    private void init() {
        bt_gps = (Button) findViewById(R.id.bt_gps);
        bt_battery = (Button) findViewById(R.id.bt_battery);
        bt_cOnn= (Button) findViewById(R.id.bt_conn);
        bt_gsm = (Button) findViewById(R.id.bt_gsm);
        bt_bluetooth = (Button) findViewById(R.id.bt_bluetooth);
        batteryReceiver = new BatteryReceiver();
        //注册广播接受者监听系统电池变化
        intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        mLocatiOnManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        /* Update the listener, and start it */
        MyListener = new MyPhoneStateListener();
        Tel = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    }

    /**
     * 初始化事件
     */
    private void initEvent() {

        bt_gps.setOnClickListener(this);
        bt_battery.setOnClickListener(this);
        bt_conn.setOnClickListener(this);
        bt_gsm.setOnClickListener(this);
        bt_bluetooth.setOnClickListener(this);
        registerReceiver();
    }
    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_battery:
                batteryState();
                break;
            case R.id.bt_conn:
                Toast.makeText(this, netWorkState(), Toast.LENGTH_LONG).show();
                break;
            case R.id.bt_gps:
                Toast.makeText(this, gpsState(), Toast.LENGTH_LONG).show();
                break;
            case R.id.bt_gsm:
                isGsmOpen = true;
                Tel.listen(MyListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
                break;
            case R.id.bt_bluetooth:
                Toast.makeText(this, blueToothState(), Toast.LENGTH_LONG).show();
                break;
        }
    }

    /**
     * 注册广播得到系统电量的值
     */
    private void batteryState() {

        isBatteryOpen = true;
        //注册receiver
        registerReceiver(batteryReceiver, intentFilter);


    }

    /**
     * 返回gps的状态
     */
    private String gpsState() {
        String gpsState = "gps已关闭";
        if (mLocationManager != null) {
            isGpsOpen = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if (isGpsOpen) {
                gpsState = "gps已打开";
            } else {
                gpsState = "gps已关闭";
            }
        }
        return gpsState;
    }

    /**
     * @return 返回wife连接状态
     */
    private boolean isWifiOpen() {
        boolean isWifiOpen = mWifiManager.isWifiEnabled();
        return isWifiOpen;
    }

    /**
     * 判断网络状况
     *
     * @return
     */
    private String netWorkState() {
        String netWorkState = "未知网络";
        if (!isConnect) {
            return netWorkState = "当前无网络";
        } else if (isWifiOpen()) {
            return netWorkState = "无线网络已打开";
        } else {
            switch (Tel.getNetworkType()) {
                case NETWORK_TYPE_GPRS:
                case NETWORK_TYPE_GSM:
                case NETWORK_TYPE_EDGE:
                case NETWORK_TYPE_CDMA:
                case NETWORK_TYPE_1xRTT:
                case NETWORK_TYPE_IDEN:
                    return netWorkState = "当前2g网络";
                case NETWORK_TYPE_UMTS:
                case NETWORK_TYPE_EVDO_0:
                case NETWORK_TYPE_EVDO_A:
                case NETWORK_TYPE_HSDPA:
                case NETWORK_TYPE_HSUPA:
                case NETWORK_TYPE_HSPA:
                case NETWORK_TYPE_EVDO_B:
                case NETWORK_TYPE_EHRPD:
                case NETWORK_TYPE_HSPAP:
                    return netWorkState = "当前3g网络";
                case NETWORK_TYPE_LTE:
                    return netWorkState = "当前4g网络";
                default:
                    return netWorkState;
            }
        }


    }

    /**
     * 判断蓝牙服务
     *
     * @return
     */
    private String blueToothState() {
        String blueToothState = "蓝牙已关闭";
        if (mBluetoothAdapter != null) {
            boolean isBlueOpen = mBluetoothAdapter.isEnabled();
            if (isBlueOpen) {
                blueToothState = "蓝牙已打开";
            } else {
                blueToothState = "蓝牙已关闭";
            }
        }

        return blueToothState;
    }

    /**
     * 广播监听电量变化
     */
    class BatteryReceiver extends BroadcastReceiver {

        //判断它是否是为电量变化的Broadcast Action
        @Override
        public void onReceive(Context context, Intent intent) {
            if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()) && isBatteryOpen) {
                //获取当前电量
                int level = intent.getIntExtra("level", 0);
                //电量的总刻度
                int scale = intent.getIntExtra("scale", 100);
                //把它转成百分比
                Toast.makeText(context, "电池电量为" + ((level * 100) / scale) + "%", Toast.LENGTH_LONG).show();
                isBatteryOpen = false;
            }
        }
    }

    /* 开始PhoneState听众 */
    private class MyPhoneStateListener extends PhoneStateListener {
        /* 从得到的信号强度,每个tiome供应商有更新 */
        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
            super.onSignalStrengthsChanged(signalStrength);
            String level;

            if (isGsmOpen) {
                int asu = signalStrength.getGsmSignalStrength();
                if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
                else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT;
                else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD;
                else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE;
                else level = SIGNAL_STRENGTH_POOR;
                Toast.makeText(getApplicationContext(),
                        "当前"
                                + level,
                        Toast.LENGTH_SHORT).show();
            }
            isGsmOpen = false;

        }
    }

    ;

    /**
     * 广播监听网络变化
     */
    public class ConnectionChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager cOnnectivityManager= (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
            NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

            if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
                isCOnnect= false;
            } else {
                isCOnnect= true;
            }
        }
    }

    /**
     * 注册广播
     */
    private void registerReceiver() {
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        myReceiver = new ConnectionChangeReceiver();
        this.registerReceiver(myReceiver, filter);
    }

    /**
     * 注销广播
     */
    private void unregisterReceiver() {
        this.unregisterReceiver(myReceiver);
    }

    /**
     * 注销广播
     */
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver();
    }
}
接下来我发下权限的部分:



    
    
    
    
    
    
        
            
                
                
            
        
    




 
 接下来顺便说下我这里有一个bug就是当你是双卡的时候 手机的信号强度是99的也就是说是一个无法识别的状态,也就是说你其实手机两张卡都有信号但是显示的是无信号。懂的也可以教下我如何区分单卡还是双卡一类的知识,google是不提供这方面的接口的。 
 

最后发一下效果图:


哈哈~界面有点丑希望大家见谅。



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
手机用户2602883115
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有