XDA Xposed Tuesday: Modify the Look of Your Volume Control – XDA TV

How many screenshots have you seen with a volume status bar in the … more

Prepare Your Nokia X2 for Battle with Nokia X2 Tools

Unveiled in June this year, the Nokia X2 is the Finnish companys second crack at an … more

Increase the Speaker Volume of Your Samsung Gear 2 with Tool and Tutorial

I think its pretty safe to say that any sound coming out of a … more

Unlock Hidden Camera Settings on Your Moto G

At one point in time or another, weve all gotten very fiddly with the camera settings on our … more
Post Reply

Access resources from the module itself

4th July 2014, 08:45 PM   |  #1  
OP Senior Member
Flag Pune
Thanks Meter: 53
 
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
Thanks Meter: 6,515
 
5,548 posts
Join Date:Joined: Aug 2012
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: 53
 
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,152
 
2,367 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: 53
 
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
Thanks Meter: 6,515
 
5,548 posts
Join Date:Joined: Aug 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.

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