标签: android-recents

如何使用UsageStatsManager?

背景

谷歌已弃用getRecentTasks"ActivityManager"类的功能" ".现在它所做的只是获取当前应用程序已打开的应用程序列表.

我甚至在StackOverflow上写了一篇关于它的帖子,但我发现这是不可能的.

问题

我发了一篇关于它的帖子(在这里,另一个,类似的由其他人创建,在这里),并要求重新考虑它,谷歌决定创建一个新类,似乎提供类似的功能(更像是统计,但也可能有用),但我无法找到如何使用它.

该类称为" UsageStatsManager",我的猜测是函数" queryUsageStats"完成工作.

此外,它似乎有一个新的权限(" android.permission.PACKAGE_USAGE_STATS"),这是一个系统权限,但它写道:

声明权限意味着使用API​​的意图,设备用户可以通过Settings应用程序授予权限.

这是关于这个新功能另一个链接.

我发现了什么

我查看了Android的代码,并注意到"Context"有USAGE_STATS_SERVICE,在JavaDocs中说下一件事:

/**
 * Use with {@link #getSystemService} to retrieve a {@link
 * android.app.UsageStatsManager} for interacting with the status bar.
 *
 * @see #getSystemService
 * @see android.app.UsageStatsManager
 * @hide
 */
public static final String USAGE_STATS_SERVICE = "usagestats";
Run Code Online (Sandbox Code Playgroud)

奇怪的是,不仅它说" status bar",而且packageName也不匹配(应该是" android.app.usage.UsageStatsManager").

我还添加了正确的权限:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)

这是我使用的代码:

  final UsageStatsManager …
Run Code Online (Sandbox Code Playgroud)

android usage-statistics activity-manager android-recents usagestatsmanager

52
推荐指数
5
解决办法
5万
查看次数

如何检查是否给出了"android.permission.PACKAGE_USAGE_STATS"权限?

背景

我正在尝试获取应用程序启动的统计信息,并且在Lollipop上可以通过使用UsageStatsManager类来实现(原始帖子在这里):

表现:

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions"/>
Run Code Online (Sandbox Code Playgroud)

打开活动,让用户确认给您这个权限:

startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Run Code Online (Sandbox Code Playgroud)

获取统计数据,汇总:

 private static final String USAGE_STATS_SERVICE ="usagestats"; // Context.USAGE_STATS_SERVICE);
 ...
 final UsageStatsManager usageStatsManager=(UsageStatsManager)context.getSystemService(USAGE_STATS_SERVICE);
 final Map<String,UsageStats> queryUsageStats=usageStatsManager.queryAndAggregateUsageStats(fromTime,toTime);
Run Code Online (Sandbox Code Playgroud)

问题

我似乎无法检查是否授予您所需的权限("android.permission.PACKAGE_USAGE_STATS").到目前为止我所做的一切总是会让人感到被拒绝.

代码有效,但权限检查不起作用.

我试过的

您可以使用以下任一方法检查是否授予了权限:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getContext().checkCallingOrSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;   
Run Code Online (Sandbox Code Playgroud)

或这个:

String permission = "android.permission.PACKAGE_USAGE_STATS";
boolean granted=getPackageManager().checkPermission(permission,getPackageName())== PackageManager.PERMISSION_GRANTED;   
Run Code Online (Sandbox Code Playgroud)

两者总是返回它被拒绝(即使我已经授予用户权限).

看看UsageStatsManager的代码,我试图想出这个解决方法:

      UsageStatsManager usm=(UsageStatsManager)getSystemService("usagestats");
      Calendar calendar=Calendar.getInstance();
      long toTime=calendar.getTimeInMillis();
      calendar.add(Calendar.YEAR,-1);
      long fromTime=calendar.getTimeInMillis();
      final List<UsageStats> queryUsageStats=usm.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,fromTime,toTime);
      boolean granted=queryUsageStats!=null&&queryUsageStats!=Collections.EMPTY_LIST;
Run Code Online (Sandbox Code Playgroud)

它工作,但它仍然是一个解决方法.

这个问题

为什么我没有得到权限检查的正确结果?

应该怎么做才能更好地检查?

permissions android usage-statistics android-recents usagestatsmanager

40
推荐指数
2
解决办法
2万
查看次数

隐藏"最近的应用列表"中的屏幕,但允许屏幕截图

由于显示敏感数据,我主要想在最近的应用列表中清空屏幕.为此,解决方案是使用:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
Run Code Online (Sandbox Code Playgroud)

但这也不允许截图,这是一个问题.

有没有办法在最近的应用程序列表中显示空白屏幕(或预定义的图像),同时仍然允许截图?

android screenshot android-recents

15
推荐指数
2
解决办法
6571
查看次数

如何检测从最近列表中删除的应用程序?

我正在开发一个音乐应用程序,我想在用户从最近的列表中删除应用程序时停止服务,而不是在第一个活动被销毁时停止服务(因为当用户点击回来直到应用程序最小化时,在这种情况下,第一个活动也是被摧毁).请帮忙.

android android-recents

14
推荐指数
1
解决办法
1万
查看次数

excludeFromRecents不适用于taskAffinity

可能重复: 如何在ICS中的最近应用列表中不显示应用?excludeFromRecents不起作用

假设我有两个活动A(主要活动)和B.我从A开始B如下:

    Intent i = new Intent(A.this, B.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
Run Code Online (Sandbox Code Playgroud)

我希望我的应用程序在任何时候只有一个条目,并且B将在新任务中启动.如果B有如下的清单条目,我实现了:

    <activity
        android:name="com.example.verysimpleactivity2.app.B"
        android:excludeFromRecents="true"
        android:label="B" ></activity>
Run Code Online (Sandbox Code Playgroud)

但我也希望B具有与主要活动不同的taskAffinity,即A.所以我将清单条目更改为:

    <activity
        android:name="com.example.verysimpleactivity2.app.B"
        android:excludeFromRecents="true"
        android:taskAffinity=""
        android:label="B" ></activity>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果B不在前景中,那么它不会显示在最近,我只有A(好!)但是,如果B在前景中并按下最近按钮,我看到A和B都在那里.为什么在这种情况下B显示在最近?如何确保我根本看不到B?

android android-manifest android-activity android-recents

9
推荐指数
1
解决办法
2089
查看次数

如何强制应用为最近的应用列表创建缩略图(快照)?

我的应用程序的测试人员报告说:"最近的应用程序列表中的应用程序的缩略图根本没有调整.在我看来它像主屏幕壁纸(tolikdru:可能,只是透明的rect),或者像应用程序的绿色背景屏幕,但从来不是应用程序的真实快照." 所以行为就像这里描述的那样.

我的设备是使用Android 2.0,所以我无法检查和调试问题(最近的应用程序中的缩略图是自Android 3.0+以来).因此,进一步的研究处于"盲目模式".

我决定用onCreateThumbnail手动强制应用程序缩略图的创建()作为这里建议.(为了简化开始的任务,我没有捕获真正的快照,而是使用splashscreen drawable.)

@Override
public boolean onCreateThumbnail(Bitmap outBitmap, Canvas thumbCanvas) {
    super.onCreateThumbnail(outBitmap, thumbCanvas);

    //splashscreen drawable to bitmap
    outBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.titel);

    //automatically scale to provided canvas 
    //(is the canvas provided as input ???)
    thumbCanvas.drawBitmap(outBitmap, 0, 0, new Paint());

    //is the outBitmap itself scaled to canvas or its copy???
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我不确定上面的代码是否正确,因为我无法测试它(见下文).

根据文档,另一个可能的解决方案可能只是一个虚拟的@Override onCreateThumbnail,里面只有super.onCreateThumbnail(),因为文档说:

默认实现返回失败,并且不绘制缩略图; 这将导致平台 在需要时创建自己的缩略图.

但是onCreateThumbnail方法并没有触发,至少在我的Android 2上.实际上这个技巧是针对Android 3+设计的.这里(2012年) 和此处(2009年)报道了相同的情况.在这两种情况下都没有使用Android版本.

那么请你帮忙解答一下问题:

1)上面的代码是否适用于在最近的应用列表中使用缩略图的Android 3+设备? …

java android thumbnails android-recents

7
推荐指数
1
解决办法
3212
查看次数

应用程序处于后台时,活动在"最近"中不可见

问题说明

在我的一个应用程序中,我看到了很奇怪的行为:当我的应用程序在前台运行时(最顶层),然后我可以在系统的最近看到它的活动.但是一旦我把它放到后台,AccountsActivity很久以前列出的相同活动(即)就不再存在于最近.我的清单文件的相关部分:

<application
    android:name=".WebnetApplication"
    android:allowBackup="false"
    android:allowClearUserData="true"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".StartActivity"
        android:alwaysRetainTaskState="true"
        android:excludeFromRecents="true"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoDisplay" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".AccountsActivity"
        android:excludeFromRecents="false"
        android:launchMode="singleTask"
        android:windowSoftInputMode="adjustResize" />

    ...
Run Code Online (Sandbox Code Playgroud)

发现

由于这是我唯一一个行为不端的应用程序,我检查了所有样式,我的WebnetActivityWebnetApplication确保我不会调用任何可能影响最近的东西.没有这样的.

然后我开始删除Manifest文件以查看是否会发生变化.正如预期的那样,罪魁祸首潜伏在那里,但对我来说仍然不是很清楚.在开始时,AccountsActivityManifest中的android:excludeFromRecents条目根本没有条目 - 这导致在AccountsActivity根本不可见.当我添加时android:excludeFromRecents="true",活动在"最近"中变得可见,但只有当它在前面时才会显示.当我向后移动时,它从最近消失了.当我android:excludeFromRecents="true"StartActivity声明中删除时,AccountsActivity无论应用程序是在前面还是在后台,都可以在最近显示,我可以android:excludeFromRecents完全删除它的条目而没有任何问题.

目前我正在弯着脑子试图理解为什么一切都这样 - 这是正常的(我不知道什么)或者它可能是框架中的错误?任何人都面临类似的问题,可以分享经验,想法或解释?

android android-manifest android-recents

7
推荐指数
1
解决办法
1837
查看次数

Android Lollipop知道app是否可以访问Usage Stats

自Android Lollipop以来,我们现在拥有一个用于访问应用使用情况统计数据的API.但是,您的应用必须由用户授予这些权限.

我知道使用Settings.ACTION_USAGE_ACCESS_SETTINGS将用户重定向到这些设置.

现在,我的问题是您如何知道用户已授予您这些权限,以便您可以停止将其重定向到设置.

谢谢!

android usage-statistics android-recents android-5.0-lollipop

7
推荐指数
2
解决办法
1万
查看次数

如何在最近的应用列表中保留同一个应用的多个活动

我有一个应用程序有两个活动A和B,都有启动模式singleInstance.我注意到即使A和B都在后台运行,最近的应用列表中也只会显示最后一个活动.是否可以将A&B保留在最近的应用列表中?谢谢.

android android-recents

7
推荐指数
2
解决办法
908
查看次数

如何在ICS的最新应用列表中显示应用?excludeFromRecents不起作用

我知道它应该可以android:excludeFromRecents="true"在android manifest或Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSIntent标志中实现.

问题是,如果当前正在显示应用程序,则无效 - 当单击"最近的应用程序"按钮时,应用程序始终显示在首位,允许快速查杀应用程序(通过滑动它).不适合闹钟应用.

幸运的是,音乐服务继续播放,用户可以通过通知回到完成警报,但我真的很难重新创建活动堆栈.

有没有快速解决方案?

android android-recents

6
推荐指数
1
解决办法
953
查看次数