Android 11.0 设置默认Launcher的方法

不好的方法,修改frameworks/base/core/java/com/android/internal/app/ResolverActivity.java ,修改这个地方,有个问题,会弹窗然后在消失,用户体验不好。

好的方法,修改Provision,然后在用roleManager.addRoleHolderAsUser(roleName, packageName, flags, user, executor, callback);的方法去处理默认值

不好的方法

diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
old mode 100644
new mode 100755
index fadc15912d..65da591017
--- a/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
+++ b/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
@@ -100,7 +100,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-
+import android.os.SystemProperties;
 
 /**
  * This activity is displayed when the system attempts to start an Intent for
@@ -129,6 +129,8 @@ public class ResolverActivity extends Activity implements
     private String mReferrerPackage;
     private CharSequence mTitle;
     private int mDefaultTitleResId;
+	
+
 
     // Whether or not this activity supports choosing a default handler for the intent.
     @VisibleForTesting
@@ -343,7 +345,8 @@ public class ResolverActivity extends Activity implements
             List<ResolveInfo> rList, boolean supportsAlwaysUseOption) {
         setTheme(appliedThemeResId());
         super.onCreate(savedInstanceState);
-
+		
+		
         // Determine whether we should show that intent is forwarded
         // from managed profile to owner or other way around.
         setProfileSwitchMessageId(intent.getContentUserHint());
@@ -425,6 +428,7 @@ public class ResolverActivity extends Activity implements
             mProfileView.setOnClickListener(this::onProfileClick);
             updateProfileViewButton();
         }
+		
 
         final Set<String> categories = intent.getCategories();
         MetricsLogger.action(this, mMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem()
@@ -432,8 +436,46 @@ public class ResolverActivity extends Activity implements
                 : MetricsProto.MetricsEvent.ACTION_SHOW_APP_DISAMBIG_NONE_FEATURED,
                 intent.getAction() + ":" + intent.getType() + ":"
                         + (categories != null ? Arrays.toString(categories.toArray()) : ""));
-    }
-
+		boolean isSetDefLauncher= (Settings.System.getInt(getContentResolver(), "set_def_launcher", 0)  == 0);	
+			if(isSetDefLauncher){	
+			Settings.System.putInt(getContentResolver(), "set_def_launcher", 1);			
+				new Thread() {
+					@Override
+					public void run() {
+						super.run();
+						try {
+							Thread.sleep(1000);//休眠3秒
+						}catch( Exception e){
+
+						}
+						Log.d("sssssssss","Thread 896  = " );
+					/*	if(setupDefaultLauncher("com.teslacoilsw.launcher")){
+							Log.d("sssssssss","Thread = 899" );
+							 onStop();
+							 finish();
+							 return;
+						}
+						*/
+						
+						}
+				}.start();	
+			}		
+    }
+    //用于记录默认home app是否设置过
+	private boolean setupDefaultLauncher(String packageName) {
+		int position = mMultiProfilePagerAdapter.getActiveListAdapter().getDefaultHomePosition(packageName);
+		 Log.w(TAG,"1640 sssss error get DEFAULT_HOME position = "+position);
+		if (position == -1) {
+			Log.w(TAG, "not find default Home");
+			return false;
+		}
+		ResolveInfo ri = mMultiProfilePagerAdapter.getActiveListAdapter().resolveInfoForPosition(position, true);
+		TargetInfo intent = mMultiProfilePagerAdapter.getActiveListAdapter().targetInfoForPosition(position, true);
+		onTargetSelected(intent, false);
+		startSelected(position, true, true);
+		dismiss();
+		return true;
+	}
     private boolean isIntentPicker() {
         return getClass().equals(ResolverActivity.class);
     }
@@ -828,6 +870,7 @@ public class ResolverActivity extends Activity implements
 
             mWorkProfileHasBeenEnabled = isWorkProfileEnabled();
         }
+
     }
 
     private boolean isWorkProfileEnabled() {
@@ -994,16 +1037,19 @@ public class ResolverActivity extends Activity implements
         }
         ResolveInfo ri = mMultiProfilePagerAdapter.getActiveListAdapter()
                 .resolveInfoForPosition(which, hasIndexBeenFiltered);
+		Log.d(TAG, "1098  ri.activityInfo.packageName = " +ri);	//	ri.activityInfo.packageName
         if (mResolvingHome && hasManagedProfile() && !supportsManagedProfiles(ri)) {
             Toast.makeText(this, String.format(getResources().getString(
                     com.android.internal.R.string.activity_resolver_work_profiles_support),
                     ri.activityInfo.loadLabel(getPackageManager()).toString()),
                     Toast.LENGTH_LONG).show();
+					Log.d(TAG, "1098  ri.activityInfo.mResolvingHome = " +mResolvingHome);
             return;
         }
 
         TargetInfo target = mMultiProfilePagerAdapter.getActiveListAdapter()
                 .targetInfoForPosition(which, hasIndexBeenFiltered);
+		//		Log.d(TAG, "1009  ri.activityInfo.packageName =" +ri.activityInfo.packageName);
         if (target == null) {
             return;
         }
@@ -1078,7 +1124,7 @@ public class ResolverActivity extends Activity implements
     protected boolean onTargetSelected(TargetInfo target, boolean alwaysCheck) {
         final ResolveInfo ri = target.getResolveInfo();
         final Intent intent = target != null ? target.getResolvedIntent() : null;
-
+	Log.d(TAG, "Error calling onTargetSelected target  =" + target);
         if (intent != null && (mSupportsAlwaysUseOption
                 || mMultiProfilePagerAdapter.getActiveListAdapter().hasFilteredItem())
                 && mMultiProfilePagerAdapter.getActiveListAdapter().getUnfilteredResolveList() != null) {
@@ -1213,6 +1259,7 @@ public class ResolverActivity extends Activity implements
                     }
                 } else {
                     try {
+						  Log.d(TAG, "Nice calling setLastChosenActivity\n  bestMatch =");
                         mMultiProfilePagerAdapter.getActiveListAdapter()
                                 .mResolverListController.setLastChosen(intent, filter, bestMatch);
                     } catch (RemoteException re) {
@@ -1604,7 +1651,10 @@ public class ResolverActivity extends Activity implements
     private boolean isAutolaunching() {
         return !mRegistered && isFinishing();
     }
+	
+
 
+	
     private void setupProfileTabs() {
         maybeHideDivider();
         TabHost tabHost = findViewById(R.id.profile_tabhost);
diff --git a/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java b/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java
old mode 100644
new mode 100755
index eef722e32b..57f974ca51
--- a/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java
+++ b/frameworks/base/core/java/com/android/internal/app/ResolverListAdapter.java
@@ -377,7 +377,32 @@ public class ResolverListAdapter extends BaseAdapter {
             mContext.getMainThreadHandler().post(mPostListReadyRunnable);
         }
     }
-
+	/*
+ public int getDefaultHomePosition(String packageName){
+            for (int i = 0; i < mDisplayList.size(); i++) {
+                ResolveInfo info =resolveInfoForPosition(i, true);;
+              //  if (DEBUG)
+                Log.w(TAG,"getDefaultHomePosition " + info.activityInfo.packageName);
+                if (info.activityInfo.packageName.equals(packageName)) {
+                   return i;
+                }
+            }
+            return -1;
+        }*/
+	public int getDefaultHomePosition(String packageName){
+		for (int i = 0; i < mDisplayList.size(); i++) {
+			Log.w(TAG," 395 ... mDisplayList.size() " + mDisplayList.size());
+			ResolveInfo info2 = mDisplayList.get(i).getResolveInfo();
+			Log.w(TAG," 39888 ... getDefaultHomePosition " + info2.activityInfo.packageName);
+			if (info2.activityInfo.packageName.equals(packageName)) {
+				Log.w(TAG," 397 getDefaultHomePosition     i = " + i);
+				return i;
+			}
+		}
+		return -1;
+	}		
+	
+		
     private void addResolveInfoWithAlternates(ResolvedComponentInfo rci) {
         final int count = rci.getCount();
         final Intent intent = rci.getIntentAt(0);
@@ -393,6 +418,7 @@ public class ResolverListAdapter extends BaseAdapter {
         if (rci.isPinned()) {
             Log.i(TAG, "Pinned item: " + rci.name);
         }
+		Log.i(TAG, "Pinned item: " + rci.name);
         addResolveInfo(dri);
         if (replaceIntent == intent) {
             // Only add alternates if we didn't get a specific replacement from
@@ -427,6 +453,7 @@ public class ResolverListAdapter extends BaseAdapter {
                 mDisplayList.add(dri);
                 Log.i(TAG, "Add DisplayResolveInfo component: " + dri.getResolvedComponentName()
                         + ", intent component: " + dri.getResolvedIntent().getComponent());
+						getDefaultHomePosition("ssss");
             }
         }
     }
diff --git a/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java b/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
old mode 100644
new mode 100755
index fe0e7d0122..966dd352d6
--- a/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
+++ b/frameworks/base/core/java/com/android/internal/app/chooser/DisplayResolveInfo.java
@@ -45,7 +45,7 @@ public class DisplayResolveInfo implements TargetInfo {
     // b/157272342 is one example but this issue has been reported many times
     private static final boolean ENABLE_CHOOSER_DELEGATE = false;
 
-    private final ResolveInfo mResolveInfo;
+    public final ResolveInfo mResolveInfo;
     private CharSequence mDisplayLabel;
     private Drawable mDisplayIcon;
     private CharSequence mExtendedInfo;

好用的方法:

packages/apps/Provision/AndroidManifest.xml   |  14 ++-
 .../android/provision/DefaultActivity.java    |  57 +++++++++-
 .../provision/TemporaryFileManager.java       | 106 ++++++++++++++++++
 3 files changed, 172 insertions(+), 5 deletions(-)
 mode change 100644 => 100755 packages/apps/Provision/AndroidManifest.xml
 mode change 100644 => 100755 packages/apps/Provision/src/com/android/provision/DefaultActivity.java
 create mode 100755 packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java

diff --git a/packages/apps/Provision/AndroidManifest.xml b/packages/apps/Provision/AndroidManifest.xml
old mode 100644
new mode 100755
index 8360578710..fa1c813c31
--- a/packages/apps/Provision/AndroidManifest.xml
+++ b/packages/apps/Provision/AndroidManifest.xml
@@ -15,14 +15,17 @@
  limitations under the License.
  -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.android.provision">
+        package="com.android.provision"
+		android:sharedUserId="android.uid.system">
 
     <original-package android:name="com.android.provision" />
 
     <!-- For miscellaneous settings -->
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
-
+	<uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS" />
+	<uses-permission android:name="android.permission.MANAGE_ROLE_HOLDERS" />
+    <uses-permission android:name="android.permission.OBSERVE_ROLE_HOLDERS" />
     <application>
         <activity android:name="DefaultActivity"
                 android:excludeFromRecents="true">
@@ -33,6 +36,13 @@
                 <category android:name="android.intent.category.SETUP_WIZARD" />
             </intent-filter>
         </activity>
+	<!-- 		   	<receiver android:name=".TemporaryFileManager"
+        android:exported="true">
+        <intent-filter>
+            <action android:name="android.intent.action.BOOT_COMPLETED" />
+            <action android:name="com.chengwei.BOOT_COMPLETED" />
+        </intent-filter>
+		 </receiver>-->
     </application>
 </manifest>
 
diff --git a/packages/apps/Provision/src/com/android/provision/DefaultActivity.java b/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
old mode 100644
new mode 100755
index 031f3b1603..449604d2f7
--- a/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
+++ b/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
@@ -21,7 +21,15 @@ import android.content.ComponentName;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
 import android.provider.Settings;
-
+import android.util.Log;
+import android.os.SystemProperties;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ResolveInfo;
+import java.util.List;
 /**
  * Application that sets the provisioned bit, like SetupWizard does.
  */
@@ -30,11 +38,11 @@ public class DefaultActivity extends Activity {
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
-
+		Log.i("provision","DefaultActivity  onCreate 41");
         // Add a persistent setting to allow other apps to know the device has been provisioned.
         Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
         Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
-
+	//	initLauncher ();
         // remove this activity from the package manager.
         PackageManager pm = getPackageManager();
         ComponentName name = new ComponentName(this, DefaultActivity.class);
@@ -44,5 +52,48 @@ public class DefaultActivity extends Activity {
         // terminate the activity.
         finish();
     }
+	
+	
+	 public void initLauncher (){
+
+		String ORIGINAL_LAUNCHER_PACKAGENAME = "com.teslacoilsw.launcher";//鍖呭悕  com.teslacoilsw.launcher/com.teslacoilsw.launcher.NovaLauncher
+    	String ORIGINAL_LAUNCHER_CLASSNAME = "com.teslacoilsw.launcher.NovaLauncher";	//绫诲悕
+        Intent queryIntent = new Intent();
+		final PackageManager mPm = this.getPackageManager();
+        queryIntent.addCategory(Intent.CATEGORY_HOME);
+        queryIntent.setAction(Intent.ACTION_MAIN);
+
+        List<ResolveInfo> homeActivities = mPm.queryIntentActivities(queryIntent, 0);
+        if(homeActivities == null) {
+            return ;
+        }
+
+        ComponentName defaultLauncher = new ComponentName(ORIGINAL_LAUNCHER_PACKAGENAME,
+                ORIGINAL_LAUNCHER_CLASSNAME);
+        int activityNum = homeActivities.size();
+        ComponentName[] set = new ComponentName[activityNum];
+        int defaultMatch = -1;
+        for(int i = 0; i < activityNum; i++){
+            ResolveInfo info = homeActivities.get(i);
+            set[i] = new ComponentName(info.activityInfo.packageName, info.activityInfo.name);
+            if(ORIGINAL_LAUNCHER_CLASSNAME.equals(info.activityInfo.name)
+                    && ORIGINAL_LAUNCHER_PACKAGENAME.equals(info.activityInfo.packageName)){
+                defaultMatch = info.match;
+            }
+        }
+
+        //if Launcher is not found, do not set anything
+        if(defaultMatch == -1){
+            return ;
+        }
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Intent.ACTION_MAIN);
+        filter.addCategory(Intent.CATEGORY_HOME);
+        filter.addCategory(Intent.CATEGORY_DEFAULT);
+
+        mPm.addPreferredActivity(filter, defaultMatch, set, defaultLauncher);
+	//	SystemProperties.set("persist.sys.defualt.launcher",String.valueOf(1));
+    }
+
 }
 
diff --git a/packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java b/packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java
new file mode 100755
index 0000000000..18a989020f
--- /dev/null
+++ b/packages/apps/Provision/src/com/android/provision/TemporaryFileManager.java
@@ -0,0 +1,106 @@
+package com.android.provision;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.SystemClock;
+import android.util.Log;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+//import com.android.permissioncontroller.permission.model.AppPermissionGroup;
+//import com.android.permissioncontroller.permission.model.AppPermissions;
+//import com.android.permissioncontroller.permission.model.Permission;
+//import com.android.permissioncontroller.permission.utils.ArrayUtils;
+//import com.android.permissioncontroller.permission.utils.Utils;
+import java.util.List;
+
+import java.io.File;
+import java.io.IOException;
+
+import android.app.role.RoleManager;
+import android.os.UserHandle;
+import android.os.Process;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+import android.content.SharedPreferences;
+import android.content.SharedPreferences.Editor;
+
+/**
+ * Manages files of the package installer and resets state during boot.
+ */
+public class TemporaryFileManager extends BroadcastReceiver {
+    private static final String LOG_TAG = TemporaryFileManager.class.getSimpleName();
+
+    private  void setBootFlag(Context context, int flag){
+       SharedPreferences sharedPreferences = context.getSharedPreferences("boot_CONFIG", 
+            Context.MODE_PRIVATE);
+       Editor editor = sharedPreferences.edit();
+       editor.putInt("boot_flag", flag).commit();
+    }
+
+    private  boolean isFirstBoot(Context context){
+        SharedPreferences sharedPreferences = context.getSharedPreferences("boot_CONFIG", 
+            Context.MODE_PRIVATE);
+       return sharedPreferences.getInt("boot_flag", 0) == 0;
+    }
+
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        Log.e("settingssssssstemf", "action==="+ intent.getAction());
+
+        if (isFirstBoot(context)) {
+			 Log.e("settingssssssstemf", "is first onReceive action==="+ intent.getAction());
+            setRoleHolderAsUser(context, "com.teslacoilsw.launcher");
+            setBootFlag(context, 1);
+        }
+
+        long systemBootTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
+
+        File[] filesOnBoot = context.getNoBackupFilesDir().listFiles();
+
+        if (filesOnBoot == null) {
+            return;
+        }
+
+        for (int i = 0; i < filesOnBoot.length; i++) {
+            File fileOnBoot = filesOnBoot[i];
+
+            if (systemBootTime > fileOnBoot.lastModified()) {
+                boolean wasDeleted = fileOnBoot.delete();
+                if (!wasDeleted) {
+                    Log.w(LOG_TAG, "Could not delete " + fileOnBoot.getName() + " onBoot");
+                }
+            } else {
+                Log.w(LOG_TAG, fileOnBoot.getName() + " was created before onBoot broadcast was "
+                        + "received");
+            }
+        }
+    }
+
+    public void setRoleHolderAsUser(Context context, String packageName) {
+        String roleName = "android.app.role.HOME";
+        boolean add = true;
+        int flags = 0;
+        UserHandle user = Process.myUserHandle();
+
+        Log.i("settingssssssstemf", (add ? "Adding" : "Removing") + " package as role holder, role: "
+                    + roleName + ", package: " + packageName);
+
+        RoleManager roleManager = context.getSystemService(RoleManager.class);
+        Executor executor = context.getMainExecutor();
+        Consumer<Boolean> callback = successful -> {
+            if (successful) {
+                Log.d("settingssssssstemf", "Package " + (add ? "added" : "removed")
+                            + " as role holder, role: " + roleName + ", package: " + packageName);
+            } else {
+                Log.d("settingssssssstemf", "Failed to " + (add ? "add" : "remove")
+                            + " package as role holder, role: " + roleName + ", package: "
+                            + packageName);
+            }
+        };
+
+        roleManager.addRoleHolderAsUser(roleName, packageName, flags, user, executor, callback);
+        Log.i("settingssssssstemf", "addRoleHolderAsUser done");
+    }
+}

Android设备的默认launcher设置是指系统默认的启动器(Launcher应用程序。启动器是用户在设备上看到和操作的主屏幕,它提供了桌面、应用程序列表、小部件和壁纸等功能。 在Android设备上,不同的制造商可能会有不同的默认启动器设置,例如Samsung可能会有自己的启动器样式,而Google的Pixel设备则使用原生的Android启动器。 默认启动器有以下几个主要特点和功能: 1. 桌面:默认启动器会在设备主屏幕上显示桌面,用户可以在桌面上添加和管理应用程序、小部件和快捷方式等。 2. 应用程序列表:用户可以通过默认启动器访问设备上安装的所有应用程序的列表,并进行搜索和排序。 3. 小部件:默认启动器支持用户在桌面上添加各种小部件,例如天气、日历、音乐播放器等,以便用户更方便地获取相关信息。 4. 壁纸:默认启动器还允许用户更改桌面背景壁纸,可以选择自己喜欢的图片或者使用系统提供的预设壁纸。 对于用户来说,选择适合自己的默认启动器可以增加使用Android设备的个性化和便利性。用户可以根据自己的需求和偏好,选择不同功能和样式的启动器来进行设置。有些启动器还提供了更多的自定义选项,例如主题、图标包等,使用户能够将设备界面个性化到自己喜欢的样子。 总之,Android设备的默认启动器设置是一个重要的用户体验方面的设置选项,通过它可以实现设备主屏幕的个性化和功能拓展。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值