Apk扫描、解析、安装

QuibblerQuibbler 2020-02-04 约 9 分钟 1721 次阅读

1、扫描手机存储的APK安装包

废话少说直接上代码,借助ContentResolver查询系统APK的媒体类型"application/vnd.android.package-archive",通过"mime_type=\"application/vnd.android.package-archive\""筛选,即可获得手机存储的所有APK文件。

Cursor cursor = context.getContentResolver().query(MediaStore.Files.getContentUri("external"), null,
                "mime_type=\"application/vnd.android.package-archive\"", null, null);
                
        if (null != cursor) {
            while (cursor.moveToNext()) {
                //APK文件名
                String title = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.TITLE));
                //APK全路径path
                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Files.FileColumns.DATA));
                //APK大小
                int size = cursor.getInt(cursor.getColumnIndex(MediaStore.Files.FileColumns.SIZE))
            }
            cursor.close();
        }

2、获取APK包中的信息

通过PackageManager获取指定path路径apk的PackageInfo信息,从中可以获取版本号、VersionCode、包名等信息。

PackageManager packageManager = context.getPackageManager();
    PackageInfo packageInfo = packageManager.getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES);
    if (null != packageInfo) {
        String packageName = packageInfo.packageName;
        String versionName = packageInfo.versionName;
        int versionCode = packageInfo.versionCode
    }

3、安装APK

获得到APK的path,就可以调用系统安装apk的程序进行安装。

public static boolean install(Context context, String apkPath) {
        File file = new File(apkPath);
        if (!file.exists() || !file.isFile() || file.length() < 0) {
            return false;
        }
        
        Intent intent = new Intent(Intent.ACTION_VIEW);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri uri = FileProvider.getUriForFile(context, "androidstudio.fileprovider", file);
            intent.setDataAndType(uri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        }
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
        return true;
    }

这里有一个大坑,应使用 FileProvider 类进行此授权。

        在应用间共享文件

        对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。

在AndroidManifest中添加FileProvider

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="androidstudio.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/filepaths" />
    </provider>

在res/xml/资源目录下新建filepaths.xml

<?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="external" path="."/>
    </paths>

使用下面的方式获取URI

Uri uri =  FileProvider.getUriForFile(context,authority, file);

相关资料:

        使用Intent安装APK方法(兼容Android N)

本机APP扫描、打开第三方APP、卸载

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w

评论 (1)

评论功能已关闭,仅展示历史评论
Quibbler
Quibbler

       再次遇到,辛亏之前看过APK安卓的技术。Android N之后不能再通过普通的Uri,而是要通过FileProvider提供Uri。而且需要注意一点,一定要给Intent加一个flag:

    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        否则打开调起应用安装包程序进行安装会失败: