バックグラウンド
プライベートと見なされるものを含め、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でそれを行うことは可能ですか?