안드로이드에 응용 프로그램이 설치되어 있는지 여부를 프로그래밍 방식으로 확인하는 방법은 무엇입니까?


147

프로그래밍 방식으로 응용 프로그램을 설치했습니다.

  1. 응용 프로그램이 장치에 이미 설치되어 있으면 응용 프로그램이 자동으로 열립니다.
  2. 그렇지 않으면 특정 응용 프로그램을 설치하십시오.

안내해주세요. 나도 몰라 감사.


답변:


317

이것으로 시도하십시오 :

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Add respective layout
        setContentView(R.layout.main_activity);

        // Use package name which we want to check
        boolean isAppInstalled = appInstalledOrNot("com.check.application");  

        if(isAppInstalled) {
            //This intent will help you to launch if the package is already installed
            Intent LaunchIntent = getPackageManager()
                .getLaunchIntentForPackage("com.check.application");
            startActivity(LaunchIntent);

            Log.i("Application is already installed.");       
        } else {
            // Do whatever we want to do if application not installed
            // For example, Redirect to play store

            Log.i("Application is not currently installed.");
        }
    }

    private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }

}

1
@Sathish : 도움이되기를 바랍니다.
Aerrow

1
의심의 여지없이 귀하의 게시물이 실제로 도움이되지만 예외 "java.lang.RuntimeException : 창 추가 실패"및 "E / AndroidRuntime (7554) : 원인 : android.os.TransactionTooLargeException 05-14 11 : 37 : 25.305 : E / AndroidRuntime (7554) : android.os.BinderProxy.transact (기본 메소드) 05-14 11 : 37 : 25.305 : E / AndroidRuntime (7554) : at android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java : 516) 05-14 11 : 37 : 25.305 : E / AndroidRuntime (7554) : at android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon

2
@BlueGreen : 안녕하세요,이 링크가 도움이 되길 바랍니다. stackoverflow.com/questions/11451393/… , 그렇지 않으면 대화 상자 클래스를 사용하는 경우 친절하게 확인하십시오. :)
Aerrow

1
@Aerrow .. 내 .apk가 설치되어 있는지 확인하고 있습니까? 설치시 ... com.test.installedornot. 내 패키지를 확인하는 동안 동일한 예외가 발생합니다. 내 .apk 크기가 9MB 이상이면이 예외를 어떻게 관리합니까?
DJhon

@BlueGreen : 위 코드는 설치된 앱만 확인하며, 설치 시점에는 작동하지 않습니다. 귀하의 경우 apk가 설치된 후 브로드 캐스트 수신기를 사용하여 알림을 받으십시오.
Aerrow

65

허용 된 답변보다 다소 깨끗한 해결책 ( 이 질문을 기반으로 함 ) :

public static boolean isAppInstalled(Context context, String packageName) {
    try {
        context.getPackageManager().getApplicationInfo(packageName, 0);
        return true;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

정적 유틸리티로 도우미 클래스에 넣었습니다. 사용 예 :

boolean whatsappFound = AndroidUtils.isAppInstalled(context, "com.whatsapp");

이 답변 은 앱이없는 경우 Play 스토어에서 앱을 가져 오는 방법을 보여줍니다. 그러나 Play 스토어가없는 기기에서는주의를 기울여야합니다.


작동하려면 특정 Android 권한이 필요합니까?
Bootstrapper

@Bootstrapper : 아니요. 특별한 권한이 필요하지 않습니다.
Jonik

감사 (작업 솔루션)
Naveed Ahmad

26

위의 코드는 나를 위해 작동하지 않았습니다. 다음과 같은 접근법이 효과적이었습니다.

적절한 정보로 Intent 객체를 생성 한 후 다음 함수를 사용하여 Intent를 호출 할 수 있는지 확인하십시오.

private boolean isCallable(Intent intent) {  
        List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent,   
        PackageManager.MATCH_DEFAULT_ONLY);  
        return list.size() > 0;  
}

5
흐름 제어에 예외를 사용할 필요가 없기 때문에 더 좋습니다!
QED

2
@ QED 예외를 if진술 로 사용하는 사람들의 수를 놀라게합니다 ! 이것은 정답입니다
ILikeTacos

1
의도의 내용은 무엇입니까? packageName이 포함 된 문자열이 작동하지 않음
Henrique de Sousa

3
@HenriquedeSousaIntent intent = getPackageManager().getLaunchIntentForPackage("org.package.name");
Dominic K

응용 프로그램이 비활성화 된 경우에는 잘못된 것입니다.
휴고

15

패키지 이름을 알고 있다면 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.isEmpty();
}

1
return !list.isEmpty();더 자바 스타일 친화적 인 것입니다
headsvk

7

이 코드는 앱이 설치되어 있는지 확인하고 활성화되어 있는지 확인합니다.

private boolean isAppInstalled(String packageName) {
    PackageManager pm = getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return pm.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
    }
}

앱의 패키지 이름입니다. 예를 들어 "com.example.apps.myapp"입니다. uri 대신 packageName을 표시하도록 답변을 편집했습니다.
youravgjoe

3

try / catch 패턴을 사용하는 것은 성능이 좋지 않다고 생각합니다. 나는 이것을 사용하는 것이 좋습니다 :

public static boolean appInstalledOrNot(Context context, String uri) {
    PackageManager pm = context.getPackageManager();
    List<PackageInfo> packageInfoList = pm.getInstalledPackages(PackageManager.GET_ACTIVITIES);
    if (packageInfoList != null) {
        for (PackageInfo packageInfo : packageInfoList) {
            String packageName = packageInfo.packageName;
            if (packageName != null && packageName.equals(uri)) {
                return true;
            }
        }
    }
    return false;
}

kotlin```private fun isAppInstalled (context : Context, uri : String)의 위 코드 : Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) return packageInfoList.asSequence (). filter {it? .packageName = = uri} .any ()}```
Kishan B

3

허용 된 답변 ( AndroidRate 라이브러리 기반)보다 깨끗한 솔루션 (시도없이 ) :

public static boolean isPackageExists(@NonNull final Context context, @NonNull final String targetPackage) {
    List<ApplicationInfo> packages = context.getPackageManager().getInstalledApplications(0);
    for (ApplicationInfo packageInfo : packages) {
        if (targetPackage.equals(packageInfo.packageName)) {
            return true;
        }
    }
    return false;
}

2

kotlin을 사용하여 앱이 Android에 설치되어 있는지 확인하십시오.

kotlin 확장 만들기

fun PackageManager.isAppInstalled(packageName: String): Boolean = try {
        getApplicationInfo(packageName, PackageManager.GET_META_DATA)
        true
    } catch (e: Exception) {
        false
    }

이제 앱 설치 여부를 확인할 수 있습니다

if (packageManager.isAppInstalled("AppPackageName")) {
    // App is installed
}else{
    // App is not installed
}

1

이 시도

이 코드는 패키지 이름으로 응용 프로그램의 날씨를 확인하는 데 사용되며 그렇지 않은 경우 설치된 앱의 Playstore 링크를 엽니 다.

String your_apppackagename="com.app.testing";
    PackageManager packageManager = getPackageManager();
    ApplicationInfo applicationInfo = null;
    try {
        applicationInfo = packageManager.getApplicationInfo(your_apppackagename, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (applicationInfo == null) {
        // not installed it will open your app directly on playstore
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + your_apppackagename)));
    } else {
        // Installed
        Intent LaunchIntent = packageManager.getLaunchIntentForPackage(your_apppackagename);
        startActivity( LaunchIntent );
    }

1

Kotlin을 사용한 간단한 구현

fun PackageManager.isAppInstalled(packageName: String): Boolean =
        getInstalledApplications(PackageManager.GET_META_DATA)
                .firstOrNull { it.packageName == packageName } != null

그리고 이것을 다음과 같이 호출하십시오 (Spotify 앱을 찾으십시오).

packageManager.isAppInstalled("com.spotify.music")

0

kotlin B에서 @Egemen Hamutçu의 답변 B)

    private fun isAppInstalled(context: Context, uri: String): Boolean {
        val packageInfoList = context.packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES)
        return packageInfoList.asSequence().filter { it?.packageName == uri }.any()
    }

0

모든 답변은 특정 앱이 설치되어 있는지 확인합니다. 그러나 우리 모두 알다시피 사용자가 앱을 설치할 수는 있지만 사용할 수 없게됩니다.

따라서이 솔루션은 두 가지를 모두 확인합니다. 즉, 설치 및 활성화 된 앱 .

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
     try {
          return packageManager.getApplicationInfo(packageName, 0).enabled;
     }
     catch (PackageManager.NameNotFoundException e) {
          return false;
     }
}

메소드를 호출하십시오 isPackageInstalled().

boolean isAppInstalled = isPackageInstalled("com.android.app" , this.getPackageManager());

이제 부울 변수를 사용하고 isAppInstalled원하는대로 수행하십시오.

if(isAppInstalled ) {
    /* do whatever you want */
}

0

다른 문제에 대한 멋진 답변. 예를 들어 "com.myapp.debug"와 "com.myapp.release"를 구별하지 않으려면!

public static boolean isAppInstalled(final Context context, final String packageName) {
    final List<ApplicationInfo> appsInfo = context.getPackageManager().getInstalledApplications(0);
    for (final ApplicationInfo appInfo : appsInfo) {
        if (appInfo.packageName.contains(packageName)) return true;
    }
    return false;
}

0

Kotlin suger가 더 좋았습니다.

  private fun isSomePackageInstalled(context: Context, packageName: String): Boolean {

    val packageManager = context.packageManager

    return runCatching { packageManager.getPackageInfo(packageName, 0) }.isSuccess
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.