我创建了一个图书馆项目,我将其导入另一个项目。 在某个图书馆项目中我检索它的android:versionName 为此,您需要提供包名称。 当库项目包含在另一个项目中时执行该代码时出现问题,那么该代码似乎抛出异常: 10-04 10:15:36.987:WARN / System.err(1407):getSoftwareVersion(),Caught Exception:android.content.pm.PackageManager $ NameNotFoundException:mobilaria.android.LandenPlayerCodeBase.baseplayer
这就是项目库包的包名......似乎找不到它,即使执行该调用的相同代码是库本身的一部分......
有没有人经历过这样的事情或对如何解决这个问题有所了解?
答案 0 :(得分:2)
据我所知,目前忽略了android库项目清单,当你引用库时,manifest没有合并到end应用程序中。因此,您无法从库的清单中提取任何数据。
答案 1 :(得分:1)
我刚试过类似的东西。 我试图将方法getLibraryVersion()添加到我的自定义Application类。所以我可以打电话给
MyLibrary.getLibraryVersion()
从包含该库的代码中。但似乎您无法通过getText()
或getString()
访问字符串资源,如下所示:
public class MyLibrary extends Application {
@Override
public void onCreate() {
super.onCreate();
// provide an instance for our static accessors
MyLibrary.instance = this;
}
private static void checkInstance() {
if (MyLibrary.instance == null) {
throw new IllegalStateException("Application not created yet!");
}
}
/**
* @return the library name
*/
public String getLibraryName() {
MyLibrary.checkInstance();
return MyLibrary.instance.getString(R.string.app_project_name).toString();
}
...
}
因为似乎没有调用onCreate()方法,所以实例始终为null!
由于这种方式无法解决,并且如您所见,您无法以您尝试的方式访问该版本,我只是将版本和库名称硬编码到我的自定义应用程序类中:
public class MyLibrary extends Application {
/**
* @return the library name
*/
public String getLibraryName() {
return "org.yourCompany.android.lib.YourLibName";
}
/**
* @return the library version
*/
public String getLibraryVersion() {
return "1.0.0";
}
}
我知道这是一种肮脏的解决方案,我更喜欢更简洁的编码版本,这些字符串存储为strings.xml中的String资源,但我不知道更好的方法。因此,您只需更改清单中的库名称和版本,或者更好地更改应用程序类中的strings.xml和。
但是您多久更改一次库名称或版本? 希望这可以帮助别人并节省时间!
PS:上面的一些代码基于此: http://blog.tomgibara.com/post/126377651/global-application-state-in-android