当前位置:   article > 正文

Android 上层应用读写设备节点

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)

  1. public static final String PRODUCT = getString("ro.product.name");
  2. ......
  3. private static String getString(String property) {
  4. return SystemProperties.get(property, UNKNOWN);
  5. }

跳转到 SystemProperties.java (frameworks\base\core\java\android\os) 这个类不开放

  1. // 调用 native_get ,获取节点;可以设定默认值
  2. public static String get(String key, String def) {
  3. if (key.length() > PROP_NAME_MAX) {
  4. throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
  5. }
  6. return native_get(key, def);
  7. }

3. 应用层读写节点

应用层中,一般都能够读取设备节点。对于写节点这个操作,需要更高的root权限。

读取设备节点

例如给设备新添加了节点,路径是 /sys/class/demo/version
可以adb shell进入机器,然后 cat /sys/class/demo/version;即可获得信息

也可以写成一个方法,如下:

  1. /**
  2. * 获取节点
  3. */
  4. private static String getString(String path) {
  5. String prop = "waiting";// 默认值
  6. try {
  7. BufferedReader reader = new BufferedReader(new FileReader(path));
  8. prop = reader.readLine();
  9. } catch (IOException e) {
  10. e.printStackTrace();
  11. }
  12. return prop;
  13. }

调用方法就是:

    getString("/sys/class/demo/version")

写设备节点

这里写节点的方法需要更高的权限,apk要放到源码中进行编译;
源码中编译apk的方法如同添加第三方apk的方法
AndroidManifest中添加:

        android:sharedUserId="android.uid.system"

写节点的代码

  1. private static final String WAKE_PATH = "/sys/class/demo/wake";
  2. ......
  3. try {
  4. BufferedWriter bufWriter = null;
  5. bufWriter = new BufferedWriter(new FileWriter(WAKE_PATH));
  6. bufWriter.write("1"); // 写操作
  7. bufWriter.close();
  8. Toast.makeText(getApplicationContext(),
  9. "功能已激活",Toast.LENGTH_SHORT).show();
  10. Log.d(TAG,"功能已激活 angle " + getString(ANGLE_PATH));
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. Log.e(TAG,"can't write the " + WAKE_PATH);
  14. }

经过源码mm编译后,push到设备中可以查看效果

定时读取设备节点

需要被更新的View记得调用invalidate()方法

使用定时器与Handler来定时读取节点,并更新UI

重启定时器和取消定时器都封装成方法,便于调用

  1. Timer mTimer;
  2. TimerTask mTimerTask;
  3. SensorHandler mHandler = new SensorHandler(this);
  4. /**
  5. * Handler : update value
  6. */
  7. static class SensorHandler extends Handler {
  8. MainActivity mainActivity;
  9. SensorHandler(MainActivity activity) {
  10. mainActivity = activity;
  11. }
  12. @Override
  13. public void handleMessage(Message msg) {
  14. mainActivity.ultrasoundValue.setText(getString(ULTRASOUND_VALUE_PATH));
  15. }
  16. }
  17. ......
  18. /**
  19. * cancel timer and timer task
  20. */
  21. private void cancelUltrasoundTimer(){
  22. if (mTimer != null) {
  23. mTimer.cancel();
  24. mTimer = null;
  25. }
  26. if (mTimerTask != null){
  27. mTimerTask.cancel();
  28. mTimerTask = null;
  29. }
  30. }
  31. /**
  32. * restart timer to update UI
  33. */
  34. private void restartUltrasoundTimer(String timer){
  35. cancelUltrasoundTimer();
  36. mTimer = new Timer(timer);
  37. mTimerTask = new TimerTask() {
  38. @Override
  39. public void run() {
  40. mHandler.sendEmptyMessageAtTime(1300, 50);
  41. }
  42. };
  43. mTimer.schedule(mTimerTask, 50, 50);
  44. }
使用 Runnable 和 Handler 来定时更新UI

Handler 部分不变,在开启的子线程中向Handler发送消息
onCreate 方法中启动子线程

  1. Thread t = new Thread(new UpdateUIThread());
  2. t.start();
  1. class UpdateUIThread implements Runnable {
  2. @Override
  3. public void run() {
  4. while (true) {
  5. while (ultraStatus) {
  6. Message message = new Message();
  7. message.what = UPDATE_ULTRA_VALUE;// int
  8. mHandler.sendMessage(message);
  9. try {
  10. Thread.sleep(100); // 暂停100ms,起到定时的效果
  11. } catch (InterruptedException e) {
  12. Thread.currentThread().interrupt();
  13. }
  14. }
  15. }
  16. }
  17. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/301870
推荐阅读
相关标签
  

闽ICP备14008679号