วิธีรับรายการแอปพลิเคชัน Android ที่ติดตั้งและเลือกหนึ่งแอปพลิเคชันเพื่อเรียกใช้


326

ฉันถามคำถามที่คล้ายกันนี้เมื่อต้นสัปดาห์นี้ แต่ฉันยังไม่เข้าใจวิธีรับรายการแอปพลิเคชันที่ติดตั้งทั้งหมดแล้วเลือกหนึ่งรายการเพื่อเรียกใช้

ฉันพยายามแล้ว:

Intent intent = new Intent(ACTION_MAIN);
intent.addCategory(CATEGORY_LAUNCHER);

และนี่จะแสดงเฉพาะแอปพลิเคชันที่ติดตั้งไว้ล่วงหน้าหรือสามารถเรียกใช้ACTION_MAINประเภท Intent ได้

ฉันรู้ด้วยว่าฉันสามารถใช้PackageManagerเพื่อรับแอปพลิเคชันที่ติดตั้งทั้งหมด แต่ฉันจะใช้วิธีนี้เพื่อเรียกใช้แอปพลิเคชันที่เฉพาะเจาะจงได้อย่างไร


คุณจะรับข้อมูลเกี่ยวกับแอพที่เลือกในรายการได้อย่างไร
Pedrum

คำตอบ:


277

ต่อไปนี้เป็นรหัสเพื่อรับรายการกิจกรรม / แอปพลิเคชันที่ติดตั้งบน Android:

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> pkgAppsList = context.getPackageManager().queryIntentActivities( mainIntent, 0);

คุณจะได้รับข้อมูลที่จำเป็นทั้งหมดในResolveInfoเพื่อเริ่มแอปพลิเคชัน คุณสามารถตรวจสอบResolveInfoJavadoc ที่นี่


3
ฉันจะเริ่มต้นหนึ่งในนั้นได้อย่างไร ฉันได้รับ dataInfo ภายใน ResolveInfo แต่ฉันไม่สามารถจัดการให้เริ่มได้
Spidey

1
ไม่เป็นไรพบแล้ว ฉันควรสร้าง Intent ใหม่โดยใช้ชื่อคลาสแบบเต็ม (แพ็คเกจ + คลาส)
Spidey

คุณจะรับข้อมูลเกี่ยวกับแอพที่เลือกในรายการได้อย่างไร
Pedrum

1
ฉันต้องการเข้าใจนโยบาย Android / play store เกี่ยวกับแอพของฉันที่อ่านและจัดเก็บรายการแอพทั้งหมดและอาจสื่อสารกับเซิร์ฟเวอร์ มีแนวทางหรือไม่?
dowjones123

1
@ dowjones123 คุณเกิดขึ้นเพื่อหาแนวทางเกี่ยวกับเรื่องนี้หรือไม่?
RmK

415

นี่คือวิธีที่สะอาดกว่าโดยใช้ PackageManager

final PackageManager pm = getPackageManager();
//get a list of installed apps.
List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) {
    Log.d(TAG, "Installed package :" + packageInfo.packageName);
    Log.d(TAG, "Source dir : " + packageInfo.sourceDir);
    Log.d(TAG, "Launch Activity :" + pm.getLaunchIntentForPackage(packageInfo.packageName)); 
}
// the getLaunchIntentForPackage returns an intent that you can use with startActivity() 

ข้อมูลเพิ่มเติมที่นี่http://qtcstation.com/2011/02/how-to-launch-another-app-from-your-app/


ทำงานได้ดี แต่เมื่อลองทำสิ่งนี้บน Android 4.0.3 ไม่มีการพิมพ์อะไรเลย !! เบาะแสใด ๆ ??
Saurabh Verma

ตรวจสอบให้แน่ใจว่าคุณไม่ได้กรองคำสั่งบันทึกการดีบัก
QED

รหัสนี้ใช้งานได้ แต่คุณมีความคิดเกี่ยวกับวิธีการใส่รายการแอปพลิเคชันเหล่านั้นลงใน ListView หรือไม่?
androidBoomer

@androidBoomer ฉันทำเช่นเดียวกัน อ่านที่นี่ - vogella.com/tutorials/AndroidListView/article.html
David T.

@DavidT ฉันคิดออกแล้ว ตอนนี้ฉันกำลังทำงานเกี่ยวกับวิธีการเข้าถึงแอพที่ติดตั้งเพื่อสร้างทางลัดภายในแอพของฉัน เป็นไปได้ไหม
androidBoomer

61

อีกวิธีในการกรองแอประบบ (ใช้ได้กับตัวอย่างของ king9981):

/**
 * Return whether the given PackageInfo represents a system package or not.
 * User-installed packages (Market or otherwise) should not be denoted as
 * system packages.
 * 
 * @param pkgInfo
 * @return
 */
private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
}

4
นี่คือคำตอบที่ดีที่สุดสำหรับการกรองแอประบบ
Bjorn

5
แต่ฉันจะกรอง appliaction เช่นการตั้งค่าแผนที่หรือ ... วิธีการแสดงรายการพวกเขาด้วย
Ata

7
ส่วน "? จริง: เท็จ" ของคำชี้แจงการคืนสินค้าของคุณซ้ำซ้อน
k2col

ลดความซับซ้อนของการส่งคืน ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)! = 0);
Bhavesh Rangani

จะกรองแอปที่ต้องจ่ายเงินได้อย่างไร
Pemba Tamang

55

นี่เป็นตัวอย่างที่ดี:

class PInfo {
    private String appname = "";
    private String pname = "";
    private String versionName = "";
    private int versionCode = 0;
    private Drawable icon;
    private void prettyPrint() {
        Log.v(appname + "\t" + pname + "\t" + versionName + "\t" + versionCode);
    }
}

private ArrayList<PInfo> getPackages() {
    ArrayList<PInfo> apps = getInstalledApps(false); /* false = no system packages */
    final int max = apps.size();
    for (int i=0; i<max; i++) {
        apps.get(i).prettyPrint();
    }
    return apps;
}

private ArrayList<PInfo> getInstalledApps(boolean getSysPackages) {
    ArrayList<PInfo> res = new ArrayList<PInfo>();        
    List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);
    for(int i=0;i<packs.size();i++) {
        PackageInfo p = packs.get(i);
        if ((!getSysPackages) && (p.versionName == null)) {
            continue ;
        }
        PInfo newInfo = new PInfo();
        newInfo.appname = p.applicationInfo.loadLabel(getPackageManager()).toString();
        newInfo.pname = p.packageName;
        newInfo.versionName = p.versionName;
        newInfo.versionCode = p.versionCode;
        newInfo.icon = p.applicationInfo.loadIcon(getPackageManager());
        res.add(newInfo);
    }
    return res; 
}

1
คุณจะดำเนินการหนึ่งในนั้นได้อย่างไรถ้าคุณต้องการ? ฉันหมายความว่าคุณจะได้รับความตั้งใจหรือไม่
Ton

ยิ่งใหญ่ ขอบคุณสำหรับคำตอบ. ฉันใช้คำตอบของคุณในใบสมัครของฉันและฉันมีปัญหาเล็กน้อยกับขนาดของไอคอน ส่วนใหญ่เป็นเรื่องปกติและบางส่วนก็ใหญ่หรือเล็ก ฉันจะแก้ไขสิ่งนั้นได้อย่างไร คุณมีความคิดใด ๆ ขอบคุณ
Meysam Valueian

36

รับรายการแอพที่ไม่ใช่ระบบที่ติดตั้ง

public static void installedApps()
{
    List<PackageInfo> packList = getPackageManager().getInstalledPackages(0);
    for (int i=0; i < packList.size(); i++)
    {
        PackageInfo packInfo = packList.get(i);
        if (  (packInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0)
        {
            String appName = packInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            Log.e("App № " + Integer.toString(i), appName);
        }
    }
}

19

ในการกรองแอพที่ใช้ sytem:

private boolean isSystemPackage(ResolveInfo ri) {
    return (ri.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

18

ในการรับแอปที่ติดตั้งไว้คุณสามารถใช้ Package Manager ..

    List<PackageInfo> apps = getPackageManager().getInstalledPackages(0);

หากต้องการเรียกใช้คุณสามารถใช้ชื่อแพ็คเกจ

Intent launchApp = getPackageManager().getLaunchIntentForPackage(“package name”)
startActivity(launchApp);

สำหรับรายละเอียดเพิ่มเติมคุณสามารถอ่านบล็อกนี้http://codebucket.co.in/android-get-list-of-all-installed-apps/


นี่คือจุดที่มากกว่า เราสามารถตั้งค่าการตรวจสอบที่เหมาะสมโดยการหาแอพที่จำเป็นของเรา
Noman

13

คุณสามารถค้นหารายการแอพที่ติดตั้งในอุปกรณ์ Android โดยใช้รหัสด้านล่าง "packageInfo" มีข้อมูลแอปพลิเคชันที่ติดตั้งในอุปกรณ์ เราสามารถย้อนกลับ Intent สำหรับแอปพลิเคชันที่ติดตั้งจากวัตถุ packageinfo และโดยใช้ startactivity (เจตนา) สามารถเริ่มต้นแอปพลิเคชันได้ มันขึ้นอยู่กับคุณว่าคุณจะจัดระเบียบ UI ทั้ง Listview หรือ Gridview อย่างไร ดังนั้นเมื่อคลิกเหตุการณ์ตามตำแหน่งคุณสามารถดึงวัตถุเจตนาและเริ่มเจตนากิจกรรมได้

final PackageManager pm = getPackageManager();

List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);


for (ApplicationInfo packageInfo : packages) 

{
 if(pm.getLaunchIntentForPackage(packageInfo.packageName)!= null &&   

                   !pm.getLaunchIntentForPackage(packageInfo.packageName).equals(""))


{

    System.out.println("Package Name :" + packageInfo.packageName);

    System.out.println("Launch Intent For Package :"   +  
                  pm.getLaunchIntentForPackage(packageInfo.packageName));

    System.out.println("Application Label :"   + pm.getApplicationLabel(packageInfo));

    System.out.println("Application Label :"   + 
                           pm.getApplicationIcon(packageInfo.packageName).toString());

    System.out.println("i : "+i);

    /*if(i==2)

    {
         startActivity(pm.getLaunchIntentForPackage(packageInfo.packageName));

     break;

    }*/

    i++;

}
}

13

ฉันมีความต้องการในการกรองแอประบบที่ผู้ใช้ไม่ได้ใช้จริง ๆ (เช่น "com.qualcomm.service", "update services" ฯลฯ ) ท้ายที่สุดฉันได้เพิ่มเงื่อนไขอื่นเพื่อกรองรายการแอพ ฉันเพิ่งตรวจสอบว่าแอปนั้นมี 'เจตนาเรียกใช้' หรือไม่

ดังนั้นรหัสผลลัพธ์ดูเหมือน ...

PackageManager pm = getPackageManager();
        List<ApplicationInfo> apps = pm.getInstalledApplications(PackageManager.GET_GIDS);

        for (ApplicationInfo app : apps) {
            if(pm.getLaunchIntentForPackage(app.packageName) != null) {
                // apps with launcher intent
                if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
                    // updated system apps

                } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                    // system apps

                } else {
                    // user installed apps

                }
                appsList.add(app);
            }

        }

ขอบคุณ getLaunchIntentForPackage มีประโยชน์มากในการรับแอปที่อยู่ใน App Drawer :-)
Gabriel Hautclocq

10

หากมีตัวเรียกใช้งานหลายตัวในแพ็คเกจเดียวรหัสข้างบนมีปัญหา ตัวอย่างเช่น: บน LG Optimus Facebook สำหรับ LG, MySpace สำหรับ LG, Twitter สำหรับ LG บรรจุในชื่อแพคเกจเดียว SNS และหากคุณใช้ SNS ข้างต้นจะทำซ้ำ หลังจากชั่วโมงของการวิจัยฉันมาพร้อมกับรหัสด้านล่าง ดูเหมือนว่าจะทำงานได้ดี

private List<String> getInstalledComponentList()
            throws NameNotFoundException {
        final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        List<ResolveInfo> ril = getPackageManager().queryIntentActivities(mainIntent, 0);
        List<String> componentList = new ArrayList<String>();
        String name = null;

        for (ResolveInfo ri : ril) {
            if (ri.activityInfo != null) {
                Resources res = getPackageManager().getResourcesForApplication(ri.activityInfo.applicationInfo);
                if (ri.activityInfo.labelRes != 0) {
                    name = res.getString(ri.activityInfo.labelRes);
                } else {
                    name = ri.activityInfo.applicationInfo.loadLabel(
                            getPackageManager()).toString();
                }
                componentList.add(name);
            }
        }
        return componentList;
    }

7

@Jas: ฉันไม่มีรหัสนั้นอีกต่อไป แต่ฉันพบบางสิ่งที่ใกล้เคียง ฉันทำสิ่งนี้เพื่อค้นหา "ส่วนประกอบ" ของแอปพลิเคชันของฉันพวกเขาเป็นเพียงกิจกรรมที่มีหมวดหมู่ที่กำหนด

private List<String> getInstalledComponentList() {
    Intent componentSearchIntent = new Intent();
    componentSearchIntent.addCategory(Constants.COMPONENTS_INTENT_CATEGORY);
    componentSearchIntent.setAction(Constants.COMPONENTS_INTENT_ACTION_DEFAULT);
    List<ResolveInfo> ril = getPackageManager().queryIntentActivities(componentSearchIntent, PackageManager.MATCH_DEFAULT_ONLY);
    List<String> componentList = new ArrayList<String>();
    Log.d(LOG_TAG, "Search for installed components found " + ril.size() + " matches.");
    for (ResolveInfo ri : ril) {
        if (ri.activityInfo != null) {
            componentList.add(ri.activityInfo.packageName);// + ri.activityInfo.name);
            Log.d(LOG_TAG, "Found installed: " + componentList.get(componentList.size()-1));
        }
    }
    return componentList;
}

ฉันแสดงความคิดเห็นในส่วนที่ได้รับชื่อกิจกรรม แต่มันค่อนข้างตรงไปตรงมา


6

วิธีแก้ปัญหาที่สะอาดที่กรองแอประบบออกจากกัน

คิดที่อยู่เบื้องหลังการแก้ปัญหานี้ก็คือว่ากิจกรรมหลักของทุกแอพพลิเคระบบไม่ได้มีไอคอนกิจกรรมที่กำหนดเอง วิธีนี้ให้ผลลัพธ์ที่ยอดเยี่ยม:

 public static Set<PackageInfo> getInstalledApps(Context ctx) {
    final PackageManager packageManager = ctx.getPackageManager();

    final List<PackageInfo> allInstalledPackages = packageManager.getInstalledPackages(PackageManager.GET_META_DATA);
    final Set<PackageInfo> filteredPackages = new HashSet();

    Drawable defaultActivityIcon = packageManager.getDefaultActivityIcon();

    for(PackageInfo each : allInstalledPackages) {
        if(ctx.getPackageName().equals(each.packageName)) {
            continue;  // skip own app
        }

        try {
            // add only apps with application icon
            Intent intentOfStartActivity = packageManager.getLaunchIntentForPackage(each.packageName);
            if(intentOfStartActivity == null)
                continue;

            Drawable applicationIcon = packageManager.getActivityIcon(intentOfStartActivity);
            if(applicationIcon != null && !defaultActivityIcon.equals(applicationIcon)) {
                filteredPackages.add(each);
            }
        } catch (PackageManager.NameNotFoundException e) {
            Log.i("MyTag", "Unknown package name " + each.packageName);
        }
    }

    return filteredPackages;
}

3
private static boolean isThisASystemPackage(Context context, PackageInfo  packageInfo ) {
        try {
            PackageInfo sys = context.getPackageManager().getPackageInfo("android", PackageManager.GET_SIGNATURES);
            return (packageInfo != null && packageInfo.signatures != null &&
                    sys.signatures[0].equals(packageInfo.signatures[0]));
        } catch (NameNotFoundException e) {
            return false;
        }
    }

2

ฉันมีทางออกอื่น:

ArrayList<AppInfo> myAppsToUpdate;

    // How to get the system and the user apps.
    public ArrayList<AppInfo> getAppsToUpdate() {

        PackageManager pm = App.getContext().getPackageManager();
        List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
        myAppsToUpdate = new ArrayList<AppInfo>();
        for (ApplicationInfo aInfo : installedApps) {

            if ((aInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                // System apps 
            } else {
                // Users apps
                AppInfo appInfo = new AppInfo();
                appInfo.setAppName(aInfo.loadLabel(pm).toString());
                appInfo.setPackageName(aInfo.packageName);
                appInfo.setLaunchActivity(pm.getLaunchIntentForPackage(aInfo.packageName).toString());
                try {
                    PackageInfo info = pm.getPackageInfo(aInfo.packageName, 0);
                    appInfo.setVersionName(info.versionName.toString());
                    appInfo.setVersionCode("" + info.versionCode);
                    myAppsToUpdate.add(appInfo);
                } catch (NameNotFoundException e) {
                    Log.e("ERROR", "we could not get the user's apps");
                }

            }
        }
        return myAppsToUpdate;
    }

2

รับแอพทั้งหมด:

    PackageManager pm = getContext().getPackageManager();
    List<ApplicationInfo> apps = pm.getInstalledApplications(0);

ตรวจสอบว่าแอพที่ติดตั้งเปิดอยู่หรือไม่:

if((app.flags & (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP | ApplicationInfo.FLAG_SYSTEM)) > 0) {
                String app_package = app.packageName;
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(app_package);
context.startActivity(launchIntent);

0

คุณสามารถใช้สิ่งนี้:

PackageManager pm = getApplicationContext().getPackageManager();
                List<ResolveInfo> activityList = pm.queryIntentActivities(shareIntent, 0);
                for (final ResolveInfo app : activityList) 
                {
                   if ((app.activityInfo.name).contains("facebook")) 
                   {
                     // facebook  
                   }

                   if ((app.activityInfo.name).contains("android.gm")) 
                   {
                     // gmail  
                   }

                   if ((app.activityInfo.name).contains("mms")) 
                   {
                     // android messaging app
                   }

                   if ((app.activityInfo.name).contains("com.android.bluetooth")) 
                   {
                     // android bluetooth  
                   }
                }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.