ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年2月7日 星期二

getTopActivity & GET_TASKS permission check

要知道目前 最前面的 activity 是什麼,可以用: import java.util.List; import android.app.ActivityManager; ... ActivityManager am = (ActivityManager)getContext().getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); Log.d("current task:", "CURRENT Activity ::" + taskInfo.get(0).topActivity.getClassName()); Log.d("Package Name:", " " + taskInfo.get(0).topActivity.getPackageName());
但是 getRunningTasks( ) 需要 GET_TASKS 權限 android.permission.GET_TASKS

getRunningTasks( ) 實際上是 call IActivityManager 的 getTasks(): public List<RunningTaskInfo> getRunningTasks(int maxNum, int flags, IThumbnailReceiver receiver) throws SecurityException { try { return ActivityManagerNative.getDefault().getTasks(maxNum, flags, receiver); } catch (RemoteException e) { // System dead, we will be dead too soon! return null; } }


配合 Hotkey 的動作,如果要作到:依照目前操作的 程式,決定 Hotkey 要 launch 的程式,就要改 framework 裡,hotkey 的 code。

因為這段 code 實際上是在每一個 vm 中 run 的,
所以,要是 這個 package 沒有 GET_TASKS 權限, framework 的 getRunningTasks 就會 fail。

只好.... bypass GET_TASKS 的 permission check!!

修改 ActivityManagerService.java: public List getTask(int maxNum .... ... if (checkCallingPermission(android.Manifest.permission.GET_TASKS) != PackageManager.PERMISSION_GRANTED) { .. 把這段 check comment 掉..



ref:
  1. http://qtcstation.com/2011/01/getting-info-about-your-currently-running-activities/

沒有留言:

標籤

網誌存檔