如何使用Java读取Android属性

13

我在终端中使用 '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代码中访问这些信息。

有什么想法吗?


你需要访问这个类 https://android.googlesource.com/platform/frameworks/base.git/+/android-cts-4.2_r1/core/java/android/os/SystemProperties.java - njzk2
5个回答

9

我整理了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();
            }
        }
    }
}

6

如果有人想知道我的解决方案……在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"作为参数传递?(或确切的属性?) - not2qubit

6

实际上,getprop 调用有一个系统级别的实现。它被称为 Systemproperties.get(),可以在这里找到。对于在AOSP内部工作的用户或愿意冒使用reflect风险的用户而言,这是一种可行的方法。


5

System.getProperties()方法并不能返回和getprop一样的属性。

如果要获取getprop的属性,可以尝试使用Runtime.exec()执行getprop命令,并读取其标准输出。


我知道如何进行迭代。我基本上正在寻找设备上包含杜比信息(如果有的话)的属性。从我所看到的情况来看,这不是System.getProperties()。 - TMont

4
使用反射获取系统属性时,可以尝试使用以下代码片段,并将所需的属性名称添加到其中。
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;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接