Google Confirms “Android Lollipop Day” for November 3rd

A little over a week ago, Google announced the latest iteration of … more

Get Your XDA 2015 Custom Avatar and Signature Images Here

As stated in our motto, XDA Developer is for developers, by developers. The … more

Pin Your Photos on Android Lollipop with Photo Pinner

In the last few weeks,we have been talking quite a bit about Android 5.0 Lollipop. This … more

Samsung Galaxy Note Edge Hands On – XDA TV

Perhaps one of the more peculiar announcements this year was the curved edge-screened … more
Post Reply

Access resources from the module itself

OP perseus0807

4th July 2014, 08:45 PM   |  #1  
OP Senior Member
Flag Pune
Thanks Meter: 54
 
128 posts
Join Date:Joined: Mar 2011
Donate to Me
More
Okay, so I have some resources in my module/app. Say, a Drawable. Unfortunately, when I try to use them (to create a UI, say) from within handleLoadPackage, well, I can't. I can access R.drawable.abc just fine; but for some reason, all I get is a strange white rectangle instead of the actual Drawable.

How do I work around this issue? Thank you!
4th July 2014, 10:23 PM   |  #2  
GermainZ's Avatar
Forum Moderator / Recognized Developer / XDA Portal Team
Thanks Meter: 6,737
 
5,686 posts
Join Date:Joined: Aug 2012
Donate to Me
More
This is because your hook is not really part of your app - it runs in the hooked app. To access your own resources, you need to create a context for your app first.

You're going to need a general context first. If you can't get any from the class you're hooking, you can try AndroidAppHelper.currentApplication(). Then, use that context to create a context for your own app (see Context.createContext(...)). You can then access your resources using that context.
5th July 2014, 08:02 AM   |  #3  
OP Senior Member
Flag Pune
Thanks Meter: 54
 
128 posts
Join Date:Joined: Mar 2011
Donate to Me
More
Quote:
Originally Posted by GermainZ

This is because your hook is not really part of your app - it runs in the hooked app. To access your own resources, you need to create a context for your app first.

You're going to need a general context first. If you can't get any from the class you're hooking, you can try AndroidAppHelper.currentApplication(). Then, use that context to create a context for your own app (see Context.createContext(...)). You can then access your resources using that context.

I tried this:

Code:
Context c = tv.getContext().createPackageContext("package.name", Context.CONTEXT_IGNORE_SECURITY);
int resId = c.getResources().getIdentifier("ic_launcher", "drawable", "package.name");
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, resId);
No dice. I'm sure using c.getResources.getDrawable would work, but my dialog method requires the ID, not the Drawable itself.
5th July 2014, 09:54 AM   |  #4  
rovo89's Avatar
Senior Recognized Developer
Thanks Meter: 14,475
 
2,371 posts
Join Date:Joined: Jan 2012
More
Quote:
Originally Posted by perseus0807

I tried this:

Code:
Context c = tv.getContext().createPackageContext("package.name", Context.CONTEXT_IGNORE_SECURITY);
int resId = c.getResources().getIdentifier("ic_launcher", "drawable", "package.name");
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, resId);
No dice. I'm sure using c.getResources.getDrawable would work, but my dialog method requires the ID, not the Drawable itself.

Yeah, but that resource ID will always be resolved using the target app's resources. If you can't use the the drawable directly, you can try this:
Code:
private static String MODULE_PATH = null;
private int mFakeId = 0;

public void initZygote(StartupParam startupParam) throws Throwable {
	MODULE_PATH = startupParam.modulePath;
}

public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable {
	if (!resparam.packageName.equals("your.target.app"))
		return;

	XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
	mFakeId = resparam.res.addResource(modRes, R.drawable.ic_launcher);
}
Then use mFakeId in your callback, which should run after the resources have been initialized. addResource() generates an ID for you an sets up a resource replacement for that non-existent ID to the item in your own resources.
The Following User Says Thank You to rovo89 For This Useful Post: [ View ]
5th July 2014, 10:09 AM   |  #5  
OP Senior Member
Flag Pune
Thanks Meter: 54
 
128 posts
Join Date:Joined: Mar 2011
Donate to Me
More
Quote:
Originally Posted by rovo89

Yeah, but that resource ID will always be resolved using the target app's resources. If you can't use the the drawable directly, you can try this:

Code:
private static String MODULE_PATH = null;
private int mFakeId = 0;

public void initZygote(StartupParam startupParam) throws Throwable {
	MODULE_PATH = startupParam.modulePath;
}

public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable {
	if (!resparam.packageName.equals("your.target.app"))
		return;

	XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
	mFakeId = resparam.res.addResource(modRes, R.drawable.ic_launcher);
}
Then use mFakeId in your callback, which should run after the resources have been initialized. addResource() generates an ID for you an sets up a resource replacement for that non-existent ID to the item in your own resources.

This works, thank you so much! Bit stupid of me, I should have inferred this from the tutorial.
5th July 2014, 10:18 AM   |  #6  
GermainZ's Avatar
Forum Moderator / Recognized Developer / XDA Portal Team
Thanks Meter: 6,737
 
5,686 posts
Join Date:Joined: Aug 2012
Donate to Me
More
Quote:
Originally Posted by perseus0807

I tried this:

Code:
Context c = tv.getContext().createPackageContext("package.name", Context.CONTEXT_IGNORE_SECURITY);
int resId = c.getResources().getIdentifier("ic_launcher", "drawable", "package.name");
dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, resId);
No dice. I'm sure using c.getResources.getDrawable would work, but my dialog method requires the ID, not the Drawable itself.

To add to what rovo said, you could've use getDrawable() instead of getIdentifier() here, which would've given you Drawable (that you can then use) instead of a resource ID that won't work in the hooked app.
Post Reply Subscribe to Thread

Tags
drawable, resource, resources, xposed
Previous Thread Next Thread
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes


Top Threads in Xposed General by ThreadRank