program tip

내 Android 장치에 특정 패키지가 있는지 어떻게 알 수 있습니까?

radiobox 2020. 11. 23. 07:57
반응형

내 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;

참고 URL : https://stackoverflow.com/questions/6758841/how-can-i-find-if-a-particular-package-exists-on-my-android-device

반응형