uni-app 获取安卓手机已安装的应用列表及图标并进行base64转换
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.importClass
和plus.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版本和厂商定制的差异,某些方法可能无法在所有设备上正常工作。