2015-11-14 2 views
3

Я пытаюсь получить работает имя активности (Foreground имя деятельности) от имени пакета, как вы все знаете, что мы можем получить в настоящее время работает имя активности
по этой линииПолучить активность переднего плана из названия пакета?

mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName() 

, но эта работа только пыльник андроид 5,0 мне нужно то же самое в выше 5.0

я могу получить текущее имя пакета, но не активность

ответ

5

безопасности усиливается от андроида леденец; см. эту статью для получения более подробной информации: getAppTask

Вы можете получить действия переднего плана через класс UsageStats; первых, вы должны добавить это разрешение в манифесте:

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" 
            tools:ignore="ProtectedPermissions"/> 

и это заявление:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
package="your_application_package"> 

Это отключит предупреждение, что разрешение на уровне системы и не будут предоставлены третьим сторонних приложений. Пользователь устройства может предоставить разрешение через приложение «Настройки».

Так, в OnCreate() метод вашего MainActivity, проверьте, если пользователь этого разрешения

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
     if(!hasPermission()){ 
      startActivityForResult(
        new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), 
        Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS); 
     } 
    } 

И если нет, попроси пользователь включить его:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS){ 
     if (!hasPermission()){ 
      startActivityForResult(
        new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), 
        Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS); 
     } 
    } 
} 
private boolean hasPermission() { 
    AppOpsManager appOps = (AppOpsManager) 
      getSystemService(Context.APP_OPS_SERVICE); 
    int mode = 0; 
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.KITKAT) { 
     mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, 
       android.os.Process.myUid(), getPackageName()); 
    } 
    return mode == AppOpsManager.MODE_ALLOWED; 
} 

Наконец, вот фрагмент коды для ввода справочной службы, которая дает вам название пакета текущих активных действий переднего плана:

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private String getUsageStatsForegroundActivityName() { 


    UsageStatsManager mUsageStatsManager = (UsageStatsManager) MyApplication.getInstance().getSystemService(Context.USAGE_STATS_SERVICE); 
    long endTime = System.currentTimeMillis(); 
    long beginTime = endTime - 1000 * 60; 

    // result 
    String topActivity = null; 

    // We get usage stats for the last minute 
    List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, beginTime, endTime); 

    // Sort the stats by the last time used 
    if (stats != null) { 
     SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); 
     for (UsageStats usageStats : stats) { 
      mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); 
     } 
     if (mySortedMap != null && !mySortedMap.isEmpty()) { 
      topActivity = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 
      logger.info("topActivity: " + topActivity); 
     } 
    } 
    if (topActivity != null) 
     return topActivity; 
    else 
     return Constant.ACTIVITY_NOT_FOUND; 

} 
+0

Как пользоваться hasPermis sion() – Vishnu

+0

Я обновил свой ответ и добавил hasPermission() method –

+0

Не могли бы вы опубликовать весь класс. Я нашел ошибку в вашем классе как 'Constant.MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS' – user3051460

Смежные вопросы