从 API 级别 33 开始,getPackageInfo(String, int)PackageManager 类的方法已被弃用。文档建议改为使用getPackageInfo(String, PackageInfoFlags)。但该功能仅适用于 API 级别 33。
我当前的代码:
val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
Run Code Online (Sandbox Code Playgroud)
现在应该是这样吗?
val pInfo = context.getPackageInfo()
@Suppress("DEPRECATION")
fun Context.getPackageInfo(): PackageInfo {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0))
} else {
packageManager.getPackageInfo(packageName, 0)
}
}
Run Code Online (Sandbox Code Playgroud) 我只是将我的应用程序升级compileSdkVersion为28(Pie).
我收到了编译警告:
警告:不推荐使用PackageInfo中的[deprecation] versionCode
警告来自此代码:
final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int versionCode = info.versionCode;
Run Code Online (Sandbox Code Playgroud)
我查看了文档,但它没有说明如何解决此问题或应该使用什么来代替不推荐使用的字段.
我正在编写一个 Flutter 插件,用于检查 Play Store 或 App Store 以查看应用程序是否需要更新。我正在使用该package_info包来确定用户拥有的应用程序版本。我的代码如下所示:
getVersionStatus() {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
localVersion = packageInfo.version;
...
}
Run Code Online (Sandbox Code Playgroud)
我想测试这个方法,但如果它作为单元测试运行它,fromPlatform调用就会挂起并超时测试。有没有比传testing入布尔值更优雅的方法来解决这个问题?IE:
if (testing) {
PackageInfo packageInfo = await PackageInfo.fromPlatform();
localVersion = packageInfo.version;
} else {
localVersion = '0.0.0'
}
Run Code Online (Sandbox Code Playgroud)
package_info包是否应该提供一种捕获错误的方法?有没有办法判断该方法是否正在由测试运行?
您可以使用PackageManager.getInstalledPackages获取已安装应用程序的列表。
而且,您可以通过以下方式访问每个应用程序的应用程序信息屏幕:
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:$appPackageName"))
startActivity(intent)
Run Code Online (Sandbox Code Playgroud)
例子:
事情是,我注意到(在有人告诉我之后)对于某些应用程序,您无法访问他们的应用程序信息屏幕。这些应用程序的此类包名示例:“com.google.android.ext.services”(“Android 服务库”)、“com.google.mainline.tememetry”(“支持组件”)、com.google.android .modulemetadata”(主要组件)。也许更多。
向谷歌报告后,我被告知:
com.google.android.ext.services 是主线模块,因此设置不提供详细的应用程序信息。
我试图查看 PackageInfo 和 ApplicationInfo 的各个领域和功能。
我找到了“isApex”,但它似乎总是错误的,并且文档根本无法帮助理解它是什么(“包是否是 APEX 包”)。编辑:如果我检查 API 30,它总是假的。在 API 29 上,它实际上有时设置为真。报到这里。
我还发现了一个名为 "coreApp" 的私有布尔字段(我可以通过反射访问),确实有时它是正确的,但并不总是如此,当它为真时,这意味着我无法访问它的应用程序信息屏幕。
这是获取它的代码:
fun isProbablyCoreApp(packageInfo: PackageInfo): Boolean {
return try {
val field = PackageInfo::class.java.getField("coreApp")
field.getBoolean(packageInfo)
} catch (e: Throwable) {
false
}
}
Run Code Online (Sandbox Code Playgroud)
我有这个包裹信息
/**
* Created by mflamant on 13/02/2017.
*/
@javax.xml.bind.annotation.XmlSchema(namespace = "namespace1", xmlns = {@XmlNs(prefix = "ns4", namespaceURI = "namespace1")}, elementFormDefault = XmlNsForm.QUALIFIED)
package com.cisco.adt.portal.data.model.API.Equipment;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
Run Code Online (Sandbox Code Playgroud)
但我想要 2 个命名空间,但我尝试这样做:
/**
* Created by mflamant on 13/02/2017.
*/
@javax.xml.bind.annotation.XmlSchema(namespace = "namespace1", xmlns = {@XmlNs(prefix = "ns4", namespaceURI = "namespace1")}, elementFormDefault = XmlNsForm.QUALIFIED)
@javax.xml.bind.annotation.XmlSchema(namespace = "namespace2", xmlns = {@XmlNs(prefix = "ns4", namespaceURI = "namespace2")}, elementFormDefault = XmlNsForm.QUALIFIED)
package com.cisco.adt.portal.data.model.API.Equipment;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
Run Code Online (Sandbox Code Playgroud)
但是我有一个错误:“重复注释”,这是否可能有 2 个命名空间?
谢谢你。
我正在使用以下代码实现代码以仅显示用户安装的应用程序(如 facebook)和一些更新的系统应用程序(如 Gmail、youtube 等)。但它也展示了一些其他应用程序。所以我的问题是删除这些类型的应用程序的方法是什么。
我的最终目标是显示应用程序列表,就像 Google Play 商店显示它们一样。
我已阅读这些解决方案: 获取已安装的 Android 应用程序列表
https://stacktips.com/tutorials/android/how-to-get-list-of-installed-apps-in-android
http://theopentutorials.com/tutorials/android/listview/how-to-get-list-of-installed-apps-in-android/
https://www.android-examples.com/get-list-installed-apps-package-name-icons/
https://inducesmile.com/android/android-list-installed-apps-in-device-programmatically/
packageManager = getPackageManager();
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);
List<PackageInfo> installedPackageInfo = new ArrayList<PackageInfo>();
for(PackageInfo pi: packageInfoList){
if(!isSystemPackage(pi)){
installedPackageInfo.add(pi);
}
}
Run Code Online (Sandbox Code Playgroud)
boolean isSystemPackage(PackageInfo pkgInfo){
if((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)!=0)
return false;
else if((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)!=0)
return true;
else if((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_INSTALLED)!=0)
return false;
else
return true;
}
Run Code Online (Sandbox Code Playgroud)
更新:我添加了显示一些不相关应用程序的图像。
我有一些旧的软件包,没有package-info.java。由于某种原因,我需要package-info.javas为他们创建任务,我发现任务真的很无聊,因为在Eclipse中没有捷径可以做到这一点。我必须手动使用该New > File过程创建文件,然后手动键入那些软件包名称。
Eclipse中是否有执行此任务的捷径?
我只想在创建新包时检查Create package.info.java复选框,如下所示
@ParametersAreNonnullByDefault
package net.pkg.main.foo;
import javax.annotation.ParametersAreNonnullByDefault;
Run Code Online (Sandbox Code Playgroud)
但现在它看起来像这样
/**
* @author myname
*
*/
package net.pkg.main.foo;
Run Code Online (Sandbox Code Playgroud)
我的问题:有没有办法在 eclipse 中编辑默认的 package-info 模板?
提前致谢 <3 <3。
如何在单独的package-info.java类上声明@TypeDefs并将其与@Type一起用于包级别。目前,我已经按照以下方式声明了它。但是,当我使用Maven编译应用程序时,它将出现以下错误。谢谢。
package-info.java类
@TypeDefs
({
@TypeDef(
name="encryptedString",
typeClass=EncryptedStringType.class,
parameters={
@Parameter(name="encryptorRegisteredName",
value="rcmHibernateStringEncryptor")
}
)
})
package com.core.model;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.hibernate.annotations.Parameter;
import org.jasypt.hibernate4.type.EncryptedStringType;
Run Code Online (Sandbox Code Playgroud)
Maven错误
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project MyApp: Compilation failure
[ERROR] com\core\model\package-infor.java:[2,0] error: package annotations should be in file package-info.java
Run Code Online (Sandbox Code Playgroud) 我们使用带有休眠数据库映射的 Spring Boot。实体包含映射为使用package-info.java文件定义的自定义类型的 JSON 列。
当我们从 Eclipse IDE 运行 spring-project 时,一切正常,我们可以调用我们的 Web 服务。
当我们生成一个可执行的 jar 并尝试调用我们的 Web 服务时,会引发以下错误:
mai 04, 2017 1:35:00 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Unable to execute job Test] with root cause
java.lang.NoClassDefFoundError: BOOT-INF/classes/com/test/package-info (wrong name: com/test/package-info)
at java.lang.ClassLoader.defineClass1(Native Method)
Run Code Online (Sandbox Code Playgroud)
文件 package-info.class 进入 jar BOOT-INF/classes/com/test/package-info 有什么问题?
谢谢你的帮助
package-info ×10
android ×4
java ×4
eclipse ×2
dart ×1
flutter ×1
hibernate ×1
jar ×1
maven ×1
namespaces ×1
orm ×1
package ×1
spring ×1
spring-boot ×1
templates ×1
unit-testing ×1
xml ×1