안드로이드 핸드폰에 설치된 앱 시장 목록 가져오기
/** *
* @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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.