【问题标题】:Getting android.os.SystemProperties in effecient way in Android P在 Android P 中以有效的方式获取 android.os.SystemProperties
【发布时间】:2018-08-14 11:22:56
【问题描述】:

对于 Android P,非 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 等等。 我的问题是,有没有更好的方法来获取这些属性?

【问题讨论】:

    标签: android android-ndk


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      为什么需要使用反射?

      您可以像这样获取国家/地区 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 字符格式提供。

      【讨论】:

      • 您可以将您的手机带到另一个国家/地区,然后这可能不会给出正确的结果。我想要由任一制造商设置的信息。基本上是区域明智的 SKU。
      猜你喜欢
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 2019-05-20
      • 1970-01-01
      相关资源
      最近更新 更多