获取Android中已安装快捷方式的应用程序图标

获取Android中已安装快捷方式的应用程序图标,android,Android,我正在从设备创建已安装应用程序的快捷方式。我想获得我的应用程序中所有应用程序的启动程序图标。但由于我不知道获得它的代码,所以我同时使用了这个(它是我正在开发的当前应用程序的图标): 您能帮我从设备上获取已安装应用程序的启动程序图标吗 这是我安装快捷方式的代码 ActivityInfo ai = res.get(app_id).activityInfo; Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); shortcutInte

我正在从设备创建已安装应用程序的快捷方式。我想获得我的应用程序中所有应用程序的启动程序图标。但由于我不知道获得它的代码,所以我同时使用了这个(它是我正在开发的当前应用程序的图标):

您能帮我从设备上获取已安装应用程序的启动程序图标吗

这是我安装快捷方式的代码

 ActivityInfo ai = res.get(app_id).activityInfo;

 Intent shortcutIntent = new Intent(Intent.ACTION_MAIN);
 shortcutIntent.setClassName(ai.packageName, ai.name);
 shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

 Intent intent = new Intent();
 intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
 intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, appName);
 intent.putExtra("duplicate", false);
 intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(context, R.drawable.ic_launcher));
 intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");      
 context.sendBroadcast(intent);

到目前为止,应用程序还不能强迫自己进入主屏幕。它基本上被添加到launcher应用程序维护的应用程序列表中,通常主屏幕由用户控制。如果让应用程序能够在主屏幕上乱七八糟,那将是一个滥用的公开邀请。

如果你想在你的设备上显示所有应用程序的图标并将其显示为girdview,请遵循以下代码。希望有帮助

MainActivity.java

public class MainActivity extends Activity {

GridView mGrid;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    loadApps();

    setContentView(R.layout.activity_main);
    mGrid = (GridView) findViewById(R.id.myGrid);
    mGrid.setAdapter(new AppsAdapter());
}

private List<ResolveInfo> mApps;

private void loadApps() {
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);

    mApps = getPackageManager().queryIntentActivities(mainIntent, 0);
}

public class AppsAdapter extends BaseAdapter {
    public AppsAdapter() {
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        CheckableLayout l;
        ImageView i;

        if (convertView == null) {
            i = new ImageView(MainActivity.this);
            i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setLayoutParams(new ViewGroup.LayoutParams(50, 50));
            l = new CheckableLayout(MainActivity.this);
            l.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.WRAP_CONTENT,
                    GridView.LayoutParams.WRAP_CONTENT));
            l.addView(i);
        } else {
            l = (CheckableLayout) convertView;
            i = (ImageView) l.getChildAt(0);
        }

        ResolveInfo info = mApps.get(position);
        i.setImageDrawable(info.activityInfo.loadIcon(getPackageManager()));

        return l;
    }


    public final int getCount() {
        return mApps.size();
    }

    public final Object getItem(int position) {
        return mApps.get(position);
    }

    public final long getItemId(int position) {
        return position;
    }
}

public class CheckableLayout extends FrameLayout implements Checkable {
    private boolean mChecked;

    public CheckableLayout(Context context) {
        super(context);
    }

    public void setChecked(boolean checked) {
        mChecked = checked;
//            setBackgroundDrawable(checked ?
//                    getResources().getDrawable(R.drawable.blue)
//                    : null);
            setBackground(checked ?
                    getResources().getDrawable(R.color.black)
                    : null);


    }

    public boolean isChecked() {
        return mChecked;
    }

    public void toggle() {
        setChecked(!mChecked);
    }

}
公共类MainActivity扩展活动{
GridView-mGrid;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
loadApps();
setContentView(R.layout.activity_main);
mGrid=(GridView)findviewbyd(R.id.myGrid);
mGrid.setAdapter(新的AppsAdapter());
}
私人名单地图;
私有void loadApps(){
意图maintent=新意图(Intent.ACTION\u MAIN,空);
mainIntent.addCategory(Intent.CATEGORY_启动器);
mApps=getPackageManager().QueryInputActivities(mainIntent,0);
}
公共类AppsAdapter扩展BaseAdapter{
公共AppsAdapter(){
}
公共视图getView(int位置、视图转换视图、视图组父视图){
可检查布局l;
图像视图i;
if(convertView==null){
i=新图像视图(MainActivity.this);
i、 setScaleType(ImageView.ScaleType.FIT_CENTER);
i、 setLayoutParams(新视图组.LayoutParams(50,50));
l=新的可检查布局(MainActivity.this);
l、 setLayoutParams(新建GridView.LayoutParams(GridView.LayoutParams.WRAP_内容,
GridView.LayoutParams.WRAP_CONTENT);
l、 addView(i);
}否则{
l=(CheckableLayout)convertView;
i=(ImageView)l.getChildAt(0);
}
ResolveInfo=mApps.get(位置);
i、 setImageDrawable(info.activityInfo.loadIcon(getPackageManager());
返回l;
}
公共最终整数getCount(){
返回mApps.size();
}
公共最终对象getItem(int位置){
返回mApps.get(位置);
}
公共最终长getItemId(int位置){
返回位置;
}
}
公共类CheckableLayout扩展FrameLayout实现可检查{
私有布尔mChecked;
公共可检查布局(上下文){
超级(上下文);
}
公共void setChecked(布尔值已选中){
mChecked=已检查;
//可缩回地面拉深(检查?
//getResources().getDrawable(R.drawable.blue)
//:空);
后退地面(已检查?
getResources().getDrawable(R.color.black)
:空);
}
公共布尔值已检查(){
返回mChecked;
}
公共无效切换(){
setChecked(!mChecked);
}
}
活动\u main.xml

<?xml version="1.0" encoding="utf-8"?>

<GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myGrid"
  android:layout_width="match_parent" 
  android:layout_height="match_parent"
    android:padding="10dp"
    android:verticalSpacing="10dp"

    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"

    android:gravity="center" />


在i.addView(i)中获取错误。它表示,类型ImageView的方法addView(ImageView)未定义。并且在i=(ImageView)i.getChildAt(0)行,它表示方法getChildAt(int)未为该类型定义ImageView@androidBoomer:我的错,对不起!!我已经更新了答案中的代码。它正在工作!!!但是,我希望在我的自定义启动器应用程序中发生的是,在我的管理活动中,当我选择一个应用程序时,它将在主活动中为所选应用程序创建一个快捷方式图标。
<?xml version="1.0" encoding="utf-8"?>

<GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myGrid"
  android:layout_width="match_parent" 
  android:layout_height="match_parent"
    android:padding="10dp"
    android:verticalSpacing="10dp"

    android:horizontalSpacing="10dp"
    android:numColumns="auto_fit"
    android:columnWidth="60dp"
    android:stretchMode="columnWidth"

    android:gravity="center" />