欢乐狗 发表于 7 天前

Android Studio 获取设置资源与第三方包信息详解

https://i-blog.csdnimg.cn/direct/1901560fc4d74de78b45ba8d3e847b76.png


https://i-blog.csdnimg.cn/direct/b1da13e6583b4b13a481051aa3d379ae.png
Android Studio 获取设置资源与第三方包信息详解

在 Android 开发中,我们经常须要从资源文件中获取颜色、字符串、数值等设置信息,以及获取应用的包信息和第三方依靠信息。下面详细介绍这些操作的方法。
一、获取资源文件中的设置

1. 获取颜色值

res/values/colors.xml 中界说:
<color name="colorPrimary">#3F51B5</color>
<color name="colorAccent">#FF4081</color>
获取方法:
Java 中获取:

// 获取颜色值(int类型,包含alpha通道)
int color = getResources().getColor(R.color.colorPrimary, getTheme());

// 兼容旧版本
int color = ContextCompat.getColor(context, R.color.colorPrimary);
Kotlin 中获取:

// 直接扩展函数方式
val color = ContextCompat.getColor(context, R.color.colorPrimary)

// 或使用资源扩展
val color = context.getColor(R.color.colorPrimary)
2. 获取字符串

res/values/strings.xml 中界说:
<string name="app_name">MyApplication</string>
<string name="welcome_message">Hello, %s!</string>
获取方法:
Java 中获取:

// 获取普通字符串
String appName = getResources().getString(R.string.app_name);

// 获取带参数的字符串
String welcomeMsg = getResources().getString(R.string.welcome_message, "John");
Kotlin 中获取:

// 获取普通字符串
val appName = resources.getString(R.string.app_name)

// 获取带参数的字符串
val welcomeMsg = getString(R.string.welcome_message, "John")
3. 获取尺寸值

res/values/dimens.xml 中界说:
<dimen name="padding_medium">16dp</dimen>
获取方法:
Java 中获取:

// 获取像素值(会自动将dp/sp转换为px)
float padding = getResources().getDimension(R.dimen.padding_medium);

// 获取精确像素值(不进行四舍五入)
float paddingExact = getResources().getDimensionPixelSize(R.dimen.padding_medium);
Kotlin 中获取:

val padding = resources.getDimension(R.dimen.padding_medium)
val paddingExact = resources.getDimensionPixelSize(R.dimen.padding_medium)
4. 获取整型/布尔值

res/values/integers.xml 中界说:
<integer name="max_count">10</integer>
<bool name="is_debug">true</bool>
获取方法:
Java 中获取:

int maxCount = getResources().getInteger(R.integer.max_count);
boolean isDebug = getResources().getBoolean(R.bool.is_debug);
Kotlin 中获取:

val maxCount = resources.getInteger(R.integer.max_count)
val isDebug = resources.getBoolean(R.bool.is_debug)
5. 获取数组

res/values/arrays.xml 中界说:
<string-array name="planets_array">
    <item>Mercury</item>
    <item>Venus</item>
    <item>Earth</item>
</string-array>

<integer-array name="numbers_array">
    <item>1</item>
    <item>2</item>
    <item>3</item>
</integer-array>
获取方法:
Java 中获取:

String[] planets = getResources().getStringArray(R.array.planets_array);
int[] numbers = getResources().getIntArray(R.array.numbers_array);
Kotlin 中获取:

val planets = resources.getStringArray(R.array.planets_array)
val numbers = resources.getIntArray(R.array.numbers_array)
二、获取应用包信息

https://i-blog.csdnimg.cn/direct/2c8eb7121fdf41e1b14395d007f047ef.png
1. 获取当前应用信息

Java/Kotlin 通用方法:

// 获取包信息
PackageManager pm = context.getPackageManager();
String packageName = context.getPackageName();

try {
    PackageInfo packageInfo = pm.getPackageInfo(packageName, 0);
   
    // 应用版本信息
    String versionName = packageInfo.versionName;
    int versionCode = packageInfo.versionCode; // 注意: 新API中使用long类型的versionCode
   
    // 应用名称
    String appName = pm.getApplicationLabel(packageInfo.applicationInfo).toString();
   
    // 应用图标
    Drawable appIcon = pm.getApplicationIcon(packageName);
   
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
Kotlin 简化版:

val pm = context.packageManager
val packageName = context.packageName

try {
    val packageInfo = pm.getPackageInfo(packageName, 0)
   
    val versionName = packageInfo.versionName
    val versionCode = packageInfo.longVersionCode // 注意使用longVersionCode
   
    val appName = pm.getApplicationLabel(packageInfo.applicationInfo).toString()
    val appIcon = pm.getApplicationIcon(packageName)
   
} catch (e: PackageManager.NameNotFoundException) {
    e.printStackTrace()
}
2. 获取其他应用信息

// 检查应用是否安装
boolean isAppInstalled = isPackageInstalled("com.example.app", context);

public static boolean isPackageInstalled(String packageName, Context context) {
    try {
      context.getPackageManager().getPackageInfo(packageName, 0);
      return true;
    } catch (PackageManager.NameNotFoundException e) {
      return false;
    }
}

// 获取已安装应用列表
List<ApplicationInfo> apps = context.getPackageManager().getInstalledApplications(0);
for (ApplicationInfo appInfo : apps) {
    String appName = appInfo.loadLabel(context.getPackageManager()).toString();
    String packageName = appInfo.packageName;
    Drawable icon = appInfo.loadIcon(context.getPackageManager());
    // 处理应用信息...
}
三、获取第三方依靠包信息

https://i-blog.csdnimg.cn/direct/09d99bf5f85943df9c7c5cd09fb2ddde.png
1. 使用 BuildConfig 获取依靠版本

Gradle 会自动为每个依靠库生成 BuildConfig 类,可以获取版本信息:
// 获取Gson库版本
String gsonVersion = com.google.gson.BuildConfig.VERSION_NAME;

// 获取Glide库版本
String glideVersion = com.bumptech.glide.BuildConfig.VERSION_NAME;
2. 通过 PackageManager 获取依靠信息

// 获取所有已安装包信息
List<PackageInfo> packages = getPackageManager().getInstalledPackages(0);

for (PackageInfo packageInfo : packages) {
    if (packageInfo.packageName.startsWith("com.google.") ||
      packageInfo.packageName.startsWith("com.facebook.")) {
      // 这是Google或Facebook的库
      String packageName = packageInfo.packageName;
      String versionName = packageInfo.versionName;
      int versionCode = packageInfo.versionCode;
    }
}
3. 使用反射获取内部信息(不推荐,仅作了解)

try {
    Class<?> clazz = Class.forName("com.some.library.internal.Version");
    Field versionField = clazz.getField("VERSION");
    String version = (String) versionField.get(null);
} catch (Exception e) {
    e.printStackTrace();
}
四、动态获取资源ID

https://i-blog.csdnimg.cn/direct/fdeaacb628464d1ba4248938cd5daa9a.png
有时我们须要根据资源名称动态获取资源ID:
// 获取资源ID
public static int getResourceId(Context context, String resourceName, String type) {
    return context.getResources().getIdentifier(resourceName, type, context.getPackageName());
}

// 使用示例
int colorId = getResourceId(context, "colorPrimary", "color");
int stringId = getResourceId(context, "app_name", "string");
int drawableId = getResourceId(context, "ic_launcher", "drawable");
五、主题属性获取

https://i-blog.csdnimg.cn/direct/95a310746510472ea667b93b55e7918b.png
从当前主题获取属性值:
// 创建一个TypedArray
TypedArray typedArray = context.getTheme().obtainStyledAttributes(new int[]{R.attr.colorPrimary});

try {
    // 获取颜色值
    int colorPrimary = typedArray.getColor(0, Color.BLACK);
} finally {
    typedArray.recycle();
}
六、多语言资源获取

获取特定语言环境的资源:
// 创建特定Locale的Configuration
Configuration config = new Configuration(resources.getConfiguration());
config.setLocale(new Locale("es")); // 西班牙语

// 创建新的Context
Context localizedContext = context.createConfigurationContext(config);

// 使用新Context获取资源
String localizedString = localizedContext.getResources().getString(R.string.welcome_message);
最佳实践建议


[*] 资源获取优化:

[*]制止在循环中频仍获取资源
[*]在Activity/Fragment生命周期早期获取常用资源并缓存

[*] 空值处理:

[*]总是检查资源是否存在
[*]为getString()等方法提供默认值

[*] 性能考虑:

[*]使用ContextCompat等兼容类确保向后兼容
[*]注意TypedArray使用后必须recycle()

[*] 安全性:

[*]处理获取其他应用信息时的权限题目
[*]不要袒露敏感信息在BuildConfig中

[*] 资源命名规范:

[*]使用一致的命名约定(如colorPrimary, text_heading等)
[*]制止硬编码资源ID

通过以上方法,可以灵活地从Android应用的设置文件中获取各种资源,并获取应用及第三方库的包信息,为应用开发提供更多可能性。
https://i-blog.csdnimg.cn/direct/8e1048db455e4f5cb4b2836c6f913934.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Android Studio 获取设置资源与第三方包信息详解