uni-app 获取安卓手机已安装的应用列表及图标并进行base64转换

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app 获取安卓手机已安装的应用列表及图标并进行base64转换

现在能够获取到应用列表,虽然速度有点慢(500+app大概10秒左右) 但是无法获取到图标的base64,也就是无法使用显示图标 如果有大佬能够解决的麻烦联系我一下QQ51887031,愿意有偿100,谢谢了

plus.android.importClass("java.util.ArrayList");  
plus.android.importClass("android.content.pm.PackageInfo");  
plus.android.importClass("android.content.pm.PackageManager");  
var ApplicationInfo = plus.android.importClass("android.content.pm.ApplicationInfo");  
var MainActivity = plus.android.runtimeMainActivity();  
var PackageManager = MainActivity.getPackageManager();  
var pinfo = plus.android.invoke(PackageManager, "getInstalledPackages", 0);  

alert(pinfo.size());  
if (pinfo != null) {  
    var apklist = [];  
    for (var i = 0; i < pinfo.size(); i++) {  
        var pkginfo = pinfo.get(i);  
        var issysapk = ((pkginfo.plusGetAttribute("applicationInfo").plusGetAttribute("flags") & ApplicationInfo.FLAG_SYSTEM) != 0) ? true : false;  
        if(issysapk == false){  
            const apkinfo = {  
                appName:pkginfo.plusGetAttribute("applicationInfo").loadLabel(PackageManager).toString(),  
                packageName:pkginfo.plusGetAttribute("packageName"),  
                versionName:pkginfo.plusGetAttribute("versionName"),  
                versionCode:pkginfo.plusGetAttribute("versionCode"),  
                appIco:pkginfo.plusGetAttribute("applicationInfo").loadIcon(PackageManager)}  
            apklist.push(apkinfo)}  
        }  
        alert(JSON.stringify(apklist));  
}

2 回复

在uni-app中直接获取安卓手机已安装的应用列表及图标并进行base64转换是一个相对复杂且敏感的操作,因为这涉及到设备的隐私和权限问题。安卓系统通常不允许未经用户明确授权的应用访问这些信息。不过,通过原生插件或Android模块,我们可以实现这一功能。

以下是一个通过uni-app的原生插件机制,利用Android的PackageManager来获取已安装应用列表及其图标,并将其转换为Base64编码的示例。

1. 创建原生插件

首先,需要在Android Studio中创建一个插件项目,用于获取应用列表和图标。

AndroidManifest.xml

确保在AndroidManifest.xml中添加必要的权限:

<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

MainActivity.java (或相应的类)

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Base64;

import java.io.ByteArrayOutputStream;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {
    // 获取应用列表和图标的方法
    public List<String> getInstalledApps() {
        List<String> appList = new ArrayList<>();
        PackageManager pm = getPackageManager();
        List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_META_DATA);
        for (PackageInfo packageInfo : packages) {
            String appName = packageInfo.applicationInfo.loadLabel(pm).toString();
            Drawable icon = packageInfo.applicationInfo.loadIcon(pm);
            Bitmap bitmap = ((BitmapDrawable) icon).getBitmap();
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
            String base64Image = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);
            appList.add(appName + "," + base64Image);
        }
        return appList;
    }
}

2. 在uni-app中调用原生插件

通过uni-app的plus.android.importClassplus.android.invoke来调用这个原生方法。

// 引入Android相关类
const MainActivity = plus.android.importClass('你的包名.MainActivity');
const context = plus.android.runtimeMainActivity();

// 调用原生方法
const installedApps = plus.android.invoke(context, 'getInstalledApps');

// 处理结果
installedApps.forEach(appInfo => {
    const [appName, base64Image] = appInfo.split(',');
    console.log(`App Name: ${appName}`);
    console.log(`Base64 Icon: ${base64Image}`);
});

注意:上述代码仅为示例,实际开发中需要处理更多细节,如权限申请、错误处理等。此外,由于Android版本和厂商定制的差异,某些方法可能无法在所有设备上正常工作。

回到顶部