在Android P中以有效方式获取android.os.SystemProperties

时间:2018-08-14 11:22:56

标签: android android-ndk

使用Android P时,已弃用Non SDK接口。 (链接:https://developer.android.com/about/versions/pie/restrictions-non-sdk-interfaces) 在我们的旧代码中,我们通过以下方式使用“ android.os.SystemProperties”

String countryCode = null;
        try
        {
            Class<?> cl;
            cl = Class.forName("android.os.SystemProperties");
           Method method = cl.getDeclaredMethod("get", String.class);
            countryCode = (String) method.invoke(null, "ro.csc.countryiso_code");
        return 
      }

由于我们无法再以这种方式使用它,所以我现在尝试通过以下方式获得相同的值,

String propertyValue = "";
    BufferedReader reader = null;
       Process process = Runtime.getRuntime().exec("getprop " + key);
       reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        propertyValue = reader.readLine().trim();

尽管这是一种标准方法,但它非常慢,如您所见,它正在创建一个新进程,然后运行shell命令getprop等。 我的问题是,有没有更好的方法来获取这些属性?

2 个答案:

答案 0 :(得分:0)

尝试在应用启动时将所有道具加载到/system/build.prop中的列表中。 并在此列表中搜索。 唯一需要担心的是权限问题和selinux。

答案 1 :(得分:0)

为什么需要使用反射?

您可以这样获取国家/地区ISO代码:

import android.telephony.TelephonyManager

val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
val iso = telephonyManager.simCountryIso

https://developer.android.com/reference/android/telephony/TelephonyManager#getSimCountryIso()

返回与SIM卡提供商的国家/地区代码等效的ISO-3166-1 alpha-2国家/地区代码。

ISO-3166-1 alpha-2国家/地区代码以小写2字符格式提供。