8

バックグラウンド

プライベートと見なされるものを含め、Android OS のすべての文字列 (すべてを含む) をプログラムで取得したいと考えています。

たとえば、ここにあるように、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;
    }

過去に、システム自体を含め、他のアプリのさまざまなリソースを一覧表示できるアプリをいくつか見てきました (例はこちら)。

後で、必要なアプリから文字列を取得する方法を見つけましたが、識別子の名前を知っていることを前提としており、それらをリストすることはできません。

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」(キーは「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 に答える