1.需求,内置客户应用并且设置系统桌面,并且保留系统launcher
方式1):
1.直接去掉launch的home属性,去掉home属性会有个bug;
对文件进行修改:
/android/frameworks/base/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
Index: OverviewProxyService.java
===================================================================
--- OverviewProxyService.java (版本 13296)
+++ OverviewProxyService.java (版本 13297)
@@ -83,7 +83,11 @@
import javax.inject.Inject;
import javax.inject.Singleton;
+import android.app.ActivityManager;
+import java.util.List;
+
+
/**
* Class to send information from overview to launcher with a binder.
*/
@@ -108,7 +112,7 @@
private final ComponentName mRecentsComponentName;
private final DeviceProvisionedController mDeviceProvisionedController;
private final List<OverviewProxyListener> mConnectionCallbacks = new ArrayList<>();
- private final Intent mQuickStepIntent;
+ private Intent mQuickStepIntent=null;
private Region mActiveNavBarRegion;
@@ -466,8 +470,13 @@
mConnectionBackoffAttempts = 0;
mRecentsComponentName = ComponentName.unflattenFromString(context.getString(
com.android.internal.R.string.config_recentsComponentName));
- mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
+
+ if( isRunProcess() ) {
+ mQuickStepIntent = new Intent(ACTION_QUICKSTEP)
.setPackage(mRecentsComponentName.getPackageName());
+ }
+
+
mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources());
mSupportsRoundedCornersOnWindows = ScreenDecorationsUtils
.supportsRoundedCornersOnWindows(mContext.getResources());
@@ -494,6 +503,24 @@
statusBarWinController.registerCallback(mStatusBarWindowCallback);
}
+
+
+ //判断是否在主进程,这个方法判断进程名或者pid都可以,如果进程名一样那pid肯定也一样
+ public boolean isRunProcess() {
+ ActivityManager am = ((ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE));
+ List<ActivityManager.RunningAppProcessInfo> infos = am.getRunningAppProcesses();
+ String mainProcessName ="com.android.launcher3";//getPackageName();
+ //int myPid = android.os.Process.myPid();
+ //info.pid == myPid &&
+ for (ActivityManager.RunningAppProcessInfo info : infos) {
+ if ( mainProcessName.equals(info.processName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
public void notifyBackAction(boolean completed, int downX, int downY, boolean isButton,
boolean gestureSwipeLeft) {
try {
@@ -753,9 +780,11 @@
}
private void updateEnabledState() {
- mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,
- MATCH_SYSTEM_ONLY,
- ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;
+ if(mQuickStepIntent!=null){
+ mIsEnabled = mContext.getPackageManager().resolveServiceAsUser(mQuickStepIntent,
+ MATCH_SYSTEM_ONLY,
+ ActivityManagerWrapper.getInstance().getCurrentUserId()) != null;
+ }
}
@Override
@@ -772,7 +801,9 @@
.isCurrentUserSetup());
pw.print(" connectionBackoffAttempts="); pw.println(mConnectionBackoffAttempts);
- pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);
+ if( mQuickStepIntent !=null ){
+ pw.print(" quickStepIntent="); pw.println(mQuickStepIntent);
+ }
pw.print(" quickStepIntentResolved="); pw.println(isEnabled());
pw.print(" mSysUiStateFlags="); pw.println(mSysUiStateFlags);
pw.println(" " + QuickStepContract.getSystemUiStateString(mSysUiStateFlags));
方式2:直接设置为默认桌面
参考:https://blog.csdn.net/qq_27256793/article/details/105413675
在全志10上面,这个方法不行,所以做了些修改
/android/frameworks/base/core/java/com/android/internal/app/ResolverActivity.java
Index: ResolverActivity.java
===================================================================
@@ -287,6 +287,19 @@
supportsAlwaysUseOption);
}
+ private boolean setupDefaultLauncher(String packageName) {
+ DisplayResolveInfo info = mAdapter.getDefaultHome(packageName);
+ if (info == null) {
+ Log.w(TAG, "not find default Home");
+ return false;
+ }
+ onTargetSelected(info, true);
+ MetricsLogger.action(this, MetricsProto.MetricsEvent.ACTION_APP_DISAMBIG_ALWAYS);
+ dismiss();
+ return true;
+ }
+
protected void onCreate(Bundle savedInstanceState, Intent intent,
CharSequence title, int defaultTitleRes, Intent[] initialIntents,
List<ResolveInfo> rList, boolean supportsAlwaysUseOption) {
@@ -334,6 +347,16 @@
return;
}
+ //add start
+ boolean isSetDefLauncher= (Settings.System.getInt(getContentResolver(), "xxx", 0) == 0);
+ if(isSetDefLauncher){
+ if(setupDefaultLauncher("xxx")){
+ Settings.System.putInt(getContentResolver(), "xxx", 1);
+ finish();
+ return;
+ }
+ }
+
final ResolverDrawerLayout rdl = findViewById(R.id.contentPanel);
if (rdl != null) {
rdl.setOnDismissedListener(new ResolverDrawerLayout.OnDismissedListener() {
@@ -1632,6 +1655,29 @@
mResolverListController = resolverListController;
}
+ public DisplayResolveInfo getDefaultHome(String packageName){
+ DisplayResolveInfo otherProfile=null;
+ for (int i = 0; i < mUnfilteredResolveList.size(); i++) {
+ ResolvedComponentInfo info = mUnfilteredResolveList.get(i);
+ for (int j = 0; j < info.getCount(); j++) {
+ ResolveInfo _info = info.getResolveInfoAt(j);
+ Log.w(TAG, "info.activityInfo.packageName ="+_info.activityInfo.packageName);
+ if (_info.activityInfo.packageName.equals(packageName)) {
+ otherProfile = new DisplayResolveInfo(info.getIntentAt(j),
+ info.getResolveInfoAt(j),
+ info.getResolveInfoAt(j).loadLabel(mPm),
+ info.getResolveInfoAt(j).loadLabel(mPm),
+ getReplacementIntent(info.getResolveInfoAt(j).activityInfo,
+ info.getIntentAt(j)));
+ return otherProfile;
+ }
+ }
+ }
+ return otherProfile;
+ }
+
public void handlePackagesChanged() {
rebuildList();
if (getCount() == 0) {
方式3:
/android/packages/apps/Provision/src/com/android/provision/DefaultActivity.java
===================================================================
@@ -22,6 +22,18 @@
import android.os.Bundle;
import android.provider.Settings;
+import android.app.AppOpsManager;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PermissionInfo;
+import android.content.pm.ResolveInfo;
+import java.util.ArrayList;
+import java.util.List;
+import android.content.Context;
+
/**
* Application that sets the provisioned bit, like SetupWizard does.
*/
@@ -40,9 +52,112 @@
ComponentName name = new ComponentName(this, DefaultActivity.class);
pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
-
+ setAppPermission("xxx");
+ setHomeDefault("xxx", "xxx");
// terminate the activity.
finish();
}
+
+
+ public void setAppPermission(String pkgName) {
+ PackageManager pm = getApplicationContext().getPackageManager();
+ AppOpsManager mAppOps = (AppOpsManager) getApplicationContext().getSystemService(Context.APP_OPS_SERVICE);
+ try {
+ PackageInfo pkgInfo = pm.getPackageInfo(pkgName, PackageManager.GET_PERMISSIONS);
+ String sharedPkgList[] = pkgInfo.requestedPermissions;
+ for (int i = 0; i < sharedPkgList.length; i++) {
+ String permName = sharedPkgList[i];
+ PermissionInfo permissionInfo;
+ try {
+ permissionInfo = pm.getPermissionInfo(permName, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ continue;
+ }
+ final int opCode = AppOpsManager.permissionToOpCode(permName);
+ boolean hasAopsCode = opCode > AppOpsManager.OP_NONE && opCode < AppOpsManager._NUM_OP;
+ String aopStr = AppOpsManager.permissionToOp(permName);
+ boolean hasAopsOp = aopStr != null;
+ boolean onlyAops = false;
+ final boolean granted = (pkgInfo.requestedPermissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;
+ if ((permissionInfo.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE) != PermissionInfo.PROTECTION_DANGEROUS || (permissionInfo.flags & PermissionInfo.FLAG_INSTALLED) == 0 || (permissionInfo.flags & PermissionInfo.FLAG_REMOVED) != 0) {
+ if (permName.startsWith("android.") && (hasAopsCode || hasAopsOp)) {
+ onlyAops = true;
+ android.util.Log.d("SHENJU", "permissionName=" + permName + ",opCode=" + opCode);
+ } else continue;
+ }
+ boolean isAopsAllowed = mAppOps.checkOpNoThrow(opCode, pkgInfo.applicationInfo.uid, pkgInfo.packageName) == AppOpsManager.MODE_ALLOWED;
+ if ((hasAopsCode || onlyAops) && !isAopsAllowed)
+ mAppOps.setMode(opCode, pkgInfo.applicationInfo.uid, pkgInfo.packageName, AppOpsManager.MODE_ALLOWED);
+ if ((hasAopsOp || onlyAops) && !isAopsAllowed)
+ mAppOps.setUidMode(aopStr, pkgInfo.applicationInfo.uid, AppOpsManager.MODE_ALLOWED);
+ if (!granted && !onlyAops) {
+ pm.grantRuntimePermission(pkgName, permName, android.os.Process.myUserHandle());
+ }
+ // set flags
+ pm.updatePermissionFlags(permName, pkgName, PackageManager.FLAG_PERMISSION_USER_FIXED | PackageManager.FLAG_PERMISSION_USER_SET | PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED, 0, android.os.Process.myUserHandle());
+ }
+ List<AppOpsManager.PackageOps> ops = mAppOps.getOpsForPackage(pkgInfo.applicationInfo.uid, pkgName, null,null);
+ if (ops == null || ops.size() == 0) return;
+ for (AppOpsManager.PackageOps packageOps : ops) {
+ List<AppOpsManager.OpEntry> entries = packageOps.getOps();
+ if (entries == null || entries.size() == 0) continue;
+ for (AppOpsManager.OpEntry opEntry : entries) {
+ mAppOps.setMode(opEntry.getOp(), packageOps.getUid(), pkgName, AppOpsManager.MODE_ALLOWED);
+ }
+ }
+ } catch (Exception e) {
+ android.util.Log.e("SHENJU", "++setAppPermission exception ,the packageName is " + pkgName, e);
+ }
+ }
+
+ public void setHomeDefault(String defaultlauncherpckname, String defaultlauncherclsname) {
+ final PackageManager mPm = getApplicationContext().getPackageManager();
+ // 判断指定的 launcher 是否存在
+ if (hasApkInstalled(defaultlauncherpckname)) {
+ // 清除当前默认 launcher
+ ArrayList<IntentFilter> intentList = new ArrayList<IntentFilter>();
+ ArrayList<ComponentName> cnList = new ArrayList<ComponentName>();
+ mPm.getPreferredActivities(intentList, cnList, null);
+ IntentFilter dhIF = null;
+ for (int i = 0; i < cnList.size(); i++) {
+ dhIF = intentList.get(i);
+ if (dhIF.hasAction(Intent.ACTION_MAIN) && dhIF.hasCategory(Intent.CATEGORY_HOME)) {
+ mPm.clearPackagePreferredActivities(cnList.get(i).getPackageName());
+ }
+ }
+ // 获取所有 launcher activity
+ Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.addCategory(Intent.CATEGORY_HOME);
+ List<ResolveInfo> list = new ArrayList<ResolveInfo>();
+ list = mPm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
+ // 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();
+ // 设置默认 launcher
+ ComponentName launcher = new ComponentName(defaultlauncherpckname, defaultlauncherclsname);
+ ComponentName[] set = new ComponentName[N];
+ int defaultMatch = 0;
+ for (int i = 0; i < N; i++) {
+ ResolveInfo r = list.get(i);
+ set[i] = new ComponentName(r.activityInfo.packageName, r.activityInfo.name);
+ if (launcher.getClassName().equals(r.activityInfo.name)) {
+ defaultMatch = r.match;
+ }
+ }
+ mPm.addPreferredActivity(filter, defaultMatch, set, launcher);
+ }
+ }
+
+ private boolean hasApkInstalled(String pkgname) {
+ try {
+ getApplicationContext().getPackageManager().getPackageInfo(pkgname, 0);
+ } catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
}
网友评论