加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Android获取未安装的APK图标的代码

发布时间:2020-12-15 00:18:20 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import android.a

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

 import java.io.File;  
import java.lang.reflect.Constructor;  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
import android.app.Activity;  
import android.content.Context;  
import android.content.pm.ApplicationInfo;  
import android.content.pm.PackageInfo;  
import android.content.pm.PackageManager;  
import android.content.res.Resources;  
import android.graphics.drawable.Drawable;  
import android.os.Bundle;  
import android.util.DisplayMetrics;  
import android.util.Log;  
import android.view.View;  
import android.widget.ImageView;  

public class FetchAPKIconAct extends Activity {  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        showUninstallAPKIcon("/sdcard/APK/JarodYv.FishPool.apk");  
        getUninatllApkInfo(this,"/sdcard/APK/JarodYv.FishPool.apk");  
    }  
    /** 网传的方法,但获取不成功 */  
    public void getUninatllApkInfo(Context context,String archiveFilePath) {  
        PackageManager pm = context.getPackageManager();  
        PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath,PackageManager.GET_ACTIVITIES);  
        if (info != null) {  
            ApplicationInfo appInfo = info.applicationInfo;  
            Drawable icon = pm.getApplicationIcon(appInfo);  
            ImageView image = (ImageView) findViewById(R.id.apkIconByTradition);  
            image.setVisibility(View.VISIBLE);  
            image.setImageDrawable(icon);  
        }  
    }  
    //  
    private void showUninstallAPKIcon(String apkPath) {  
        String PATH_PackageParser = "android.content.pm.PackageParser";  
        String PATH_AssetManager = "android.content.res.AssetManager";  
        try {  
            // apk包的文件路径  
            // 这是一个Package 解释器,是隐藏的  
            // 构造函数的参数只有一个,apk文件的路径  
            // PackageParser packageParser = new PackageParser(apkPath);  
            Class pkgParserCls = Class.forName(PATH_PackageParser);  
            Class[] typeArgs = new Class[1];  
            typeArgs[0] = String.class;  
            Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);  
            Object[] valueArgs = new Object[1];  
            valueArgs[0] = apkPath;  
            Object pkgParser = pkgParserCt.newInstance(valueArgs);  
            Log.d("ANDROID_LAB","pkgParser:" + pkgParser.toString());  
            // 这个是与显示有关的,里面涉及到一些像素显示等等,我们使用默认的情况  
            DisplayMetrics metrics = new DisplayMetrics();  
            metrics.setToDefaults();  
            // PackageParser.Package mPkgInfo = packageParser.parsePackage(new  
            // File(apkPath),apkPath,// metrics,0);  
            typeArgs = new Class[4];  
            typeArgs[0] = File.class;  
            typeArgs[1] = String.class;  
            typeArgs[2] = DisplayMetrics.class;  
            typeArgs[3] = Integer.TYPE;  
            Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",typeArgs);  
            valueArgs = new Object[4];  
            valueArgs[0] = new File(apkPath);  
            valueArgs[1] = apkPath;  
            valueArgs[2] = metrics;  
            valueArgs[3] = 0;  
            Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,valueArgs);  
            // 应用程序信息包,这个公开的,不过有些函数,变量没公开  
            // ApplicationInfo info = mPkgInfo.applicationInfo;  
            Field appInfoFld = pkgParserPkg.getClass().getDeclaredField("applicationInfo");  
            ApplicationInfo info = (ApplicationInfo) appInfoFld.get(pkgParserPkg);  
            // uid 输出为"-1",原因是未安装,系统未分配其Uid。  
            Log.d("ANDROID_LAB","pkg:" + info.packageName + " uid=" + info.uid);  
            // Resources pRes = getResources();  
            // AssetManager assmgr = new AssetManager();  
            // assmgr.addAssetPath(apkPath);  
            // Resources res = new Resources(assmgr,pRes.getDisplayMetrics(),// pRes.getConfiguration());  
            Class assetMagCls = Class.forName(PATH_AssetManager);  
            Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);  
            Object assetMag = assetMagCt.newInstance((Object[]) null);  
            typeArgs = new Class[1];  
            typeArgs[0] = String.class;  
            Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod("addAssetPath",typeArgs);  
            valueArgs = new Object[1];  
            valueArgs[0] = apkPath;  
            assetMag_addAssetPathMtd.invoke(assetMag,valueArgs);  
            Resources res = getResources();  
            typeArgs = new Class[3];  
            typeArgs[0] = assetMag.getClass();  
            typeArgs[1] = res.getDisplayMetrics().getClass();  
            typeArgs[2] = res.getConfiguration().getClass();  
            Constructor resCt = Resources.class.getConstructor(typeArgs);  
            valueArgs = new Object[3];  
            valueArgs[0] = assetMag;  
            valueArgs[1] = res.getDisplayMetrics();  
            valueArgs[2] = res.getConfiguration();  
            res = (Resources) resCt.newInstance(valueArgs);  
            CharSequence label = null;  
            if (info.labelRes != 0) {  
                label = res.getText(info.labelRes);  
            }  
            // if (label == null) {  
            // label = (info.nonLocalizedLabel != null) ? info.nonLocalizedLabel  
            // : info.packageName;  
            // }  
            Log.d("ANDROID_LAB","label=" + label);  
            // 这里就是读取一个apk程序的图标  
            if (info.icon != 0) {  
                Drawable icon = res.getDrawable(info.icon);  
                ImageView image = (ImageView) findViewById(R.id.apkIconBySodino);  
                image.setVisibility(View.VISIBLE);  
                image.setImageDrawable(icon);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读