我尝试部署我的应用程序,有时会收到此错误:
Failure
[INSTALL_FAILED_CONTAINER_ERROR]
Run Code Online (Sandbox Code Playgroud)
我试图谷歌它,但没有找到错误的含义或它是由什么引起的.我通过IDE(IntelliJ)部署文件被复制到设备到/ data/local/tmp(无根的Huawei Ideos,运行2.2),但包管理器似乎不喜欢它.在安装apk之前,我已经预先从设备中删除了应用程序.我还确保设备上的/ data/local/tmp下没有旧文件.我现在仍然收到这个错误.应该使用调试密钥对包进行签名,因为我通过'运行'应用程序来部署IDE.
$ pwd
/data/local/tmp
$ ls -l
-rw-rw-rw- shell shell 17257686 2011-04-21 20:31
com.company.shop
$ pm install -r com.company.shop
pkg: com.company.shop
Failure [INSTALL_FAILED_CONTAINER_ERROR]
Run Code Online (Sandbox Code Playgroud)
它是什么意思以及如何解决它?
编辑/更新:
不允许在sdcard上安装应用程序时,我可以避免错误设置
android:installLocation="internalOnly"
Run Code Online (Sandbox Code Playgroud)
在清单中.它可以用于开发,但对于生产而言,它并不是我想要的 - 因为我的应用程序相当大,只有17mb; 因此我更喜欢它在SD卡上.如何以往任何时候都能够在外部存储器安装不生根(因为这是我可以删除/mnt/secure/asec/smdl2tmp1.asec的唯一途径,这似乎是一个解决方案,以及).
我们假设这是包名:
package com.company.name.我该如何改变company?
PS我看到了如何改变name但没有改变company.我正在使用Android Studio.
我以编程方式使用下面的代码隐藏应用程序图标
try{
PackageManager p = getPackageManager();
p.setComponentEnabledSetting(getComponentName(), PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
现在我想以编程方式显示图标
我的应用程序(在此处)可以在整个文件系统(不仅是已安装的应用程序)中搜索APK文件,显示有关每个文件的信息,允许删除,共享,安装...
作为Android Q范围内存储功能的一部分,Google宣布SAF(存储访问框架)将取代常规存储权限。这意味着,即使您尝试使用存储权限,也只会授予访问特定类型的文件的权限,以使File和file-path可以使用或完全沙箱化(在此处撰写)。
这意味着许多框架将需要依赖SAF而不是File和file-path。
其中之一是packageManager.getPackageArchiveInfo,它给出了文件路径,返回 PackageInfo,我可以得到有关以下内容的各种信息:
packageInfo.applicationInfo.loadLabel(packageManager)。这基于设备的当前配置(语言环境等)。packageInfo.packageNamepackageInfo.versionCode或packageInfo.longVersionCode。packageInfo.versionName一种。 BitmapFactory.decodeResource(packageManager.getResourcesForApplication(applicationInfo),packageInfo.applicationInfo.icon, bitmapOptions)
b。如果已安装,AppCompatResources.getDrawable(createPackageContext(packageInfo.packageName, 0), packageInfo.applicationInfo.icon )
C。 ResourcesCompat.getDrawable(packageManager.getResourcesForApplication(applicationInfo), packageInfo.applicationInfo.icon, null)
它还有很多其他功能,它们可以返回您,还有很多可选功能,但我认为这些是有关APK文件的基本详细信息。
我希望Google可以为此提供一个很好的替代方法(在此和此处要求),因为目前我找不到任何好的解决方案。
使用从SAF获得的Uri并从中获得InputStream很容易:
@TargetApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
packageInstaller = packageManager.packageInstaller
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.type = "application/vnd.android.package-archive"
startActivityForResult(intent, 1)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { …Run Code Online (Sandbox Code Playgroud) android inputstream apk android-package-managers scoped-storage
我正在使用Android下载管理器下载文件列表.最近我遇到了一份崩溃报告说
Unknown java.lang.IllegalArgumentException: Unknown URL content://downloads/my_downloads
然后,我想通了,原因是因为用户禁用了Android下载管理器.我通过使用以下代码检查下载管理器的包名来检查是否已禁用下载管理器.
int state = this.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
Run Code Online (Sandbox Code Playgroud)
现在,我需要找到一种方法来启用下载管理器,如果它被禁用.我尝试使用Manifest中的权限设置它的启用状态但我一直得到安全异常.
this.getPackageManager().setApplicationEnabledSetting("com.android.providers.downloads", PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0);
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
Run Code Online (Sandbox Code Playgroud)
所以我认为它可能无法访问,因为它是一个系统应用程序.(谷歌Play应用程序).
有没有办法将用户重定向到下载管理器应用程序信息视图?让用户启用它?如果无法以编程方式在运行时启用它.
android android-package-managers android-download-manager android-settings
我正在编写一个应用程序,允许用户查看已安装的应用程序列表,选择其中一个,然后按计划启动它.使用stackoverflow中的教程,我设法弄清楚如何获取已安装活动的列表,它们的包名和图标(即这里 - 几种方法).以防万一,这就是我开始活动的方式,它完美无瑕,没问题:
Intent launchIntent = packageManager.getLaunchIntentForPackage(packageName);
launchIntent.setAction(Intent.ACTION_MAIN);
launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(launchIntent);
Run Code Online (Sandbox Code Playgroud)
问题是检索已安装的应用程序列表.我找到了两种方法来获取已安装的应用程序列表:
1)使用
PackageManager pm = getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplication(PackageManager.GET_META_DATA)
Run Code Online (Sandbox Code Playgroud)
从apps您的每个元素中可以获得它的包名和包标签(应用程序名称).
2)使用
PackageManager pm = getPackageManager();
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(mainIntent, 0);
for(ResolveInfo info : resolveInfos) {
ApplicationInfo applicationInfo = info.activityInfo.applicationInfo;
//...
//get package name, icon and label from applicationInfo object
}
Run Code Online (Sandbox Code Playgroud)
第一种方法存在问题:它返回所有已安装的软件包,包括系统服务,这些软件包可能不包含任何活动,因此无法启动.这是一个带有示例的屏幕截图:

上面没有图标的所有项目都无法启动.
第二种方法也存在问题:列表中的几个项目有重复项:

当我在调试器中设置断点时,我看到这些"地图"项目具有不同的活动名称("com.google.android.maps.MapsActivity","com.google.android.maps.LatitudeActivity","com.google" .android.maps.PlacesActivity"等).
我决定使用第二种方法,因为它提供了一个更适合我需要的列表,但我找不到一种方法来过滤掉重复项,只显示应用程序的默认活动,因为它们出现在启动器中(您只能在手机的应用列表中看到一个"地图",而不是四个).我尝试过滤掉系统应用ApplicationInfo.FLAG_SYSTEM,但这会删除我想要的许多应用,包括地图和其他预装的应用.我PackageManager.MATCH_DEFAULT_ONLY在执行queryIntentActivities时尝试使用flag,但这也会过滤掉许多应用程序,只留下一些.
我有点迷失在这里,我不知道该怎么做.我已经阅读了关于检索已安装应用列表的stackoverflow的所有问题,但这个问题从未提出过.请帮助任何人?如何检索没有重复项的已安装可启动应用程序列表?
是否有一种简单的方法可以让gradle更新其最新可用版本的依赖项?
为了构建可重复性,我的build.gradle文件中的所有依赖项都使用这样的版本号定义:
dependencies {
compile 'namespace:package1:version'
compile 'namespace:package2:version'
compile 'namespace:package3:version'
}
Run Code Online (Sandbox Code Playgroud)
我想定期将每个包更新到最新版本.通常这是我在发布后为新冲刺做的第一件事.
对于每个包,手动执行此操作真的很痛苦.理想情况下,我想要一个命令为我更新build.gradle文件,但至少是一个命令,打印出哪个包需要更新以及最新版本号是什么.
在ruby land我会运行bundler update.
android gradle android-build android-package-managers android-studio
如果要检索当前用户的所有应用程序的ApplicationInfo列表,则可以运行:
PackageManager pkgmanager = ctx.getPackageManager();
List<ApplicationInfo> installedApps = pkgmanager.getInstalledApplications(PackageManager.GET_META_DATA);
Run Code Online (Sandbox Code Playgroud)
但我正在寻找一种获取每个用户而不只是当前用户的列表的方法。我正在处理的应用程序具有root权限!
据我了解,用户ID可以这样检索:
List<Integer> userIds = new ArrayList<>();
PackageManager pkgmanager = ctx.getPackageManager();
final UserManager um = (UserManager) ctx.getSystemService(Context.USER_SERVICE);
List<UserHandle> list = um.getUserProfiles();
for (UserHandle user : list) {
Matcher m = p.matcher(user.toString());
if (m.find()) {
int id = Integer.parseInt(m.group(1));
userIds.add(id);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找这样的东西:
for (int i=0; i<userIds.size(); i++) {
Integer userId = userIds.get(i)
List<ApplicationInfo> installedApps = pkgmanager.getInstalledApplicationsByUserId(userId, PackageManager.GET_META_DATA);
}
Run Code Online (Sandbox Code Playgroud)
显然getInstalledApplicationsByUserId不存在。
起初我以为getPackagesForUid可以解决问题,但事实证明,Linux感觉和用户配置文件中的“用户”之间存在差异。通常,出于隔离目的,每个Android应用程序都在其自己的用户下运行。但是可以在同一用户下运行两个应用程序,以便它们可以轻松访问彼此的数据。getPackagesForUid仅返回在给定用户ID下运行的所有应用程序的名称,通常是一个。除了“用户”之外,还有“用户个人资料”,这是我希望该方法所指的内容。也许我应该也编写userProfileId而不是编写userId代码。
编辑 …
java android android-package-managers android-multiple-users android-work-profile
我想获取所有已安装应用的图标.我可以使用包管理器获取该图标吗?它有什么功能吗?或者以任何其他方式获取位图中所有已安装应用的图标?
谢谢!
我有几个关于ApplicationInfo和PackageInfo类的一般问题.他们来了:
感谢您的帮助!
编辑:
首先,在发布这样的问题之前,我已经阅读了官方文档并用Google搜索.以下是一些我不清楚的其他问题.对不起,也许我没有恰当地问他们:
所以这些问题.我不明白这些联系.