Android 5.1.1及以上版本-getRunningAppProcesses()仅返回我的应用程序包

Android 5.1.1及以上版本-getRunningAppProcesses()仅返回我的应用程序包,android,android-6.0-marshmallow,Android,Android 6.0 Marshmallow,谷歌似乎最终关闭了获取当前前台应用程序包的所有大门 在棒棒糖更新之后,由于以下原因,我使用以下代码获得前台应用程序包,因为棒棒糖: final int PROCESS_STATE_TOP = 2; RunningAppProcessInfo currentInfo = null; Field field = null; try { field = RunningAppProcessInfo.class.getDeclaredField("processState"); } catch (

谷歌似乎最终关闭了获取当前前台应用程序包的所有大门

在棒棒糖更新之后,由于以下原因,我使用以下代码获得前台应用程序包,因为棒棒糖:

final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
    field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) { 
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
    if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
        app.importanceReasonCode == 0 ) {
        Integer state = null;
        try {
            state = field.getInt( app );
        } catch (Exception ignored) {
        }
        if (state != null && state == PROCESS_STATE_TOP) {
            currentInfo = app;
            break;
        }
    }
}
return currentInfo;

可访问性服务(2017年12月:谷歌将禁止使用)

一些应用程序使用可访问性服务(as),但它有一些缺点


是否有其他方法获取当前正在运行的应用程序包?

 private String printForegroundTask() {
    String currentApp = "NULL";
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
        UsageStatsManager usm = (UsageStatsManager)this.getSystemService("usagestats");
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - 1000*1000, time);
        if (appList != null && appList.size() > 0) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : appList) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
            }
        }
    } else {
        ActivityManager am = (ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses();
        currentApp = tasks.get(0).processName;
    }

    Log.e("adapter", "Current App in foreground is: " + currentApp);
    return currentApp;
}
如果用户在设置->安全->具有使用权限的应用程序中启用此选项。之后你将得到前台任务。猎豹汽车清洁垫的类似过程

如果用户在设置->安全->具有使用权限的应用程序中启用此选项。之后你将得到前台任务。猎豹汽车清洁垫的类似过程

谷歌将此功能仅限于系统应用程序。如中所述,您需要REAL\u GET\u TASKS权限才能访问那里

应用程序现在必须具有…权限。要能够 获取所有应用程序的进程信息。只有过程 如果应用程序 没有许可。权限应用程序将暂时无法使用 获取所有应用程序(如果它们没有 新权限,但已弃用…权限。仅获取任务 系统应用程序可以获得REAL_GET_TASKS权限


谷歌将此功能仅限于系统应用程序。如中所述,您需要REAL\u GET\u TASKS权限才能访问那里

应用程序现在必须具有…权限。要能够 获取所有应用程序的进程信息。只有过程 如果应用程序 没有许可。权限应用程序将暂时无法使用 获取所有应用程序(如果它们没有 新权限,但已弃用…权限。仅获取任务 系统应用程序可以获得REAL_GET_TASKS权限


要获得Android 1.6-Android 6.0上运行进程的列表,您可以使用我编写的这个库:该库读取/proc以获取进程信息

谷歌对Android Nougat中/proc的访问进行了重大限制。要获得Android Nougat上正在运行的进程列表,您需要使用UsageStatsManager或具有root访问权限


单击“编辑以前备选解决方案的历史记录”。

要获取Android 1.6-Android 6.0上正在运行的进程列表,您可以使用我编写的这个库:该库读取/proc以获取进程信息

谷歌对Android Nougat中/proc的访问进行了重大限制。要获得Android Nougat上正在运行的进程列表,您需要使用UsageStatsManager或具有root访问权限


单击编辑以前备选解决方案的历史记录。

请尝试使用
getRunningServices()
而不是
GetRunningAppProcess()
方法

 ActivityManager mActivityManager = (ActivityManager) getSy stemService(Context.ACTIVITY_SERVICE);

 List<ActivityManager.RunningServiceInfo> appProcessInfoList = mActivityManager.getRunningServices(Integer.MAX_VALUE);
ActivityManager mActivityManager=(ActivityManager)getSy stemService(Context.ACTIVITY_服务);
List-appProcessInfoList=mActivityManager.getRunningServices(Integer.MAX_值);

请尝试使用
getRunningServices()
而不是
getRunningAppProcesses()
方法

 ActivityManager mActivityManager = (ActivityManager) getSy stemService(Context.ACTIVITY_SERVICE);

 List<ActivityManager.RunningServiceInfo> appProcessInfoList = mActivityManager.getRunningServices(Integer.MAX_VALUE);
ActivityManager mActivityManager=(ActivityManager)getSy stemService(Context.ACTIVITY_服务);
List-appProcessInfoList=mActivityManager.getRunningServices(Integer.MAX_值);
公共类可访问性检测服务扩展可访问性服务{
@凌驾
ServiceConnected()上受保护的void{
super.onServiceConnected();
//在此处配置这些,以与API 13及以下版本兼容。
AccessibilityServiceInfo配置=新的AccessibilityServiceInfo();
config.eventTypes=AccessibilityEvent.TYPE\u WINDOW\u STATE\u已更改;
config.feedbackType=AccessibilityServiceInfo.FEEDBACK\u GENERIC;
如果(Build.VERSION.SDK_INT>=16)
//以防万一
config.flags=AccessibilityServiceInfo.FLAG\包含\不\重要\视图;
设置服务信息(配置);
}
@凌驾
AccessibilityEvent(最终AccessibilityEvent事件)上的公共无效{
如果(事件==null){
返回;
}else if(event.getPackageName()==null&&event.getClassName()==null){
返回;
}
如果(activityInfo!=null){
Log.d(“CurrentActivity”,componentName.FlattToSortString());
}
}
私有活动信息tryGetActivity(组件名称组件名称){
试一试{
返回getPackageManager().getActivityInfo(componentName,0);
}捕获(PackageManager.NameNotFounde异常){
返回null;
}
}
@凌驾
在中断时的公共无效(){
}                
}
}//`在此处输入代码`使用权限android:name=“android.permission.BIND\u ACCESSIBILITY\u SERVICE”/
然后在设备上启动服务和应用程序可访问性 设置->辅助功能->应用程序 在该服务上。

公共类可访问性检测服务扩展可访问性服务{
@凌驾
ServiceConnected()上受保护的void{
super.onServiceConnected();
//在此处配置这些,以与API 13及以下版本兼容。
AccessibilityServiceInfo配置=新的AccessibilityServiceInfo();
config.eventTypes=AccessibilityEvent.TYPE\u WINDOW\u STATE\u已更改;
config.feedbackType=AccessibilityServiceInfo.FEEDBACK\u GENERIC;
如果(Build.VERSION.SDK_INT>=16)
//以防万一
config.flags=AccessibilityServiceInfo.FLAG\包含\不\重要\视图;
设置服务信息(配置);
}
@凌驾
AccessibilityEvent(最终AccessibilityEvent事件)上的公共无效{
如果(事件==null){
返回;
}else if(event.getPackageName()==nu
 ActivityManager mActivityManager = (ActivityManager) getSy stemService(Context.ACTIVITY_SERVICE);

 List<ActivityManager.RunningServiceInfo> appProcessInfoList = mActivityManager.getRunningServices(Integer.MAX_VALUE);
public class AccessibilityDetectingService extends AccessibilityService {

@Override
protected void onServiceConnected() {
    super.onServiceConnected();

    //Configure these here for compatibility with API 13 and below.

    AccessibilityServiceInfo config = new AccessibilityServiceInfo();
    config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;

    if (Build.VERSION.SDK_INT >= 16)
        //Just in case this helps
        config.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;

    setServiceInfo(config);
}

@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
        if (event == null ) {
            return;
        } else if(event.getPackageName() == null && event.getClassName() == null){
            return;
        }

            if (activityInfo != null){

                Log.d("CurrentActivity", componentName.flattenToShortString());
        }

}

private ActivityInfo tryGetActivity(ComponentName componentName) {
    try {
        return getPackageManager().getActivityInfo(componentName, 0);
    } catch (PackageManager.NameNotFoundException e) {
        return null;
    }
}
@Override
public void onInterrupt() {
}                
}
}//`enter code here`uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<uses-permission android:name="android.permission.GET_TASKS" />
AppChecker appChecker = new AppChecker();
String packageName = appChecker.getForegroundApp();
AppChecker appChecker = new AppChecker();
appChecker
    .when("com.other.app", new AppChecker.Listener() {
        @Override
        public void onForeground(String packageName) {
            // do something
        }
    )
    .when("com.my.app", new AppChecker.Listener() {
        @Override
        public void onForeground(String packageName) {
            // do something
        }
    )
    .other(new AppChecker.Listener() {
        @Override
        public void onForeground(String packageName) {
            // do something
        }
    )
    .timeout(1000)
    .start(this);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    UsageStatsManager usm = (UsageStatsManager)this.getSystemService("usagestats");
    long time = System.currentTimeMillis();
    List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - 1000*1000, time);
    if (appList != null && appList.size() > 0) {
        SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
        for (UsageStats usageStats : appList) {
            mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
        }
        if (mySortedMap != null && !mySortedMap.isEmpty()) {
            currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
        }
    }
}
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
    UsageStatsManager usm = (UsageStatsManager) context.getSystemService(
        Context.USAGE_STATS_SERVICE);
    long time = System.currentTimeMillis();
    List<UsageStats> appStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
            time - 1000 * 1000, time);
    if (appStatsList != null && !appStatsList.isEmpty()) {
        currentApp = Collections.max(appStatsList, (o1, o2) ->
            Long.compare(o1.getLastTimeUsed(), o2.getLastTimeUsed())).getPackageName();
    }
}