qq_53827862 2022-06-10 10:33 采纳率: 97.3%
浏览 19
已结题

Android如何安装apk文件

  • 写回答

1条回答 默认 最新

  • 三杯五岳 2022-06-10 10:45
    关注

    先试试手动装一下,是否能打开
    下面是我封装好的,常用方法(包含判断某个应用是否安装、安装应用、打开应用等),拿走不谢

    
        /**
         * 安装apk
         *
         * @param context
         * @param file
         */
        public static void installApk(Context context, File file) {
            Uri uri = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //判断是否是AndroidN以及更高的版本
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
                intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            } else {
                intent.setDataAndType(uri, "application/vnd.android.package-archive");
            }
            context.startActivity(intent);
        }
    
        /**
         * 卸载apk
         *
         * @param context     上下文
         * @param packageName 包名
         */
        public static void uninstallApk(Context context, String packageName) {
            Intent intent = new Intent(Intent.ACTION_DELETE);
            Uri packageURI = Uri.parse("package:" + packageName);
            intent.setData(packageURI);
            context.startActivity(intent);
        }
    
        /**
         * 某应用是否安装
         *
         * @param context
         * @param packageName
         * @return
         */
        public static boolean isApkInstalled(Context context, String packageName) {
            if (TextUtils.isEmpty(packageName))
                return false;
            try {
                ApplicationInfo info = context.getPackageManager().getApplicationInfo(
                        packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
                return false;
            }
        }
    
        public static boolean isApkInstalled(Context context, String packageName, String verName) {
            if (TextUtils.isEmpty(packageName))
                return false;
            try {
                ApplicationInfo info = context.getPackageManager().getApplicationInfo(
                        packageName, PackageManager.GET_UNINSTALLED_PACKAGES);
                String verNameNow = getVerName(context, packageName);
                if (verName.equals(verNameNow))
                    return true;
                else
                    return false;
            } catch (PackageManager.NameNotFoundException e) {
                return false;
            }
        }
    
        /**
         * 打开另一个应用
         *
         * @param activity
         * @param packageName
         * @param className
         * @param errorHint
         */
        public static void showAnotherApp(Activity activity, String packageName,
                                          String className, String errorHint) {
            LogUtils.d(TAG, "showAnotherApp");
            if (AppUtils.isApkInstalled(activity, packageName)) {
                Intent intent = new Intent(Intent.ACTION_MAIN);
                intent.addCategory(Intent.CATEGORY_LAUNCHER);
                ComponentName cn = new ComponentName(packageName, className);
                intent.setComponent(cn);
                activity.startActivity(intent);
            } else {
                ToastUtils.showShortToast(errorHint + "未安装");
            }
        }
    
        /**
         * 根据包名打开应用
         *
         * @param activity
         * @param packagename
         */
        public static void showAnotherAppWithPackageName(Activity activity, String packagename, String errorHint) {
    
            if (AppUtils.isApkInstalled(activity, packagename)) {
                // 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
                PackageInfo packageinfo = null;
                try {
                    packageinfo = activity.getPackageManager().getPackageInfo(packagename, 0);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
                if (packageinfo == null) {
                    return;
                }
    
                // 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
                Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
                //resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
                resolveIntent.setPackage(packageinfo.packageName);
    
                // 通过getPackageManager()的queryIntentActivities方法遍历
                List<ResolveInfo> resolveinfoList = activity.getPackageManager()
                        .queryIntentActivities(resolveIntent, 0);
    
                if (resolveinfoList == null || resolveinfoList.size() == 0) {
                    return;
                }
                ResolveInfo resolveinfo = resolveinfoList.iterator().next();
                if (resolveinfo != null) {
                    // packagename = 参数packname
                    String packageName = resolveinfo.activityInfo.packageName;
                    // 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packagename.mainActivityname]
                    String className = resolveinfo.activityInfo.name;
                    // LAUNCHER Intent
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_LAUNCHER);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    
                    // 设置ComponentName参数1:packagename参数2:MainActivity路径
                    ComponentName cn = new ComponentName(packageName, className);
    
                    intent.setComponent(cn);
                    activity.startActivity(intent);
                }
            } else {
                ToastUtils.showShortToast(errorHint + "未安装");
            }
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 已采纳回答 7月21日
  • 创建了问题 6月10日

悬赏问题

  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示