Articles of android package managers

Android:如何获取已安装活动的列表,因为它们出现在启动器中,没有重复项

我正在编写一个应用程序,允许用户查看已安装的应用程序列表,选择其中一个,然后按计划启动它。 使用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); 问题是检索已安装的应用程序列表。 我find了两种方法来获取已安装的应用程序列表: 1)使用 PackageManager pm = getPackageManager(); List apps = pm.getInstalledApplication(PackageManager.GET_META_DATA) 从apps每个元素,您可以获得它的包名和包标签(应用程序名称)。 2)使用 PackageManager pm = getPackageManager(); Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); List resolveInfos = packageManager.queryIntentActivities(mainIntent, 0); for(ResolveInfo info : resolveInfos) { ApplicationInfo applicationInfo = info.activityInfo.applicationInfo; //… //get package name, […]

如何从Android的另一个应用程序资源更改主题?

我知道有一种方法来设置主题,通过在styles.xml中定义并使用它 setTheme(android.R.style.MyTheme); 不过,我想从我开发的另一个应用程序获取主题。 我知道资源名称,实际上我能够获得这个代码块的主题ID; Resources res = getPackageManager().getResourcesForApplication("com.example.theme"); int resThemeId = res.getIdentifier("my_theme","style","com.example.theme"); 当我debugging时,我看到resThemeId不是零。 然后,我需要最后的命令来设置这个主题。 在super.onCreate()函数之前,我试图实现这个方法,但似乎不工作 setTheme(resThemeId); 但是,而不是这个,如果我写下面的声明,我工作正常 setTheme(android.R.style.Theme_Holo_Light); 那么,我应该怎么做才能使用来自不同软件包资源的主题呢?

在Android 4.2+上使用intent安装apk时启用降级

在Android 4.2+上使用intent安装apk时可以启用降级function吗? 我发现,通过命令shell(使用-d) adb install -r -d <link to apk>安装应用程序时,有可能通过Intent来实现。 我正在寻找一些国旗或什么的,但我没有find任何有用的东西。 这是我打算打开包安装程序的意图: Intent intent = new Intent(Intent.ACTION_VIEW); Uri applicatonFileUri = Uri.fromFile(applicationFile); intent.setDataAndType(applicatonFileUri, PACKAGE_TYPE); startActivity(intent);

如何以编程方式为应用程序设置locking或引脚

所以现在我正在为我的孩子开发一个Android应用程序。 我想在选定的应用程序上设置一个pin或密码一段特定的时间,以防止他们打开应用程序。 例如,假设我的女儿想在我工作的时候在手机上玩一段时间的愤怒的小鸟。 我会select我的重要应用程序,如消息传递,Gmail等,并在播放愤怒的小鸟时,将其上的PIN或密码放置30分钟。 30分钟后,我从我的女儿拿到我的手机,我可以打开应用程序没有针,因为时间限制过期。 我已经做了大量的研究,但是我还没有find适合自己的案例。 Android“应用程序locking”应用程序如何工作? 我知道,应用锁具有类似于我想要做的结构。 我只是为了locking一个时间限制。 https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en 我远离杀死与ActivityManager等活动/应用程序。我真的只是想在选定的应用程序一个干净的locking屏幕一段特定的时间。 我有一个CountdownTimer来倒计时器的时间我设置。 如果我拥有所有的软件包名称,我将如何修改此代码以阻止某些应用程序达到指定的时间? start_timer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new AlertDialog.Builder( MainActivity.this ) .setMessage( "Are you sure you want to block the selected apps for the set amount of time?" ) .setPositiveButton( "Yeah man!", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int […]

删除活动作为默认启动器

我将我的活动设置为默认启动程序来拦截主页button点击,如下所示: <activity android:name=".ExampleActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> 当我的活动, ExampleActivity启动,如果我点击主键,我会得到提示select。 如果我select使这是我的默认设置,并select我的活动,我卡住在我的活动,如所期望的。 问题是,当我离开活动时,我尝试从默认启动器中删除我的活动,但是不成功。 我努力了: ComponentName componentName = new ComponentName( "com.example.exampleactivity", "com.example.exampleactivity.class"); pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP); 和: PackageManager pm = getActivity().getPackageManager(); ComponentName name = new ComponentName(this, "com.example.exampleactivity.class"); pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0); 但我的家庭指定永远不会被删除。 有没有人有一个工作方式来解决上述问题? 我只想要主页button默认为特定的活动,而不是我的整个应用程序。 当我离开活动时,它应该被删除并恢复到默认状态。

Android ClassCastException与空白types

我得到一个奇怪的行为,我想我更多地寻求解释,而不是一个解决scheme(尽pipe解决scheme也是受欢迎的!)。 代码如下: PackageManager pm = context.getPackageManager(); List<PackageInfo> pkgList = pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); if (pkgList == null) return null; for (PackageInfo pkgInfo : pkgList) { ApplicationInfo appInfo = pkgInfo.applicationInfo; // do some stuff, doesn't modify pkgInfo or appInfo or pkgList } 在某些情况下,我得到错误日志: java.lang.ClassCastException:不能转换为android.content.pm.PackageInfo 报道为: for (PackageInfo pkgInfo : pkgList) 奇怪的是,通常, ClassCastException通常看起来像(AFAIK): java.lang.ClassCastException: foo.bar.ClassA不能转换为foo.bar.ClassB 但是,我看到的错误是第一部分显示空白。 我决定研究一下,如果返回列表的函数在内部输出错误的对象列表并返回它,某些东西可能会发生。 所以我看了看: ApplicationPackageManager.getInstalledPackages() @SuppressWarnings("unchecked") […]

如何找出Skype通话目前是否在Android上有效

好的,我反编译Skype的清单,以查明在通话期间是否有任何服务或广播正在运行。 来电只有几个内部广播。 也只有一个接收器和一个服务存在。 我使用我的应用监视了所有正在运行的服务,但SkypeMainService始终在运行,即使不在通话中也是如此。 另外, AudioMode不会被skype改变(但是根据开发者想要的logcat日志,但是他们只是不这样做),所以我不能简单地检查它是否是MODE_IN_CALL 。 如果Skype正在运行并正在进行通话,您是否有任何build议? 谢谢! /编辑:活动等的简要概述: <activity android:name="com.skype.raider.Main"> <activity-alias android:name="com.skype.raider.ui.SplashScreenActivity" android:targetActivity="com.skype.raider.Main"> <receiver android:name="com.skype.MainReceiver" android:enabled="true" android:exported="false"> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <action android:name="android.intent.action.SEARCH" /> <action android:name="android.intent.action.CALL_PRIVILEGED" /> <action android:name="com.skype.raider.INCOMING_GSM_CALL" /> <action android:name="com.skype.raider.ON_GSM_CALL" /> <action android:name="com.skype.raider.intent.action.request_sync" /> </receiver> <service android:name="com.skype.MainService">

解决“包pipe理器已经死了”RuntimeException

我有一个Android应用程序应列出设备上的所有已安装的应用程序(无根)。 我已经尝试了PackageManager getInstalledApplications(0)和getInstalledPackages(0)方法,但是在一些显然安装了太多应用程序的设备上,我得到“Package manager has died” RuntimeException (我通过错误报告服务的Google Play)。 这是由于Android内部使用的IPC每1个呼叫有一个众所周知的限制。 如何解决这个问题? 我不介意以大块的forms要求长列表,但我没有看到任何方法。 只有上述两种方法可用。

在Android上获取首选/默认应用程序

我正在尝试获取给定Intent的默认/首选应用程序。 例如,当用户安装第二个Web浏览器,然后尝试打开一个URL,他或她会得到这样一个对话框: 如果用户然后select了“ 默认使用此操作”选项,则当按下URL时,对话框不再打开。 我正在处理一个应该知道这个默认或首选应用程序/动作是什么的应用程序。 我该怎么做呢? 我目前使用下面的代码,但getPreferredPackage不会返回任何内容: Intent i = (new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com")); PackageManager pm = context.getPackageManager(); final List<ResolveInfo> list = pm.queryIntentActivities(i, 0); IntentFilter ifilter = new IntentFilter(i.getAction()); if (i.getCategories() != null) { for(String category : i.getCategories()) { ifilter.addCategory(category); } } List<IntentFilter> filters = new ArrayList<IntentFilter>(); filters.add(ifilter); List<ComponentName> preferredActivities = new ArrayList<ComponentName>(); pm.getPreferredActivities(filters, preferredActivities, null); […]

Android包pipe理器已经因为TransactionTooLargeException而死亡

我的应用程序读取所有安装的APK文件的列表,然后遍历列表读取APK信息,但是它引发了一个TransactionTooLargeExceptionexception。 从我在这里阅读的http://developer.android.com/reference/android/os/TransactionTooLargeException.html ,谷歌build议将大型交易分成较小的交易。 不过,在循环浏览APK列表时,似乎发生在中间。 如果我发现exception并继续,其余的都可以正常工作。 有没有一种方法来减less内存使用量,同时调用getPackageInfo? 即使已经返回,该呼叫是否仍然存在。 以下是发生的情况: at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:89) at com.myapp.appreader.getAppDetails(Appreader.java:207) at com.myapp.appreader.collectData(Appreader.java:99) at com.myapp.appreader.AppDataCollectionTask.run(AppDataCollectionTask.java:26) at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.executeTask(AppDataTaskExecutor.java:439) at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:327) at com.myapp.appreader.service.AppDataTaskExecutor$AppDataAsyncTask.doInBackground(AppDataTaskExecutor.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask.run(FutureTask.java:234) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at java.lang.Thread.run(Thread.java:856)\nCaused by: android.os.TransactionTooLargeExceptionat android.os.BinderProxy.transact(Native Method) at android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo(IPackageManager.java:1538) at android.app.ApplicationPackageManager.getPackageInfo(ApplicationPackageManager.java:84)