I have a pair of Android apps. One is a free 'reader' app and the other is a paid for 'Data' app with a text file in a sub directory of its assets.
The reader app uses the following code to access the data app's text file:
Intent myIntent = new Intent("myintent");
List<ResolveInfo> dataPacks = packageManager.queryIntentActivities(myIntent, 0);
String packageName = dataPacks.get(0).activityInfo.packageName
Resources res = packageManager.getResourcesForApplication(packageName);
AssetManager assets = res.getAssets();
String[] dataFiles = assets.list("Data");
This has been working fine but apps downloaded to Jelly Bean using Google Play are not working (datafiles is empty). If the app is installed directly from email it is fine so I suspect my problem is related to the recent security changes to Google Play. However, these have allegedly been undone but I am still having problems.
Can anybody shed light on what is going wrong? (unfortunately I dont have a Jelly Bean device)
Alternatively, can somebody suggest a better mechanism for accessing the data app's txt file?
Thanks
Paid apps on JB devices are 'forward locked'. This means that the APK is split in two parts -- one with public resources, and one with private ones and code, which is not readable by other apps. Some details here: http://nelenkov.blogspot.com/2012/07/using-app-encryption-in-jelly-bean.html
I haven't looked into how files are split in detail, but the problem you are seeing suggests that assets are part of the private APK, which makes sense, since you typically stick API keys, etc in assets.
So you need to use a more indirect method to share info between the two apps such as a ContentProvider or remote service. Make sure you require signature permissions to access those, to make sure only your own apps can use them.
来源:https://stackoverflow.com/questions/12716607/accessing-assets-of-other-android-app-on-jelly-bean