8

背景

我想以编程方式获取 Android 操作系统的所有字符串(包括所有字符串),包括那些被认为是私有的字符串。

例如,我想获得 packageManager 应用程序的那些,如此所示。

问题

使用 android.R.string 只返回一小部分字符串。

我试过的

我找到了这个链接,它显示了下一个代码,但我不确定要在参数中添加什么:

private String GetAttributeStringValue(Context context, AttributeSet attrs, String namespace, String name, String defaultValue) 
    {
        //Get a reference to the Resources
        Resources res = context.getResources();
        //Obtain a  String from the attribute
        String stringValue = attrs.getAttributeValue(namespace, name);
        //If the String is null 
        if(stringValue == null)
        {
            //set the return String to the default value, passed as a parameter
            stringValue = defaultValue;
        }
        //The String isn't null, so check if it starts with '@' and contains '@string/'
        else if( stringValue.length() > 1 && 
                 stringValue.charAt(0) == '@' && 
                 stringValue.contains("@string/") ) 
        {
            //Get the integer identifier to the String resource
            final int id = res.getIdentifier(context.getPackageName() + ":" + stringValue.substring(1), null, null);
            //Decode the string from the obtained resource ID
            stringValue = res.getString(id);
        } 
        //Return the string value
        return stringValue;
    }

过去我见过一些应用程序可以列出其他应用程序的各种资源,包括系统本身的资源(示例here)。

后来我发现了如何从您希望的任何应用程序中获取字符串,但它假设您知道标识符的名称,并且不让您列出它们:

fun getStringFromApp(context: Context, packageName: String, resourceIdStr: String, vararg formatArgs: Any): String? {
    try {
        val resources = context.packageManager.getResourcesForApplication(packageName)
        val stringResId = resources.getIdentifier(resourceIdStr, "string", packageName)
        if (stringResId == 0)
            return null
        return resources.getString(stringResId, *formatArgs)
    } catch (e: Exception) {
        return null
    }
}

例如,如果要获取“more”的字符串(key为“more_item_label”),可以使用:

val moreString = getStringFromApp(this,"android", "more_item_label")

问题

这样的事情可能吗?如果没有,是否可以使用root来完成?

4

1 回答 1

1

您的链接显示如何从首选项屏幕获取资源并说:

 The goal of this example was to show how to obtain the correct String resource outside the Android XML namespace

链接描述了您可以通过其他方式获取资源,而不仅仅是通过 R.string。

我使用另一个自定义命名空间和自定义按钮标签创建了一个演示项目,但不幸的是我无法将字符串资源从一个项目显示到另一个项目。

于 2013-03-26T11:52:34.627 回答