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 上层应用读写设备节点的更多相关文章

  1. android 开发-自定义多节点进度条显示

    看效果图: 里面的线段颜色和节点图标都是可以自定义的. main.xml <RelativeLayout xmlns:android="http://schemas.android.c ...

  2. Android udev /dev 设备节点权限

    /************************************************************************* * Android udev /dev 设备节点权 ...

  3. Android应用开发细节点

    1.如果handler是在主线程声明,就属于主线程,handleMessage属于引用handler的那个线程:2.ByteArrayOutputStream/ByteArrayInputStream ...

  4. 通过Android studio手动触发Android 上层GC(垃圾回收)的方法

    1.打开android Studio, 2.菜单栏中点击"View"--"Tools Window"--"Profiler",可以看到对应的 ...

  5. Android图形显示系统——上层显示1:界面绘制大纲

    Android显示之应用界面绘制 越到上层,跟业务关联越直接.代码就越繁杂.Android上层显示的代码正是如此.此外,java语言本身繁复的特点(比C语言多了满屏的try-catch,比C++少了析 ...

  6. Android中G-Sensor相关流程

    1.使G-sensor正常工作需要做的事: G-sensor driver文件包括: driver/i2c/chips/lis331dl.c driver/i2c/chips/sensorioctl. ...

  7. android sensor架构

    Android Sensor 架构深入剖析 作者:倪键树,华清远见嵌入式学院讲师. 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 ...

  8. 【Android】Android输入子系统

    成鹏致远 | lcw.cnblogs.com | 2013-10-25 Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linux输入子系统设备是基于平台 ...

  9. 【Android】Android输入子系统【转】

    本文转载自:https://www.cnblogs.com/lcw/p/3506110.html Linux输入子系统回顾 1:为什么要回顾linux输入子系统?这个问题后面自然就知道了 1.linu ...

随机推荐

  1. WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理--01

    兼容问题目录 1.IE6下怪异盒模型 2.IE6下最小高度问题 3.IE6下不支持1px的点线 4.IE6下内容会把父级的高度撑开 5.IE6下只支持给a标签添加伪类 6.IE67下不支持给块标签加d ...

  2. mac安装as配置

    /Users/admin/Library/Android/sdk export PATH=${PATH}:/Users/admin/Library/Android/sdk/tools:/Users/a ...

  3. 关于AD9516芯片的硬件设计和FPGA程序编写心得

    最近在做一个项目,其中有涉及时钟芯片AD9516的硬件设计和软件编程,有些使用心得,供大家参考讨论. AD9516,这是一个由ADI公司设计的14路输出时钟发生器,具有亚皮秒级抖动性能,还配有片内集成 ...

  4. Java经典编程题50道之四十一

    海滩上有若干个一堆桃子,五只猴子来分.第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份. 第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中, ...

  5. cpp(第十七章)

    1.baseic_ostream<charT,traits>& write(const char_type *s,streamsize n),cout.write()第一个参数提供 ...

  6. 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现

    上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...

  7. Android界面(1) 使用TextView实现跑马灯效果

    方法一:(只能实现单个TextView的跑马灯效果)在TextView添加以下控件 android:singleLine="true"只能单行,超出的文字显示为"...& ...

  8. 安装npm及cnpm(Windows)

    [工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https://npm.taobao.org/ [安装步骤] 一.安装node.js 1.前往node.js官网下载 ...

  9. Linux sort -g 的困惑

    sort命令是帮我们依据不同的数据类型进行排序,排序的效率很高,因此也是很常用的命令. sort参考及说明:https://www.gnu.org/software/coreutils/manual/ ...

  10. Java 9 揭秘(5. 实现服务)

    Tips做一个终身学习的人. Implementing Services 在这章中,主要介绍如下内容: 什么服务,服务接口,服务提供者: 在 JDK 9之前和在JDK 9中如何实现服务 如何使用Jav ...