Android 上层应用读写设备节点
Android 上层应用读写设备节点
Android L
[TOC]
1. Android 设备节点
Android基于Linux内核。设备节点文件是设备驱动的逻辑文件,可以通过设备节点来访问设备驱动。
很多设备信息都可存储在节点中。apk可以访问节点,获取设备信息或状态。
2. framework中读取节点的例子
Android Settings 应用中给出了很多的设备信息,可以以此为入口;进一步可以找到 Build.java
例如获取设备的版本号,应用中直接可以调用 Build.DISPLAY 获得字符串
源码 Build.java (frameworks\base\core\java\android\os)
public static final String PRODUCT = getString("ro.product.name");
......
private static String getString(String property) {
return SystemProperties.get(property, UNKNOWN);
}
跳转到 SystemProperties.java (frameworks\base\core\java\android\os) 这个类不开放
// 调用 native_get ,获取节点;可以设定默认值
public static String get(String key, String def) {
if (key.length() > PROP_NAME_MAX) {
throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
}
return native_get(key, def);
}
3. 应用层读写节点
应用层中,一般都能够读取设备节点。对于写节点这个操作,需要更高的root权限。
读取设备节点
例如给设备新添加了节点,路径是 /sys/class/demo/version
可以adb shell进入机器,然后 cat /sys/class/demo/version;即可获得信息
也可以写成一个方法,如下:
/**
* 获取节点
*/
private static String getString(String path) {
String prop = "waiting";// 默认值
try {
BufferedReader reader = new BufferedReader(new FileReader(path));
prop = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
调用方法就是:
getString("/sys/class/demo/version")
写设备节点
这里写节点的方法需要更高的权限,apk要放到源码中进行编译;
源码中编译apk的方法如同添加第三方apk的方法
AndroidManifest中添加:
android:sharedUserId="android.uid.system"
写节点的代码
private static final String WAKE_PATH = "/sys/class/demo/wake";
......
try {
BufferedWriter bufWriter = null;
bufWriter = new BufferedWriter(new FileWriter(WAKE_PATH));
bufWriter.write("1"); // 写操作
bufWriter.close();
Toast.makeText(getApplicationContext(),
"功能已激活",Toast.LENGTH_SHORT).show();
Log.d(TAG,"功能已激活 angle " + getString(ANGLE_PATH));
} catch (IOException e) {
e.printStackTrace();
Log.e(TAG,"can't write the " + WAKE_PATH);
}
经过源码mm编译后,push到设备中可以查看效果
定时读取设备节点
需要被更新的View记得调用invalidate()方法
使用定时器与Handler来定时读取节点,并更新UI
重启定时器和取消定时器都封装成方法,便于调用
Timer mTimer;
TimerTask mTimerTask;
SensorHandler mHandler = new SensorHandler(this);
/**
* Handler : update value
*/
static class SensorHandler extends Handler {
MainActivity mainActivity;
SensorHandler(MainActivity activity) {
mainActivity = activity;
}
@Override
public void handleMessage(Message msg) {
mainActivity.ultrasoundValue.setText(getString(ULTRASOUND_VALUE_PATH));
}
}
......
/**
* cancel timer and timer task
*/
private void cancelUltrasoundTimer(){
if (mTimer != null) {
mTimer.cancel();
mTimer = null;
}
if (mTimerTask != null){
mTimerTask.cancel();
mTimerTask = null;
}
}
/**
* restart timer to update UI
*/
private void restartUltrasoundTimer(String timer){
cancelUltrasoundTimer();
mTimer = new Timer(timer);
mTimerTask = new TimerTask() {
@Override
public void run() {
mHandler.sendEmptyMessageAtTime(1300, 50);
}
};
mTimer.schedule(mTimerTask, 50, 50);
}
使用 Runnable 和 Handler 来定时更新UI
Handler 部分不变,在开启的子线程中向Handler发送消息
onCreate 方法中启动子线程
Thread t = new Thread(new UpdateUIThread());
t.start();
class UpdateUIThread implements Runnable {
@Override
public void run() {
while (true) {
while (ultraStatus) {
Message message = new Message();
message.what = UPDATE_ULTRA_VALUE;// int
mHandler.sendMessage(message);
try {
Thread.sleep(100); // 暂停100ms,起到定时的效果
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
}
Android 上层应用读写设备节点的更多相关文章
- android 开发-自定义多节点进度条显示
看效果图: 里面的线段颜色和节点图标都是可以自定义的. main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...
- Android udev /dev 设备节点权限
/************************************************************************* * Android udev /dev 设备节点权 ...
- Android应用开发细节点
1.如果handler是在主线程声明,就属于主线程,handleMessage属于引用handler的那个线程:2.ByteArrayOutputStream/ByteArrayInputStream ...
- 通过Android studio手动触发Android 上层GC(垃圾回收)的方法
1.打开android Studio, 2.菜单栏中点击"View"--"Tools Window"--"Profiler",可以看到对应的 ...
- Android图形显示系统——上层显示1:界面绘制大纲
Android显示之应用界面绘制 越到上层,跟业务关联越直接.代码就越繁杂.Android上层显示的代码正是如此.此外,java语言本身繁复的特点(比C语言多了满屏的try-catch,比C++少了析 ...
- Android中G-Sensor相关流程
1.使G-sensor正常工作需要做的事: G-sensor driver文件包括: driver/i2c/chips/lis331dl.c driver/i2c/chips/sensorioctl. ...
- android sensor架构
Android Sensor 架构深入剖析 作者:倪键树,华清远见嵌入式学院讲师. 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 ...
- 【Android】Android输入子系统
成鹏致远 | lcw.cnblogs.com | 2013-10-25 Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linux输入子系统设备是基于平台 ...
- 【Android】Android输入子系统【转】
本文转载自:https://www.cnblogs.com/lcw/p/3506110.html Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linu ...
随机推荐
- vs2015未安装 Style 的 Visual Studio 语言支持
解决方案:在浏览器搜索下载安装Microsoft ASP.NET and Web Tools即可 下载地址:https://www.microsoft.com/en-us/download/confi ...
- [IR] BWT+MTF+AC
BWT (Burrows–Wheeler_transform)数据转换算法 MTF(Move-to-front transform)数据转换 基于统计的压缩算法:游程编码 良心PPT: bwt_bas ...
- UWP自定义RadioButton实现Tab底部导航
先看效果: 参照Android的实现方式用RadioButton来实现,但是Uwp的RadioButton并没有安卓的Selector选择器 下面是一个比较简单的实现,如果有同学有更好的实现,欢迎留言 ...
- yum安装phpmyadmin小问题
在CentOS6上面安装phpmyadmin前,加入repo: rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt ...
- RedHat6.2 x86手动配置LNMP环境
因为公司要求用RedHat配,顺便让我练习一下Linux里面的操作什么的. 折腾来折腾去终于搞好了,其实也没那么难嘛.但是也要记录一下. 首先,是在服务器里面用VMware搭建的RedHat6.2 x ...
- 【原创】源码角度分析Android的消息机制系列(三)——ThreadLocal的工作原理
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看Android源码(API24)中对ThreadLocal的定义: public class ThreadLocal<T> 即 ...
- textarea的中文输入判断与搜狗输入法的特殊行为
虽然要讲解的知识点是通用的,但是还是要介绍下我的应用场景和测试环境. 0.1 应用场景和测试环境 我的应用是一块使用Html Canvas开发的黑板,在黑板上实现简单的文字编辑功能. 操作系统:win ...
- ThinkPHP 整合 PHPExcel ,数据导出功能实现,解决Invalid cell coordinate
PHPExcel想必大家都不陌生,是用来操作Office Excel 文档的一个PHP类库,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格 本次只做数据导出功能的 ...
- thinkphp5.0学习笔记(四)数据库的操作
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.采用PDO ...
- LODOP之票据连续套打笔记<二>
接着上一篇博文,继续说说关于lodop,关于模板设计及相关的这里不多说了,上一篇博文最下面的推荐可以看看,说的很比较清楚,今天说说我在项目中运用套打实现分页预览和打印的, 之前弄lodop打印的时候发 ...