안드로이드 핸드폰에 설치된 앱 시장 목록 가져오기

3601 단어
오늘 한 가지 수요는 휴대전화에 설치된 이미 설치된 응용 시장 목록을 얻는 것이다. 이전에도 해 본 적이 없는데, 인터넷에서 찾아보니 이렇게 실현된 방법이 하나 있다.
/** *               
* @param context
* @return
*/
private static ArrayList getInstalledMarketPkgs(Context
context) {
ArrayList pkgs = new ArrayList<>();
if (context == null)
return pkgs;
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.APP_MARKET");
PackageManager pm = context.getPackageManager();
List infos = pm.queryIntentActivities(intent, 0);

if (infos == null || infos.size() == 0)
return pkgs;
int size = infos.size();
for (int i = 0; i < size; i++) {
String pkgName = "";
try {
ActivityInfo activityInfo = infos.get(i).activityInfo;
pkgName = activityInfo.packageName;
} catch (Exception e) {
e.printStackTrace();
}
if (!TextUtils.isEmpty(pkgName))
pkgs.add(pkgName);
}
return pkgs;
}


결국 구글플레이가 있는 휴대전화에서는 구글플레이의 가방 이름만 받고, 구글플레이가 없는 휴대전화에서는 리스트가 비어 있었다.이것은 매우 이상하다. 왜 Google Play를 얻을 수 있지만 다른 응용 시장을 얻을 수 없습니까?
이 의문을 가지고 그 실현을 분석했다. Intent 설정, action 설정과Category 추가를 통해 최종적으로 Package 관리자를 통해 이 Action과Category가 포함된 Itent를 조회하는 것은 사실 이렇게 간단하다. 특정한 유형의 응용을 조회할 때 이렇게 이루어진다.
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.APP_MARKET");

List infos = pm.queryIntentActivities(intent, 0)

원리를 알고 문제의 원인을 계속 분석하면 Googleplay에서 GooglePlay 목록 파일에 이 Action과 Category가 있다는 것을 설명할 수 있을 뿐입니다. 다른 응용 프로그램의 패키지에서 목록 파일을 얻지 못하면 이 Action과 Category가 없을 것입니다.원인을 분석하면 그 다음은 검증이다.
위의 추측을 검증하기 위해 완두콩꼬투리를 역컴파일하여 명세서 파일을 보았는데, 과연 추측한 것과 같다

 
 
 
 



 


intetn-filter에 "android"가 있지만.intent.category.APP_MARKET "이 category, 하지만 Action은 없습니다. 처음 방법으로 얻으면 자연히 얻을 수 없습니다. 결국 아래의 Action 즉"android를 통해 얻을 수 있습니다.intent.action.VIEW"를 찾아서 문제를 잘 해결했습니다.
수정된 전체 코드를 붙이다
/**
 *               
 *
 * @param context
 * @return
 */
public static ArrayList getInstalledMarketPkgs(Context context) {
    ArrayList pkgs = new ArrayList<>();
    if (context == null)
        return pkgs;
    Intent intent = new Intent();
    intent.setAction("android.intent.action.VIEW");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    intent.setData(Uri.parse("market://details?id="));
    PackageManager pm = context.getPackageManager();
    //   queryIntentActivities  ResolveInfo  
    List infos = pm.queryIntentActivities(intent,
            0);
    if (infos == null || infos.size() == 0)
        return pkgs;
    int size = infos.size();
    for (int i = 0; i < size; i++) {
        String pkgName = "";
        try {
            ActivityInfo activityInfo = infos.get(i).activityInfo;
            pkgName = activityInfo.packageName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (!TextUtils.isEmpty(pkgName))
            pkgs.add(pkgName);
    }
    return pkgs;
}

좋은 웹페이지 즐겨찾기