애플리케이션 설치 여부 확인-Android


104

Google Play에서 앱을 설치하려고합니다. Google Play 스토어 URL을 열면 Google Play가 열리고 뒤로 버튼을 누르면 활동이 재개된다는 것을 이해할 수 있습니다.

Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);

활동으로 돌아갈 때 onResume()앱이 설치되었는지 확인하기 위해 이것을 호출하려고했지만 오류가 발생합니다.

@Override
protected void onResume() {
    super.onResume();
    boolean installed = false;
    while (!installed) {
        installed  =   appInstalledOrNot(APPPACKAGE);
        if (installed) {
             Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
        }
    }
}

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

오류는 다음과 같습니다.

E / AndroidRuntime (796) : java.lang.RuntimeException : 활동을 시작할 수 없음 ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity} : android.content.ActivityNotFoundException : 의도를 처리 할 활동이 없습니다. {act = android .intent.action.VIEW dat = market : // details? id = com.package.name flg = 0x40080000}

나는 활동이라고 생각한다 onPause(). 그것을 구현하는 더 좋은 방법이 있습니까? 앱 설치가 완료되었는지 확인하려고합니다.



@SiddharthanAsokan 내가 올바르게 이해했다면 여기서 달성하려는 것은 앱 시작-> 플레이 스토어로 이동-> 설치 클릭-> 자신의 활동으로 돌아 가기-> 새로 설치된 앱 시작 .. 맞습니까?
Varun

처음에 연 앱으로 돌아 가지 않습니다. PackageManager를 사용하여 설치된 앱에 대한 정보를 얻어야합니다. 이 정보 검색은 웹 URL을 연 이니셜에서 앱을 설치 한 후 시작됩니다.
Siddharthan Asokan

답변:


299

이 시도:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

이름을 전달한 패키지에 대한 정보를 가져 오려고 시도합니다. 실패하면 NameNotFoundException해당 이름의 패키지가 설치되지 않았으므로을 반환 false합니다.

a PackageManager대신 a 를 전달 Context하므로 메서드가 약간 더 유연하게 사용 가능하고 Demeter법칙을 위반하지 않습니다 . Context인스턴스 가있는 한 인스턴스에 대한 액세스없이 메서드를 사용할 수 있습니다 PackageManager.

다음과 같이 사용하십시오.

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}

1
조건은 :이 설치 프로세스가 완료되면 확인해야합니다. 설치를 클릭하고 그 동안 루프에서 설치를 확인하려고합니다. 코드는 괜찮지 만 설치가 완료되었는지 확인하는 방법은 내가 찾고있는 것입니다.
Siddharthan Asokan

3
@SiddharthanAsokan package_added 작업에 브로드 캐스트 수신기를 사용할 수 있습니다.
Varun

@Varun 방금 코드를 편집했습니다. 더 이상 앱 패키지 이름을 사용하지 않습니다. Google Play 스토어에있는 앱의 웹 URL
Siddharthan Asokan 2013-09-11

저울이 변경 사항을 검토 마십시오 @Robin 내가 만든
Siddharthan 아소카을

귀하의 질문에서 귀하가 한 것은 내 대답과 동일합니다.
Robin Kanters 2013 년

32

Robin Kanters의 대답은 맞지만 활성화 또는 비활성화 상태에 관계없이 설치된 앱을 확인합니다.

우리 모두는 앱이 설치 될 수 있지만 사용자에 의해 비활성화되어 사용할 수 없다는 것을 알고 있습니다.

설치된 앱 활성화 된 앱을 확인 합니다.

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

이 메서드를 다음과 같은 클래스에 넣고 Utils어디에서나 호출 할 수 있습니다.

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())

5

이 시도:

public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list =   mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}

5

더 빠른 솔루션 :

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGids에서 저렴 getPackageInfo하므로 더 빠르게 작동합니다.

Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000

Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890

Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769

Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269

참고 : 일부 가상 공간에서는 작동하지 않습니다. 해당 패키지 이름을 가진 애플리케이션이 없더라도 Android API를 위반하고 항상 배열을 반환 할 수 있습니다.
이 경우 getPackageInfo.


0
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}

0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// 설치된 패키지를 확인하는 방법 true / false

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }

0

try catch 블록없이 시도하고 싶다면 다음 방법을 사용하여 인 텐트를 생성하고 확인하려는 앱의 패키지를 설정하십시오.

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

다음 메소드를 호출하여 앱이 설치되었는지 확인하십시오.

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}

0

Kotlin 솔루션을 찾는 사람들은이 방법을 사용할 수 있습니다.

여기서는 전체 코드를 공유하고 활성화 된 상태도 처리했습니다. Android Kotlin에 애플리케이션이 설치되어 있는지 확인

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }

-9
@Override 
protected void onResume() {
    super.onResume();
    boolean installed = false;

    while (!installed) {
        installed = appInstalledOrNot (APPPACKAGE);
        if (installed) {
            Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show ();
        }
    }
} 

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

8
이것은 무한 루프입니다.
Robin Kanters 2015 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.