我的应用程序读取所有已安装的APK文件的列表,然后遍历列表以读取APK信息,但它会抛出TransactionTooLargeException异常.
根据我在这里阅读的http://developer.android.com/reference/android/os/TransactionTooLargeException.html,谷歌建议将大型交易分解为较小的交易.然而,似乎这种情况发生在循环浏览APK列表的中间.如果我抓住异常并继续它,其余的一切正常.有没有办法在调用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)
Run Code Online (Sandbox Code Playgroud) 所以现在我正在为我的孩子们开发一个Android应用程序.我想在特定时间内在选定的应用程序上设置一个或多个密码,以防止他们打开应用程序.例如,假设我的女儿在我工作的时候想在我的手机上播放愤怒的小鸟一段时间.我将选择我的重要应用程序,如消息,gmail等,并在她玩愤怒的小鸟时将针或密码放在上面30分钟.30分钟后,我从女儿那里拿到手机,因为时间限制到期,我可以不用别针打开应用程序.
我已经对此做了大量的研究,但是我无法找到针对我的具体案例的实现.
我知道app锁具有类似我想做的结构.我只想给锁定一个时间限制.
https://play.google.com/store/apps/details?id=com.domobile.applock&hl=en
我远离使用ActivityManager等杀死活动/应用程序.我真的只想在特定时间内在所选应用程序上使用干净的锁定屏幕.
我有一个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 which) {
Log.d( "AlertDialog", "Positive" );
hourint = Integer.valueOf(number_text.getText().toString());
minuteint = Integer.valueOf(minute_text.getText().toString());
secondint = Integer.valueOf(second_text.getText().toString());
Log.i("YourActivity", "Hours: " + hourint);
Log.i("YourActivity", "Minutes: " + minuteint);
Log.i("YourActivity", "Seconds: " + secondint); …Run Code Online (Sandbox Code Playgroud) java android countdown android-package-managers device-policy-manager
我想获得Android L中的所有默认应用程序.我使用了下面的代码,但它们给了我一个错误的解决方案.让我们先看看我的代码
private void getMyAppLauncherDefault() {
final IntentFilter filter = new IntentFilter(Intent.ACTION_MAIN);
filter.addCategory(Intent.CATEGORY_HOME);
List<IntentFilter> filters = new ArrayList<IntentFilter>();
filters.add(filter);
List<ComponentName> activities = new ArrayList<ComponentName>();
final PackageManager packageManager = (PackageManager) getPackageManager();
packageManager.getPreferredActivities(filters, activities, null);
for (ComponentName activity : activities) {
Log.d(TAG,"======packet default:==="+activity.getPackageName());
}
}
Run Code Online (Sandbox Code Playgroud)
这是日志.日志显示com.google.android.googlequicksearchbox和之间的错误结果com.vlingo.midas.它们都是语音应用程序,但我将其设置com.google.android.googlequicksearchbox为默认值.我不知道为什么日志显示com.vlingo.midas.我该如何解决?谢谢
16:02:44.817 /com.exam D/Sample: ======packet default:===com.sec.android.gallery3d
16:02:44.827 /com.exam D/Sample: ======packet default:===com.android.mms
16:02:44.827 /com.exam D/Sample: ======packet default:===com.android.mms
16:02:44.827 /com.exam D/Sample: ======packet default:===com.vlingo.midas
16:02:44.827 /com.exam D/Sample: ======packet default:===com.sec.android.app.sbrowser
16:02:44.827 /com.exam D/Sample: …Run Code Online (Sandbox Code Playgroud) android android-intent android-package-managers android-5.0-lollipop
我正在尝试正确解决禁用下载管理器.我能找到的最佳信息是如何启用Android下载管理器.
PackageManager.COMPONENT_ENABLED_STATE_DISABLEDPackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER对我来说,状态是可以理解的.
但经过一小时的谷歌搜索,我仍然感到困惑PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED.
文件如下:
仅适用于setApplicationEnabledSetting(String,int,int)的标志:应考虑此应用程序,直到用户实际想要使用它为止.这意味着它通常不会显示给用户(例如在启动器中),但是用户界面的各个部分可以使用GET_DISABLED_UNTIL_USED_COMPONENTS仍然可以看到它并允许用户选择它(例如IME,设备管理员)等).一旦用户选择了应用程序,此类代码也应在此时启用.此选项当前不能与setComponentEnabledSetting(ComponentName,int,int)一起使用.
这是否意味着我应该将此状态视为已启用?
用户如何选择 DownloadManager?它怎么能出现?
我有一个应用程序,它保存设备上安装的内部开发应用程序的日志.安装后,将调用Intent.PACKAGE_ADDED的广播接收器,并使用以下代码记录包名称:
public class NewInstallReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle b = intent.getExtras();
int uid = b.getInt(Intent.EXTRA_UID);
String[] packages = context.getPackageManager().getPackagesForUid(uid);
ApplicationService appService = new ApplicationService(context);
appService.ApplicationInstalled(packages);
}
}
Run Code Online (Sandbox Code Playgroud)
我面临的问题是当使用Intent.PACKAGE_REMOVED的广播接收器时,通过唯一ID(UID)对包的所有引用都会返回空信息(如您已经卸载的那样,正如您所期望的那样).我有一个临时解决方案,但它不是很优雅,对于下一个版本,我希望有更清晰的代码.代码应如何工作的示例:
public class RemoveApplicationReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle b = intent.getExtras();
int uid = b.getInt(Intent.EXTRA_UID);
String[] packages = context.getPackageManager().getPackagesForUid(uid);
ApplicationService appService = new ApplicationService(context);
appService.ApplicationRemoved(packages);
}
}
Run Code Online (Sandbox Code Playgroud)
所以回顾一下,问题是:
删除程序后,如何在广播接收器中为Intent.PACKAGE_REMOVED引用包名称.
谢谢
我将我的活动设置为默认启动器,以拦截主页按钮点击,如下所示:
<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>
Run Code Online (Sandbox Code Playgroud)
当我的活动ExampleActivity启动时,如果我点击该home键,我会被提示选择.如果我选择将此设为我的默认设置并选择我的活动,我会陷入我的活动中.
问题是,当我离开活动时,我尝试从默认启动器中删除我的活动,但是不成功.
我试过了:
ComponentName componentName = new ComponentName(
"com.example.exampleactivity",
"com.example.exampleactivity.class");
pm.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
Run Code Online (Sandbox Code Playgroud)
和:
PackageManager pm = getActivity().getPackageManager();
ComponentName name = new ComponentName(this, "com.example.exampleactivity.class");
pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
Run Code Online (Sandbox Code Playgroud)
但是我的名字home永远不会被删除.
有没有人有办法解决上述问题?
我只是不想将主页按钮作为特定活动的默认设置,而不是我的整个应用程序.当我离开活动时,应将其删除并恢复为默认值.
android android-intent android-package-managers android-launcher
我在尝试在特定设备中安装APK时遇到了一些问题.我有很多设备,到目前为止还没有发生过(所有这些设备,Radxa Rock Pro).
当我跑步时,pm install myApp我得到了
root@radxaPro:/ # pm install /sdcard/myApp.apk
pkg: /sdcard/myApp.apk
Failure [INSTALL_FAILED_INTERNAL_ERROR]
Run Code Online (Sandbox Code Playgroud)
Logcat输出:
06-02 13:02:33.032 I/AndroidRuntime( 4469): JNI options: '-Xjniopts:warnonly'
06-02 13:02:33.042 D/dalvikvm( 4469): Trying to load lib libjavacore.so 0x0
06-02 13:02:33.042 D/dalvikvm( 4469): Added shared lib libjavacore.so 0x0
06-02 13:02:33.052 D/dalvikvm( 4469): Trying to load lib libnativehelper.so 0x0
06-02 13:02:33.052 D/dalvikvm( 4469): Added shared lib libnativehelper.so 0x0
06-02 13:02:33.052 D/dalvikvm( 4469): No JNI_OnLoad found in libnativehelper.so 0x0, skipping init
06-02 13:02:33.082 D/dalvikvm( 4469): Note: …Run Code Online (Sandbox Code Playgroud) 我是安卓编程新手。我使用 Eclipse 以及 MainActivity.java 和 ClassFragment.java 文件创建了一个应用程序。ClassFragment 是一个片段。我正在使用新更新的 appcompat 库。我只想在我的片段中实现一个 toast,其中将显示应用程序的版本 vode 和版本名称。我使用了以下代码
PackageManager pInfo = getActivity().getPackageManager.getPackageInfo(getActivity().getPackageName, 0);
,但它显示 java 编译错误 PackageManager namenotfoundexception。请帮我解决这个问题。提前致谢。
我试图得到给定的默认/首选应用程序Intent.例如,当用户安装第二个Web浏览器,然后尝试打开URL时,他或她将获得如下对话框:

如果用户随后选择" 默认使用此操作"选项,则在按下URL时将不再打开该对话框.
我正在开发一个应该知道这个默认或首选 app/action的应用程序.我该怎么做呢?我目前正在使用下面的代码,但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);
for (ComponentName activity : preferredActivities) {
for (ResolveInfo rinfo : list) {
if (rinfo.activityInfo.applicationInfo.packageName.equals(activity.getPackageName())) {
try {
final PackageInfo …Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序,应该列出设备上的所有已安装的应用程序(没有root).我曾经尝试都getInstalledApplications(0)和getInstalledPackages(0)方法PackageManager,但在某些设备上,这显然是做安装了太多的应用程序,我得到"包经理人已去世" RuntimeException(我通过谷歌播放的错误报告服务接收它们).这是由于Android内部使用的IPC中每1次呼叫1MB的众所周知的限制.
如何解决这个问题?我不介意通过块请求长列表,但我没有看到任何方法.只有2种上述方法可供使用.