Android客制化------设置默认Launcher

来源:互联网 发布:淘宝衣服店铺介绍 编辑:程序博客网 时间:2024/05/22 03:51

要看客户是否需要保留系统默认的Launcher,如果需要保留的话,则需要在framework中去设置,如果不需要的,就挺好处理,在mk文件中添加这个属性LOCAL_OVERRIDES_PACKAGES := Launcher3(实际没有去尝试过这个属性,一般都是让系统不编译所有的Launcher,不同的平台可能不一样,对应去mk中删除,不让其编译即可)
下面提供下保留系统Launcher的情况下设置默认第三方Launcher
有两种方法,大体上都是相似的

diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.javaindex b2174cc..d3f0564 100755--- a/services/core/java/com/android/server/pm/PackageManagerService.java+++ b/services/core/java/com/android/server/pm/PackageManagerService.java@@ -435,6 +435,10 @@ public class PackageManagerService extends IPackageManager.Stub     // If mac_permissions.xml was found for seinfo labeling.     boolean mFoundPolicyFile;+        // set default Launcher+    final private static String DEFAULT_HOME_PACKAGENAME = "com.hexnode.hexnodemdm";+    final private static String DEFAULT_HOME_CLASSNAME = "com.hexnode.mdm.ui.LauncherActivity";+     // If a recursive restorecon of /data/data/<pkg> is needed.     private boolean mShouldRestoreconData = SELinuxMMAC.shouldRestorecon();@@ -3361,6 +3365,12 @@ public class PackageManagerService extends IPackageManager.Stub                         || r0.isDefault != r1.isDefault) {                     return query.get(0);                 }++                                /* set default launcher*/+                if (r0.activityInfo.name.equals(DEFAULT_HOME_CLASSNAME) || r1.activityInfo.name.equals(DEFAULT_HOME_CLASSNAME)){+                    setDefaultHomeActivity(new ComponentName(DEFAULT_HOME_PACKAGENAME,DEFAULT_HOME_CLASSNAME) , userId);+                }+                /* set default launcher*/                 // If we have saved a preference for a preferred activity for                 // this Intent, use that.                 ResolveInfo ri = findPreferredActivity(intent, resolvedType,@@ -3383,6 +3393,26 @@ public class PackageManagerService extends IPackageManager.Stub         return null;     }+            /* set default launcher*/+    private void setDefaultHomeActivity(ComponentName homeActivity ,int userId){+        Slog.d(TAG,"setDefaultHomeActivity "+ homeActivity);+        IntentFilter homeFilter = new IntentFilter(Intent.ACTION_MAIN);+        homeFilter.addCategory(Intent.CATEGORY_HOME);+        homeFilter.addCategory(Intent.CATEGORY_DEFAULT);+        ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();+        ComponentName currentDefaultHome = getHomeActivities(homeActivities);+        ComponentName[] homeComponentSet  = new ComponentName[homeActivities.size()];+        for (int i = 0; i < homeActivities.size(); i++){+            final ResolveInfo candidate = homeActivities.get(i);+            final ActivityInfo info = candidate.activityInfo;+           ComponentName activityName = new ComponentName(info.packageName, info.name);+            homeComponentSet[i] = activityName;+        }+        addPreferredActivity(homeFilter, IntentFilter.MATCH_CATEGORY_EMPTY,+        homeComponentSet, homeActivity, userId);+    }+    /* set default launcher*/+     private ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType,             int flags, List<ResolveInfo> query, boolean debug, int userId) {         final int N = query.size();@@ -12063,24 +12093,32 @@ public class PackageManagerService extends IPackageManager.Stub             String opname) {         // writer         int callingUid = Binder.getCallingUid();-        enforceCrossUserPermission(callingUid, userId, true, false, "add preferred activity");-        if (filter.countActions() == 0) {-            Slog.w(TAG, "Cannot set a preferred activity with no filter actions");-            return;+        /* set default launcher*/+        if (!activity.getClassName().equals(DEFAULT_HOME_CLASSNAME)) {+            enforceCrossUserPermission(callingUid, userId, true, false, "add preferred activity");+            if (filter.countActions() == 0) {+                Slog.w(TAG, "Cannot set a preferred activity with no filter actions");+                return;+            }         }+                /* set default launcher*/         synchronized (mPackages) {-            if (mContext.checkCallingOrSelfPermission(-                    android.Manifest.permission.SET_PREFERRED_APPLICATIONS)-                    != PackageManager.PERMISSION_GRANTED) {-                if (getUidTargetSdkVersionLockedLPr(callingUid)-                        < Build.VERSION_CODES.FROYO) {-                    Slog.w(TAG, "Ignoring addPreferredActivity() from uid "-                            + callingUid);-                    return;-                }-                mContext.enforceCallingOrSelfPermission(-                        android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);+            /* set default launcher*/+            if (!activity.getClassName().equals(DEFAULT_HOME_CLASSNAME)) {+                if (mContext.checkCallingOrSelfPermission(+                        android.Manifest.permission.SET_PREFERRED_APPLICATIONS)+                        != PackageManager.PERMISSION_GRANTED) {+                    if (getUidTargetSdkVersionLockedLPr(callingUid)+                            < Build.VERSION_CODES.FROYO) {+                        Slog.w(TAG, "Ignoring addPreferredActivity() from uid "+                                + callingUid);+                        return;+                    }+                    mContext.enforceCallingOrSelfPermission(+                            android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);+                 }             }+                        /* set default launcher*/             PreferredIntentResolver pir = mSettings.editPreferredActivitiesLPw(userId);             Slog.i(TAG, opname + " activity " + activity.flattenToShortString() + " for user "--1.9.1
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.javaindex ff7ee26..406edee 100755--- a/services/core/java/com/android/server/am/ActivityManagerService.java+++ b/services/core/java/com/android/server/am/ActivityManagerService.java@@ -3257,7 +3257,89 @@ public final class ActivityManagerService extends ActivityManagerNative         return intent;     }+        private void setDefaultLauncher() {+        // get default component+        boolean mFirstLaunch = true;+         String packageName = "com.hexnode.hexnodemdm";+         String className = "com.hexnode.mdm.ui.LauncherActivity";+        if ((packageName != null && packageName.trim().length() > 1) && (className != null && className.trim().length() > 0)) {+            if(mFirstLaunch){+               IPackageManager pm = ActivityThread.getPackageManager();+                ArrayList<IntentFilter> intentList = new ArrayList<IntentFilter>();+                ArrayList<ComponentName> cnList = new ArrayList<ComponentName>();+                mContext.getPackageManager().getPreferredActivities(intentList, cnList, null);+                IntentFilter dhIF;+                for(int i = 0; i < cnList.size(); i++)+                {+                    dhIF = intentList.get(i);+                    if(dhIF.hasAction(Intent.ACTION_MAIN) &&+                    dhIF.hasCategory(Intent.CATEGORY_HOME))+                   {+                        mContext.getPackageManager().clearPackagePreferredActivities(cnList.get(i).getPackageName());+                    }+             }+                Intent intent = new Intent(Intent.ACTION_MAIN);+                intent.addCategory(Intent.CATEGORY_HOME);+                List<ResolveInfo> list = new ArrayList<ResolveInfo>();+                try+                {+                    list = pm.queryIntentActivities(intent,+                        intent.resolveTypeIfNeeded(mContext.getContentResolver()),+                        PackageManager.MATCH_DEFAULT_ONLY,UserHandle.getCallingUserId());+                }catch (RemoteException e) {+                   throw new RuntimeException("Package manager has died", e);+                }+                // get all components and the best match+                IntentFilter filter = new IntentFilter();+                filter.addAction(Intent.ACTION_MAIN);+                filter.addCategory(Intent.CATEGORY_HOME);+                filter.addCategory(Intent.CATEGORY_DEFAULT);+                final int N = list.size();+                ComponentName[] set = new ComponentName[N];+                int bestMatch = 0;+                for (int i = 0; i < N; i++)+                {+                   ResolveInfo r = list.get(i);+                    set[i] = new ComponentName(r.activityInfo.packageName,+                                    r.activityInfo.name);+                    if (r.match > bestMatch) bestMatch = r.match;+               }+                ComponentName launcher = new ComponentName(packageName, className);+                try+                {+                    pm.addPreferredActivity(filter, bestMatch, set, launcher,UserHandle.getCallingUserId());+               } catch (RemoteException e) {+                    throw new RuntimeException("Package manager has died", e);+                }+            }+      }+    }+     boolean startHomeActivityLocked(int userId, String reason) {+        setDefaultLauncher();         if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL                 && mTopAction == null) {             // We are running in factory test mode, but unable to find--1.9.1
原创粉丝点击