1、 查看电池信息需要接收一个系统广播,一旦电池信息发生变化,应用程序能够立即显示电池新信息。android系统提供了一个Intent.ACTION_BATTERY_CHANGED广播Action,只要把它注册到广播接收器,即可获取电池信息。
//mBatteryInfoReceiver:用来接收手机电池信息变化时候产生的广播 //Intent.ACTION_BATTERY_CHANGED 电池状态发生变化,他会自动向系统广播Action //将电池广播数据(Intent)注册到mBatteryInfoReceiver中 registerReceiver( mBatteryInfoReceiver, new IntentFilter( Intent.ACTION_BATTERY_CHANGED ) );
2、mBatteryInfoReceiver为广播接收器,一旦发出Intent.ACTION_BATTERY_CHANGED,系统自动调用BroadcastReceiver方法。在BroadcastReceiver里面可以通过intent获取电池的数据
private BroadcastReceiver mBatteryInfoReceiver = new BroadcastReceiver( ) { //如果应用程序接收到系统的发送的广播,就会执行调用onReceive函数 @Override public void onReceive( Context context, Intent intent ) { ……略 //从intent里面得到数据,level表示当前电量的值,0为默认值 int level = intent.getIntExtra( "level", 0 ); //scale表示电量的总刻度,默认值为100 int scale = intent.getIntExtra( "scale", 100 ); //当前电池运行状况,要跟BatteryManager里面的属性进行比较 int health = intent.getIntExtra( "health", BatteryManager.BATTERY_HEALTH_UNKNOWN ); //电池技术(Li电池?还是其他) String tStr = intent.getStringExtra( "technology" ); //电压 int voltage = intent.getIntExtra( "voltage", 0 ) //温度 int temperature = intent.getIntExtra( "temperature", 0 ) } }
SD 卡技术验证
1、在模拟器下测试,需要准备:
建立SD卡: mksdcard 100M D:\sdcard.img
将sd卡放入模拟器中: emulator --avd (设备名称) --sdcard D:\sdcard.img
将数据放入sd卡中:adb push E:/music/a.mp3 sdcard
2、SD卡容量
public static ArrayList<String[]> getSdInfo(Context ctx) { ArrayList<String[]> data = new ArrayList<String[]>(); //linux把设备当作文件处理,从系统中获取SD设备 File path = Environment.getExternalStorageDirectory(); //新建一个stat,它可以查看路径上面的系统文件 StatFs stat = new StatFs(path.getPath()); //一个块的 有多少字节 long blockSize = stat.getBlockSize(); //设备上有多少个空闲的块 long availableBlock = stat.getAvailableBlocks(); //设备上所有的块 long availableBlocks = stat.getBlockCount(); Log.v("blockSize", String.valueOf(blockSize)); Log.v("tag", String.valueOf(availableBlocks)); //换算成字节 long availablePlace = availableBlock * blockSize; long placeCount = availableBlocks * blockSize; //换算成GB 或 MB单位 data.add(new String[] { ctx.getString(R.string.total), formatSize(placeCount, ctx) }); data.add(new String[] { ctx.getString(R.string.free), formatSize(availablePlace, ctx) }); return data; }
问题:新建100MB的SD卡容量,total显示只有98.43MB,剩下1.57MB哪里去了?被inode 占用( 待考证 ) ???(见SD卡参考资料)
系统文件技术验证(root文件夹)
public static ArrayList<String[]> getSysMemoInfo(Context ctx) { ArrayList<String[]> data = new ArrayList<String[]>(); //获取root文件夹下面目录(系统文件夹) File path = Environment.getRootDirectory(); if ( path != null ) { try { StatFs stat = new StatFs( path.getAbsolutePath( ) ); long blockSize = stat.getBlockSize( ); data.add(new String[] { ctx.getString(R.string.total), formatSize( stat.getBlockCount( ) * blockSize, ctx) }); data.add(new String[] { ctx.getString(R.string.free), formatSize( stat.getAvailableBlocks( ) * blockSize, ctx) }); return data; } catch ( Exception e ) { Log.e( Util.class.getName( ), "Cannot access path: " //$NON-NLS-1$ + path.getAbsolutePath( ), e ); } } return data; }
参考: http://www.cnblogs.com/crazypebble/archive/2011/04/09/2010196.html
PS:附上SD卡资料(http://arlen.opcom.blog.163.com/blog/static/33775037201112221933170 )
1、无论我们愿意不愿意,SD卡每次读写数据的最小单位是1个扇区,即512个字节。
2、SD卡允许以块数据进行读取,有的可以用CMD16命令设定每读取的块为512字节
3、SD卡分成:Parition Area 和 Regualr Area,其中Partion Area是存放MBR和PT,Regualr Area包含了System Area 和 User Area。