我试图获取设备上已安装的应用程序列表,并在RecyclerView中将其及其图标显示出来。
以下代码用于获取应用程序:
Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> installedApps= packageManager.queryIntentActivities(intent, 0);
installedApps.forEach(p-> {
String appName = p.loadLabel(packageManager).toString();
String appPackageName = p.activityInfo.packageName;
Drawable icon = p.loadIcon(packageManager);
ApplicationInfo info = p.activityInfo.applicationInfo;
App_Object appObject = new App_Object(appName, appPackageName, icon, info);
if(!List_AllApps.contains(appObject)) {
List_AllApps.add(appObject);
}
});
List_AllApps.sort(Comparator.comparing(o -> o.app_name));
这里的问题是,即使某些Drawable不为null,它们还是不可见并且无法显示。
我发现上述Drawables确实具有icon.getIntrinsicHeight()和icon.getIntrinsicWidth()为0,这导致它们不可见。
我已经尝试将Drawables转换为ShapeDrawables,因为您可以在那里使用setIntrinsicWidth()和setIntrinsicHeight(),但是我没有成功。 我还尝试设置未显示的Drawable的边界,并尝试将其转换为BitmapDrawables,但没有任何结果。
奇怪的是,有时图标在显示时没有对代码做任何更改,所以这真的让我感到困惑,我还可以尝试解决此问题(getIntrinsicWidth()和getIntrinsicHeight()大于0并具有所需的值。
如何解决此问题?我可以通过其他任何方式调整它们的大小,以便它们显示吗?
下面是在Recyclerview中为Imageview设置Drawable时的外观图: Image
非常感谢您的帮助!
答案 0 :(得分:1)
要显示设备上安装的应用程序的列表,可以使用程序包管理器的GET_META_DATA。
public void getInstalledApplication() {
PackageManager pm = getPackageManager();
List < ApplicationInfo > packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
//You have all list of packages in the device.
for (ApplicationInfo packageInfo: packages) {
//Check if the application is updated or not
if ((packageInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
addToInstalledApps(packageInfo, pm);
} else if ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {//This application is installed in the device system's image
} else {
addToInstalledApps(packageInfo, pm);
}
}
}
现在,您可以获取设备的appName和appIcon。下面是方法。
public void addToInstalledApps(ApplicationInfo packageInfo, PackageManager pm) {
int stringId = packageInfo.labelRes;
String appName = null;
Drawable appIcon = null;
try {
appName = (String) pm.getApplicationLabel(packageInfo);
appIcon = pm.getApplicationIcon(packageInfo);
} catch (Exception e) {
try {
appName = stringId == 0 ? (packageInfo.nonLocalizedLabel != null ? packageInfo.nonLocalizedLabel.toString() : null) : getString(stringId);
} catch (Exception ex) {
ex.printStackTrace();
}
//Exception
e.printStackTrace();
}
if(pm.getLaunchIntentForPackage(packageInfo.packageName) != null && CommonUtil.isValidString(appName)){
//Now you can design your model and insert data as you want.
AppDetailsModel appDetailsModel = new AppDetailsModel(packageInfo.packageName, packageInfo.sourceDir, pm.getLaunchIntentForPackage(packageInfo.packageName), appName, appIcon);
appDetailsModelList.add(appDetailsModel);
}
}
答案 1 :(得分:0)
由于大小为0,您正面临问题。 尝试使用此代码。可能有助于增加尺寸。
private void checkAllPackageData() {
PackageManager packageManager = getActivity().getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN, null).addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> installedApps= packageManager.queryIntentActivities(intent, 0);
for (ResolveInfo p : installedApps){
String appName = p.loadLabel(packageManager).toString();
String appPackageName = p.activityInfo.packageName;
Drawable icon = p.loadIcon(packageManager);
ApplicationInfo info = p.activityInfo.applicationInfo;
try {
Bitmap bitmap= ((BitmapDrawable) icon).getBitmap();
System.out.println("Before "+ bitmap.getHeight());
Bitmap bitmap1= bitmap.copy(Bitmap.Config.ARGB_8888, true);
Bitmap bitmap2 = getResizedBitmap(bitmap1,35,35);
System.out.println(bitmap2.getHeight());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// CREATE A MATRIX FOR THE MANIPULATION
Matrix matrix = new Matrix();
// RESIZE THE BIT MAP
matrix.postScale(scaleWidth, scaleHeight);
// "RECREATE" THE NEW BITMAP
Bitmap resizedBitmap = Bitmap.createBitmap(
bm, 0, 0, width, height, matrix, false);
bm.recycle();
return resizedBitmap;
}