0

以前に開発されたアプリロックのアンドロイドアプリケーションは、現在の実行プロセスのパッケージ名をロリポップとロリポップのバージョンの両方で取得しています。しかし、今やマシュマロでは、通知のために正しいパッケージ名を得るという問題があります。はい、通知が来たとき、現在実行中のプロセスのパッケージ名が通知が来たアプリパッケージ名に変更されます。要するに私がメッセンジャーにいて、突然whatsapp通知が来て、実行中のプロセスのパッケージ名がcom.whatsappになります。私のアプリのロックが開きます。私は、現在実行中のアプリケーションのパッケージ名を取得するためにこれらのメソッドを使用しています:UsageStatsManagerが新しい通知からpackagenameを返すようになりました。現在実行中ではありません。

// API below 21 
@SuppressWarnings("deprecation") 
public static String getProcessOld(Context c) throws Exception { 
    String topPackageName = null; 
    ActivityManager activity = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> runningTask = activity.getRunningTasks(1); 
    if (runningTask != null) { 
     RunningTaskInfo taskTop = runningTask.get(0); 
     ComponentName componentTop = taskTop.topActivity; 
     topPackageName = componentTop.getPackageName(); 
    } 
    return topPackageName; 
} 

// API 21 and above 
@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public static String getProcessNew(Context c) throws Exception { 
    String st = null; 
    try { 
     // st = getProcess(); 
     UsageStatsManager mUsageStatsManager = (UsageStatsManager) c.getSystemService("usagestats"); 
     long endTime = System.currentTimeMillis(); 
     long beginTime = endTime - 1000 * 10; 

     // We get usage stats for the last minute 
     List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 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()) { 
       st = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 

      } 
     } 

    } catch (Exception e) { 
     Log.d("main", "Wxxxxexx " + e); 

    } 
    return st; 
} 

ですが、私は、ユーザー・インターフェース上でアプリケーションを実行または通知からそれをフィルタリングし、それを削除するだけでパッケージ名を取得する方法のいずれかの方法。この問題は、マシュマロのみから発生します。

+0

通知の読み取りの許可についての考えですか? – JacksOnF1re

答えて

2

代わりqueryUsageStatsを使用しての提案として、あなたはここにqueryEventsを使用し、タイプUsageEvents.Event.MOVE_TO_FOREGROUNDの最後のイベントを取ることができるhttps://stackoverflow.com/a/33748047

イベントは、すでにあなたはまた、タイムスタンプをアクセスできることを確認することではなく、ソートされています。

私は試してみましたが、期待通りに動作しているようです。

+0

解決策は動作していますが、問題はほとんどありません。フォアグラウンドアプリケーションパッケージは、marshmallow.Byデバッグで3秒遅れて検出されます.QueryUsageStatsは、クイックパッケージ情報を返し、その後、フォアグラウンドで正しいパッケージを取得するために3秒かかるqueryEventsを返します。 – WonderSoftwares

関連する問題