【问题标题】:How to read Android properties with Java如何使用 Java 读取 Android 属性
【发布时间】:2015-01-26 20:28:10
【问题描述】:

我在终端中使用“adb shell getprop”。 我可以在 Android JAVA 中使用哪些接口来获取相同的信息?

我尝试了几种方法,例如:

Properties sysProps = System.getProperties();

但我不认为这些是我正在寻找的相同属性?具体来说,我想找到将返回类似于以下内容的值:

adb shell getprop | grep dolby

shell 'grep dolby' 命令返回:

[audio.dolby.ds2.enabled]: [true] 
[dolby.audio.sink.info]: [headset] 
[dolby.ds.dialogenhancer.state]: [on] 
[dolby.ds.graphiceq.state]: [off] 
[dolby.ds.hpvirtualizer.state]: [off] 
[dolby.ds.intelligenteq.preset]: [Off] 
[dolby.ds.intelligenteq.state]: [off] 
[dolby.ds.platform]: [qcom] 
[dolby.ds.profile.name]: [Movie] 
[dolby.ds.spkvirtualizer.state]: [off] 
[dolby.ds.state]: [off] 
[dolby.ds.volumeleveler.state]: [on] 

但我想在 Android JAVA 代码中访问这些信息。

有什么想法吗?

【问题讨论】:

标签: java android shell adb getproperties


【解决方案1】:

我清理了 TMont 的解决方案并使其更通用(为 propertyName 添加了参数):

import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class SystemProperties {

    private static String GETPROP_EXECUTABLE_PATH = "/system/bin/getprop";
    private static String TAG = "MyApp";

    public static String read(String propName) {
        Process process = null;
        BufferedReader bufferedReader = null;

        try {
            process = new ProcessBuilder().command(GETPROP_EXECUTABLE_PATH, propName).redirectErrorStream(true).start();
            bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = bufferedReader.readLine();
            if (line == null){
                line = ""; //prop not set
            }
            Log.i(TAG,"read System Property: " + propName + "=" + line);
            return line;
        } catch (Exception e) {
            Log.e(TAG,"Failed to read System Property " + propName,e);
            return "";
        } finally{
            if (bufferedReader != null){
                try {
                    bufferedReader.close();
                } catch (IOException e) {}
            }
            if (process != null){
                process.destroy();
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    如果有人想知道我的解决方案……在 George 的帮助下,我最终使用了这个:

    private String propReader() {
            Process process = null;
            try {
                process = new ProcessBuilder().command("/system/bin/getprop")
                        .redirectErrorStream(true).start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            InputStream in = process.getInputStream();
    
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    
            StringBuilder log = new StringBuilder();
            String line;
            try {
                while ((line = bufferedReader.readLine()) != null) {
                    if (line.contains("dolby"))
                        log.append(line + "\n");
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            System.out.println(in);
    
            process.destroy();
            return log.toString();
        }
    

    【讨论】:

    • 您将如何修改它以将“dolby”作为参数传递? (或确切的道​​具?)
    【解决方案3】:

    System.getProperties() 确实返回与 getprop 相同的属性。

    要获取 getprop 属性,请尝试使用 Runtime.exec() 执行 getprop 并读取其标准输出。

    【讨论】:

    • 我知道如何迭代。我基本上是在设备上寻找包含杜比信息(如果可用)的属性。从我所见,它不是 System.getProperties()。
    【解决方案4】:

    实际上有一个getprop 调用的系统端实现。它被称为Systemproperties.get(),可以找到here。对于在 AOSP 内处理系统代码或确实想冒险使用reflect 的用户,这是要走的路。

    【讨论】:

      【解决方案5】:

      要使用反射获取系统属性,请尝试以下代码 sn-p 与您所需的属性名称。

      public String getSerialNumber() {
              String serialNumber;
      
              try {
                  Class<?> c = Class.forName("android.os.SystemProperties");
                  Method get = c.getMethod("get", String.class);
      
                  serialNumber = (String) get.invoke(c, "ril.serialnumber");
      
                  if (serialNumber.equals(""))
                      serialNumber = (String) get.invoke(c, "ro.serialno");
                  if (serialNumber.equals(""))
                      serialNumber = (String) get.invoke(c, "ro.boot.serialno");
                  if (serialNumber.equals(""))
                      serialNumber = (String) get.invoke(c, "ro.kernel.androidboot.serialno");
                  // If none of the methods above worked
                  if (serialNumber.equals("")) {
                      serialNumber = Build.SERIAL;
                  }
              } catch (Exception e) {
                  e.printStackTrace();
                  serialNumber = "";
              }
      
              return serialNumber;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多