반응형
내 Android 장치에 특정 패키지가 있는지 어떻게 알 수 있습니까?
com.android.abc
내 Android 기기에 특정 패키지 또는 애플리케이션 (예 :)이 있는지 어떻게 알 수 있습니까?
패키지 이름으로 아래 메소드 중 하나를 호출하십시오.
import android.content.pm.PackageManager;
// ...
public boolean isPackageExisted(String targetPackage){
List<ApplicationInfo> packages;
PackageManager pm;
pm = getPackageManager();
packages = pm.getInstalledApplications(0);
for (ApplicationInfo packageInfo : packages) {
if(packageInfo.packageName.equals(targetPackage))
return true;
}
return false;
}
import android.content.pm.PackageManager;
public boolean isPackageExisted(String targetPackage){
PackageManager pm=getPackageManager();
try {
PackageInfo info=pm.getPackageInfo(targetPackage,PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return true;
}
try-catch 블록을 사용하거나 여러 패키지를 반복하지 않고 :
public static boolean isPackageInstalled(Context context, String packageName) {
final PackageManager packageManager = context.getPackageManager();
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
if (intent == null) {
return false;
}
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
설치된 모든 패키지의 목록과 관심있는 패키지를 검색하려면 PackageManager
호출 된의 함수를 사용해야합니다 getInstalledPackages()
. 패키지 이름은 PackageInfo.packageName
필드에 있습니다.
adb를 사용하려는 경우 :
adb shell "pm list packages"|cut -f 2 -d ":"
설치된 모든 패키지를 나열합니다.
Kotlin
fun isPackageExist(context: Context, target: String): Boolean {
return context.packageManager.getInstalledApplications(0).find { info -> info.packageName == target } != null
}
일부 장치에서 "getInstalledPackages"가 TransactionTooLargeException을 유발할 수 있다고보고했기 때문에 ( 여기 , 여기 및 여기 확인 ) 아래에서했던 것과 같은 폴 백도 있어야한다고 생각합니다.
이 문제는 Android 5.1 ( 여기 참조 )에서 수정 될 예정 이지만 일부는 여전히 이에 대해보고했습니다.
public static List<String> getInstalledPackages(final Context context) {
List<String> result = new ArrayList<>();
final PackageManager pm = context.getPackageManager();
try {
List<PackageInfo> apps = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : apps)
result.add(packageInfo.packageName);
return result;
} catch (Exception ignored) {
//we don't care why it didn't succeed. We'll do it using an alternative way instead
}
// use fallback:
BufferedReader bufferedReader = null;
try {
Process process = Runtime.getRuntime().exec("pm list packages");
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
final String packageName = line.substring(line.indexOf(':') + 1);
result.add(packageName);
}
closeQuietly(bufferedReader);
process.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
closeQuietly(bufferedReader);
}
return result;
}
public static void closeQuietly(final Closeable closeable) {
if (closeable == null)
return;
try {
closeable.close();
} catch (final IOException e) {
}
}
pm.getInstalledApplications ()를 반복하는 대신 pm.getPackageUid ()를 사용할 수 있습니다.
boolean isPackageInstalled;
PackageManager pm = getPackageManager();
int flags = 0;
try
{
pm.getPackageUid(packageName,flags);
isPackageInstalled = true;
}
catch (final PackageManager.NameNotFoundException nnfe)
{
isPackageInstalled = false;
}
return isPackageInstalled;
반응형
'program tip' 카테고리의 다른 글
개체가 형식이 아닌지 확인 (! = "IS"에 해당)-C # (0) | 2020.11.23 |
---|---|
Visual Studio 내에서 LARGEADDRESSAWARE를 설정할 수 있습니까? (0) | 2020.11.23 |
Facebook의 "Messenger"에는 재부팅 후 가장 높은 우선 순위를 갖는 SMS 브로드 캐스트 수신기가 있습니다. (0) | 2020.11.22 |
네이티브 IOS 앱 및 node.js (0) | 2020.11.22 |
XML Drawable-Android를 통해 원을 어떻게 그릴 수 있습니까? (0) | 2020.11.22 |