目录

一, 设置所有App默认授予权限

二,设置默认Launcher

三,设置默认浏览器

四,根据包名启动应用

五,通过反射静默安装应用


一, 设置所有App默认授予权限

 public void setAllowAllAppPermission(){//获取PackageManagerPackageManager packageManager = getApplicationContext().getPackageManager();//获取所有已安装程序的包信息List<PackageInfo> packageInfos = packageManager.getInstalledPackages(0);//用于存储所有已安装程序的包名List<String> packageNames = new ArrayList<>();//从pinfo中将包名字逐一取出,压入pName list中if (packageInfos != null) {for (int i = 0; i < packageInfos.size(); i++) {String packName = packageInfos.get(i).packageName;packageNames.add(packName);setAppPermission(packName);}}}// 给apk 全部需要的权限 STARTpublic void setAppPermission(String pkgName) {PackageManager pm = getApplicationContext().getPackageManager();AppOpsManager mAppOps = getApplicationContext().getSystemService(AppOpsManager.class);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(TAG, "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, Process.myUserHandle());}// set flagspm.updatePermissionFlags(permName, pkgName, PackageManager.FLAG_PERMISSION_USER_FIXED | PackageManager.FLAG_PERMISSION_USER_SET| PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED, 0, Process.myUserHandle());}List<AppOpsManager.PackageOps> ops = mAppOps.getOpsForPackage(pkgInfo.applicationInfo.uid, pkgName, null);if(ops == null ||ops.size() == 0)return;for (PackageOps packageOps : ops) {List<OpEntry> entries = packageOps.getOps();if(entries == null || entries.size() == 0)continue;for (OpEntry opEntry : entries) {mAppOps.setMode(opEntry.getOp(), packageOps.getUid(), pkgName, AppOpsManager.MODE_ALLOWED);}}} catch (Exception e) {android.util.Log.e(TAG, "++setAppPermission exception ,the packageName is " + pkgName, e);}}

二,设置默认Launcher

public void setDefaultLauncher() {String defaultPackageName = SystemProperties.get("persist.android.launcher.packagename");String defaultActivityName = SystemProperties.get("persist.android.launcher.activityname");Log.d(TAG, "++ setDefaultLauncher defaultPackageName:" + defaultPackageName + ", defaultActivityName:" + defaultActivityName);final PackageManager mPm = getApplicationContext().getPackageManager();// 判断指定的launcher是否存在if (hasApkInstalled(defaultPackageName)) {// 清除当前默认launcherArrayList<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 activityIntent 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 matchIntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_MAIN);filter.addCategory(Intent.CATEGORY_HOME);filter.addCategory(Intent.CATEGORY_DEFAULT);final int N = list.size();// 设置默认launcherComponentName launcher = new ComponentName(defaultPackageName,defaultActivityName);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);Log.d(TAG, "&& setDefaultLauncher defaultPackageName:" + defaultPackageName + ", defaultActivityName:" + defaultActivityName);}}private boolean hasApkInstalled(String pkgname) {try {getApplicationContext().getPackageManager().getPackageInfo(pkgname, 0);} catch (Exception e) {return false;}return true;}

三,设置默认浏览器

    private void setDefaultBrowser(){String defaultPackageName = SystemProperties.get("persist.android.browser.packagename");String defaultActivityName = SystemProperties.get("persist.android.browser.activityname");Log.d(TAG, "++ setDefaultBrowser defaultPackageName:" + defaultPackageName + ", defaultActivityName:" + defaultActivityName);PackageManager pm = getApplicationContext().getPackageManager();Intent intent = new Intent(Intent.ACTION_MAIN, null);intent.addCategory("android.intent.category.BROWSABLE");List<ResolveInfo> resolveInfoList = pm.queryIntentActivities(intent,0);int size = resolveInfoList.size();ComponentName[] arrayOfComponentName = new ComponentName[size];for (int i = 0; i < size; i++) {ActivityInfo mActivityInfo = resolveInfoList.get(i).activityInfo;String packageName = mActivityInfo.packageName;String className = mActivityInfo.name;ComponentName componentName = new ComponentName(packageName,className);arrayOfComponentName[i] = componentName;if(packageName.equals(defaultActivityName) && className.equals(defaultActivityName)){pm.clearPackagePreferredActivities(packageName);pm.setDefaultBrowserPackageNameAsUser(packageName,0);Log.d(TAG, "&& setDefaultBrowser defaultPackageName:" + defaultPackageName + ", defaultActivityName:" + defaultActivityName);}}}

四,根据包名启动应用

    private void doStartApplicationWithPackageName(String packagename) {               PackageInfo packageinfo = null;try {packageinfo = mContext.getPackageManager().getPackageInfo(packagename, 0);} catch (NameNotFoundException e) {e.printStackTrace();}if (packageinfo == null) {return;}               Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);resolveIntent.setPackage(packageinfo.packageName);              List<ResolveInfo> resolveinfoList = mContext.getPackageManager().queryIntentActivities(resolveIntent, 0);ResolveInfo resolveinfo = resolveinfoList.iterator().next();if (resolveinfo != null) {                      String packageName = resolveinfo.activityInfo.packageName;                      String className = resolveinfo.activityInfo.name;                       Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_LAUNCHER);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                         ComponentName cn = new ComponentName(packageName, className);intent.setComponent(cn);mContext.startActivity(intent);}}
}

五,通过反射静默安装应用

private void installApkInSilence(String installPath,String packageName) {if (installPath == null || installPath.length() == 0) {Log.e(TAG, "installPath: error path");return;}File file = new File(installPath);if (file.length() <= 0 || !file.exists() || !file.isFile()) {Log.e(TAG, "installPath:  error file");return;}Class<?> pmService;Class<?> activityTherad;Method method;try {activityTherad = Class.forName("android.app.ActivityThread");Class<?> paramTypes[] = getParamTypes(activityTherad, "getPackageManager");method = activityTherad.getMethod("getPackageManager", paramTypes);Object PackageManagerService = method.invoke(activityTherad);pmService = PackageManagerService.getClass();Class<?> paramTypes1[] = getParamTypes(pmService, "installPackageAsUser");method = pmService.getMethod("installPackageAsUser", paramTypes1);method.invoke(PackageManagerService, installPath, null, PackageManager.INSTALL_REPLACE_EXISTING, packageName, getUse} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
}private Class<?>[] getParamTypes(Class<?> cls, String mName) {Class<?> cs[] = null;Method[] mtd = cls.getMethods();for (int i = 0; i < mtd.length; i++) {if (!mtd[i].getName().equals(mName)) {continue;}cs = mtd[i].getParameterTypes();}return cs;
}
public static final int PER_USER_RANGE = 100000;
public static int getUserId(int uid) {return uid / PER_USER_RANGE;
}public  String getApkPkgName(String filePath) {if (TextUtils.isEmpty(filePath))return null;PackageManager pm = mContext.getPackageManager();PackageInfo info = pm.getPackageArchiveInfo(filePath,PackageManager.GET_ACTIVITIES);if (info != null) {ApplicationInfo appInfo = info.applicationInfo;String packname = appInfo.packageName;return packname;} else {return null;}
}

Android 常用的函数记录相关推荐

  1. Android 常用adb指令记录总结

    Android 日常开发adb指令记录(不断更新): 注:这里包名均使用com.redsun.phone代替. 一.java -version: 查看java安装版本 二.adb  shell: 查看 ...

  2. Android常用第三方框架记录

    先记录,万一用到呢(如果有好的框架,请不吝推荐) 1.腾讯TBS浏览器WebView,避免系统WebView的多坑. 2.智能布局加载更多:SmartRefreshLayout 3.沉浸式布局:Imm ...

  3. PHP验证码常用的函数记录

    1.绘制真彩画布,返回资源类型的图像标识符 resource imagecreatetruecolor ( int $width , int $height ) 例:$image = imagecre ...

  4. python中常用函数表_Python常用函数记录

    Python常用函数/方法记录 一. Python的random模块: 导入模块: import random 1. random()方法: 如上如可知该函数返回一个[0,1)(左闭右开)的一个随机的 ...

  5. OpenCV学习+常用函数记录①:图像的基本处理

    OpenCV 图像的基本处理 1.1 图片读取和显示 1.2 写入文件(保存) 1.3 像素操作 1.4 图片剪切 1.5 镜像处理: 1.6 图像缩放 1.7 图像位移 1.8 图像旋转 1.9 仿 ...

  6. Android常用开源项目

    Android开源项目第一篇--个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Progre ...

  7. android常用代码合集,Android常用代码

    1.图片旋转 Bitmap bitmapOrg = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable. ...

  8. Android常用的第三方开源库和框架

    第三方开源库和组件 一个专注于平滑滚动的Android图像加载和缓存库 https://github.com/bumptech/glide 图片缓存Universal-Image-Loader: ht ...

  9. Android常用面试题大全

    1.TCP和UDP之间的区别?什么是URL ? TCP被称为用户数据报协议;UDP被称为信息传输控制协议;URL被称为统一资源定位符,通过统一资源定位符可以唯一定位到互联网上的某个资源(图片.视频.音 ...

最新文章

  1. python3 内置函数map 返回的迭代器转为列表
  2. 在 ASP.NET 中执行 URL 重写
  3. 8张图让你一步步看清 async/await 和 promise 的执行顺序
  4. android studio 开发android app 真机调试
  5. java学习笔记(十三)----IO操作
  6. vue2.x 综合教程 一
  7. ob_start ob_end_clean的用法 fetch
  8. 计算机键盘音乐好汉歌,好汉歌 MIDI File Download :: MidiShow
  9. Enable Authentication on MongoDB
  10. P2323-[HNOI2006]公路修建问题【并查集】
  11. linux命令passwd各个参数含义
  12. Soul 网关源码阅读(六)Sofa请求处理概览
  13. CDH-5.13.1离线安装教程
  14. WCF编程]WCF使用Net.tcp绑定时候出现错误:元数据包含无法解析的引用
  15. sqldependency 的使用
  16. CodeSmith连接MySql数据库
  17. 联想移动裁员为求自保 摩托罗拉品牌逐渐消退
  18. 为什么if else过多会影响程序性能?(英文版)
  19. python爬取有道词典_python爬取有道词典json报错,求帮助!
  20. 织梦会员中心注册登录

热门文章

  1. 错误:”未能加载文件或程序集“System.Web.Mvc, Version=2.0.0.0” 解决方法
  2. 自定义SpringBoot Starter实现
  3. goroutine sync.RWMutex读写锁RLock的使用
  4. ubuntu deepin python/python3安装pip/pip3
  5. Linux安全技术和防火墙介绍
  6. Spark常规性能调优三:并行度调节
  7. Python 一次for遍历多个列表及遍历时获取index
  8. 请问当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?
  9. CentOS 7 如何按行删除文件内容
  10. spring aop记录日志方案设计