android-请问在Android开发中如何只获得手机桌面上的App列表

问题描述

请问在Android开发中如何只获得手机桌面上的App列表

我现在能够获得手机中安装的所有App列表,但我只想获得手机桌面上的App列表,请问应该如何解决?

解决方案

第一步:建立基本数据:PakageMod.java

public class PakageMod
{

public String pakageName;//应用的包名
public String appName;//应用的名称
public Drawable icon;//应用图标

public PakageMod() {
super();
}

public PakageMod(String pakageName, String appName, Drawable icon) {
super();
this.pakageName = pakageName;
this.appName = appName;
this.icon = icon;
}
}
第二步:建立适配器
public class DemoGridAdapter extends BaseAdapter {

private LayoutInflater inflater;
private List datas;

public DemoGridAdapter(Context context, List datas) {
super();
inflater = LayoutInflater.from(context);
this.datas = datas;
}

@Override
public int getCount() {
return datas.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
// 使用View的对象itemView与R.layout.item关联
convertView = inflater.inflate(R.layout.apps, null);
holder = new ViewHolder();
holder.icon = (ImageView) convertView.findViewById(R.id.apps_image);
holder.label = (TextView) convertView
.findViewById(R.id.apps_textview);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.icon.setImageDrawable(datas.get(position).icon);
holder.label.setText(datas.get(position).appName);

return convertView;

}

class ViewHolder {
private ImageView icon;
private TextView label;
}
}
第三步:建立适配器的视图:
<?xml version="1.0" encoding="utf-8"?>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical" >

android:id="@+id/apps_image"
android:layout_width="48dip"
android:layout_height="48dip"
android:icon="@drawable/ic_launcher" />

android:id="@+id/apps_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxEms="5"
android:maxLines="1"
android:text="good" />

第四步:在Activity中获取到列表并显示到GridView中,并点击进入应用
public class PackageInfoDemo extends Activity {

private GridView gridview;
private PackageManager pManager;
private List datas;
private String tag = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
// 取得gridview
gridview = (GridView) findViewById(R.id.gridview);
// 获取图片、应用名、包名
pManager = PackageInfoDemo.this.getPackageManager();
List appList = getAllApps(PackageInfoDemo.this);
datas = new ArrayList();
for (int i = 0; i < appList.size(); i++) {
PackageInfo pinfo = appList.get(i);
PakageMod shareItem = new PakageMod();
// 设置图片
shareItem.icon = pManager.getApplicationIcon(pinfo.applicationInfo);
// 设置应用程序名字
shareItem.appName = pManager.getApplicationLabel(
pinfo.applicationInfo).toString();
// 设置应用程序的包名
shareItem.pakageName = pinfo.applicationInfo.packageName;

  datas.add(shareItem);

}
gridview.setAdapter(new baseAdapter(this, datas));

// 点击应用图标时,做出响应
gridview.setOnItemClickListener(new ClickListener());

}

public static List getAllApps(Context context) {

List<PackageInfo> apps = new ArrayList<PackageInfo>();
PackageManager pManager = context.getPackageManager();
// 获取手机内所有应用
List<PackageInfo> packlist = pManager.getInstalledPackages(0);
for (int i = 0; i < packlist.size(); i++) {
  PackageInfo pak = (PackageInfo) packlist.get(i);
  // if()里的值如果<=0则为自己装的程序,否则为系统工程自带
  if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
    // 添加自己已经安装的应用程序
    // apps.add(pak);
  }
  apps.add(pak);
}
return apps;

}

private class ClickListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
    long arg3) {
  Intent intent = new Intent();
  intent = PackageInfoDemo.this.getPackageManager()
      .getLaunchIntentForPackage(datas.get(position).pakageName);
  startActivity(intent);
}

}
}
public class ResolveInfoDemo extends Activity {
private GridView gridview;
private PackageManager pManager;
private List datas;
private String tag = "ResolveInfoDemo";

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
// 取得gridview
gridview = (GridView) findViewById(R.id.gridview);

// 获取图片、应用名、包名
pManager = this.getPackageManager();

datas = new GetAllApps(this).getDatas();
gridview.setAdapter(new DemoGridAdapter(this, datas));
gridview.setOnItemClickListener(new ClickListener());

}

// 当用户点击应用程序图标时,将对这个类做出响应
private class ClickListener implements OnItemClickListener {

@Override
public void onItemClick(AdapterView<?> adapterView, View view, int arg2,
    long arg3) {
  Intent intent = new Intent();
  intent = getPackageManager().getLaunchIntentForPackage(
      datas.get(arg2).pakageName);
  startActivity(intent);
}

}
}public class GetAllApps {

private Context mContext;
private PackageManager packageManager;
private int mIconDpi;
private String tag = "GetAllApps";
private List datas = new ArrayList();

public GetAllApps(Context mContext){
this.mContext = mContext;
ActivityManager activityManager =
(ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
packageManager = mContext.getPackageManager();
mIconDpi = activityManager.getLauncherLargeIconDensity();
}

public void loadAllAppsByBatch() {
List apps = null;
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
apps = packageManager.queryIntentActivities(mainIntent, 0);
for (int i = 0; i < apps.size(); i++) {
String packageName = apps.get(i).activityInfo.applicationInfo.packageName;
String title = apps.get(i).loadLabel(packageManager).toString();
Drawable icon = null;
if(title == null){
title = apps.get(i).activityInfo.name;
}
ActivityInfo info = apps.get(i).activityInfo;
icon = getFullResIcon(info);
datas.add(new PakageMod(packageName,title,icon));
}
}

public Drawable getFullResIcon(ActivityInfo info) {
Resources resources;
try {
resources = packageManager.getResourcesForApplication(
info.applicationInfo);
} catch (PackageManager.NameNotFoundException e) {
resources = null;
}
if (resources != null) {
int iconId = info.getIconResource();

if (iconId != 0) {
return getFullResIcon(resources, iconId);
}
}
return getFullResDefaultActivityIcon();
}

public Drawable getFullResDefaultActivityIcon() {
return getFullResIcon(Resources.getSystem(),
android.R.mipmap.sym_def_app_icon);
}

public Drawable getFullResIcon(Resources resources, int iconId) {
Drawable d;
try {
// requires API level 15 (current min is 14):
d = resources.getDrawableForDensity(iconId, mIconDpi);
} catch (Resources.NotFoundException e) {
d = null;
}

return (d != null) ? d : getFullResDefaultActivityIcon();
}

public List getDatas() {
loadAllAppsByBatch();
return datas;
}
}
这里getDrawableForDensity需要是15版本以上的SDK支持,所有低版本的Launcher不可以使用;

本博文使用的两种方法都不需要配置任何权限;

Android4.2的Launcher中使用ResolveInfo进行获取所用的应用列表,这里的ResolveInfo的Demo也是从Launcher源码中抄出来的

解决方案二:

我是用ListView显示的,当加上下面的语句时,虽然手机系统中的一些包程序不显示了,但像图库,日历这些自带的程序也没了。但如果没有下面的语句,手机中所有的程序都会显示,例如Android系统,网络位置等等。想问一下能不能既把图库,日历这些程序也显示在列表中,而且不让Android系统,网络位置这些根本用户不会接触的程序显示。也就是说能不能只显示手机界面上的APP?
PackageInfo pak = (PackageInfo) packlist.get(i);
// if()里的值如果<=0则为自己装的程序,否则为系统工程自带
if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {

时间: 2024-08-03 17:16:09

android-请问在Android开发中如何只获得手机桌面上的App列表的相关文章

请问在jsp开发中使用的mysql server数据库服务器

问题描述 请问在jsp开发中使用的mysql server数据库服务器 请问在jsp开发中使用的mysql server数据库服务器,在Visual C++ 6.0中也可以使用么?如果可以,请问如何使用? 解决方案 到底你说的是mysql还是sql server?不过这两者都可以在VC中访问,具体你google下 解决方案二: 可以吧,但是6.0都是多少年前的版本了,连sql server会出现各种未知的问题,具体google,楼上正解 解决方案三: 应该是可以的,直接都连接同一个数据库不就可以

如何在WindowsVista或WindowsXP中使回收站出现在桌面上

  我自己修复此问题 要在 Windows Vista 中修复此问题,请按照下列步骤操作: 1. 单击"开始",然后单击"控制面板". 2. 依次单击"外观和个性化"."个性化"和"更改桌面图标". 3. 单击以选中"回收站"复选框,然后单击"确定". 后续步骤 请检查是否已修复此问题.如果已修复,您就完成了本文内容.如果未修复,则可尝试执行"替代方法&qu

Android生存指南之:开发中的注意事项_Android

1. 为Activity声明系统配置变更事件系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去.虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的.

Android生存指南之:开发中的注意事项

1. 为Activity声明系统配置变更事件 系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去.虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的

Android Builder模式在开发中的应用

最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder(R.drawable.default_img) .crossFade() .into(mImageView); 同时在年初的时候,学习RXJava的时候,用链式编程很优雅. Observable .just( "1" , "2" ) .subscribeOn(Sche

Android GZip的使用-开发中网络请求的压缩实例详解_Android

Android  GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.一般服务器中都安装有这个功能模块的,服务器端不需做改动. 当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据. 从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-En

Android GZip的使用-开发中网络请求的压缩实例详解

Android  GZip: gzip是GNUzip的缩写,它是一个GNU自由软件的文件压缩程序. HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术.一般服务器中都安装有这个功能模块的,服务器端不需做改动. 当浏览器支持gzip 格式的时候, 服务器端会传输gzip格式的数据. 从Http 技术细节上讲,就是 http request 头中 有 "Accept-Encoding", "gzip" ,response 中就有返回头Content-En

Android开发中Intent用法总结_Android

本文实例讲述了Android开发中Intent用法.分享给大家供大家参考,具体如下: Android手机软件开发中,Intent作为手机软件开发时很重要的对象需要引起我们的重视,实际上,intent也是体现Android开发具有其独特性的一个标志性的对象. 当一个Activity要启动另外一个Activity的时候,也许一个以前较为熟悉的模式是:调用一个new函数,直接创建具有窗口特征类的对象,又或者直接调用一个启动函数来启动.这种方式简洁.明了,但是却违背了Android开发的理念.Andro

Android开发中LinearLayout布局技巧及layout中drawable属性区别

先介绍drawable属性的区别,这个算是比较简单的,但是还是有一点点的小细节需要进行说明,drawable有五个文件夹,分别为hdpi,ldpi,mdpi,xdpi,xxdpi,这五个文件夹想必大家都知道,其实就是为了适应不同分辨率,由于手机分辨率的不同,因此我们的图片需要适应不同手机的分辨率...hdpi:480x800   mdpi:480x320   ldpi:320x240xdpi:1280x720 xxdpi 1920x1280其实这个数字并不是非常精确的,只是说明每一个阶段都有一个