2014-04-05 3 views
1

우선 Google에서 여러 번 내 질문을 검색하지만 원하는 내용을 찾지 못했습니다.안드로이드에서 라벨 이름과 알 수없는 패키지 이름으로 애플리케이션을 엽니 다.

내 질문은 : 반면에 패키지 이름은 "레이블 이름" "을 알고"안드로이드에서 응용 프로그램을 열 수있는 방법이 있습니까?

필자가 사용했던 방식은 두 개의 ArrayList를 만들고 각각에 패키지 이름과 레이블 이름을 저장 한 다음 레이블 이름을 소문자로 변환 한 다음 패키지 이름으로 레이블 이름과 일치시키는 방법으로 동일한 문자가 일치하는 경우 보려면, 일치하는 경우, 다음 나는 그 패키지 이름을 가져 응용 프로그램을 시작합니다. 내가 직면 한 문제는 패키지 이름에 패키지 이름을 쓰던 응용 프로그램 개발자를 기반으로 레이블 이름에 같은 이름이 없거나 일치하지 않는 경우가 있습니다. 예를 들어 : I Gmail을 열려면, 내 방법에 따라 내가 패키지 이름이 com.google.android.gm 및 레이블 이름 Gmail을입니다 수 없기 때문에, 나는 연장에 사과, 감사 고급.

내 코드 :

private void getAllApps() { 
    final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
    List<ResolveInfo> activities = getPackageManager() 
      .queryIntentActivities(mainIntent, 0); 
    for (ResolveInfo resolveInfo : activities) { 
     appsName.add(resolveInfo.loadLabel(getPackageManager()).toString() 
       .toLowerCase()); 
     pkgsName.add(resolveInfo.activityInfo.packageName.toString()); 
    } 
} 

private void openApplication(String appName) { 

    String packageName = null, appNameLowerCase = null, pkgNameLowerCase = null; 

    // matching the package name with label name 
    if (appsName.contains(appName)) { 
     appNameLowerCase = appName.trim().replace(" ", ""); 
     for (int i = 0; i < pkgsName.size(); i++) { 
      pkgNameLowerCase = pkgsName.get(i).trim().toLowerCase(); 
      if (pkgNameLowerCase 
        .matches("(.*)" + appNameLowerCase + "(.*)")) { 
       packageName = pkgsName.get(i); 
       break; 
      } 
     } 
    } 

    // to launch the application 
    Intent i; 
    PackageManager manager = getPackageManager(); 
    try { 
     i = manager.getLaunchIntentForPackage(packageName); 
     if (i == null) 
      throw new PackageManager.NameNotFoundException(); 
     i.addCategory(Intent.CATEGORY_LAUNCHER); 
     startActivity(i); 
    } catch (PackageManager.NameNotFoundException e) { 

    } 
} 
+0

왜 패키지 이름과 레이블을 붙잡고있는 객체를 포함하는 * 하나 *'ArrayList'를 사용합니까? – CommonsWare

+0

이 조언에 대해 @CommonsWare에게 감사드립니다. 제대로 작동 했나요? :) –

답변

1

감사를 시도하고 올바르게 작동 :

class Applications { 
    private String packageName; 
    private String labelName; 
} 

private void getAllApps() { 
    final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
    List<ResolveInfo> activities = getPackageManager() 
      .queryIntentActivities(mainIntent, 0); 
    for (ResolveInfo resolveInfo : activities) { 
     Applications applications = new Applications(); 
     applications.labelName = resolveInfo.loadLabel(getPackageManager()) 
       .toString().toLowerCase(); 
     applications.packageName = resolveInfo.activityInfo.packageName 
       .toString(); 
     applicationsArrayList.add(applications); 
    } 
} 

private void openApplication(String appName) { 

    String packageName = null; 

    // matching the package name with label name 
    for (int i = 0; i < applicationsArrayList.size(); i++) { 
     if (applicationsArrayList.get(i).labelName.trim().equals(
       appName.trim())) { 
      packageName = applicationsArrayList.get(i).packageName; 
      break; 
     } 
    } 

    // to launch the application 
    Intent i; 
    PackageManager manager = getPackageManager(); 
    try { 
     i = manager.getLaunchIntentForPackage(packageName); 
     if (i == null) 
      throw new PackageManager.NameNotFoundException(); 
     i.addCategory(Intent.CATEGORY_LAUNCHER); 
     startActivity(i); 
    } catch (PackageManager.NameNotFoundException e) { 

    } 
} 
0

내가 @CommonsWare 솔루션으로 그것을 해결, 모든 답장이

public List<ApplicationInfo> getApplicationList(Context con){ 
    PackageManager p = con.getPackageManager(); 
    List<ApplicationInfo> info = p.getInstalledApplications(0); 
    String example = info.get(0).packageName.toString(); 
    return info; 
} 
관련 문제