จะตรวจสอบโดยทางโปรแกรมได้อย่างไรหากติดตั้งแอปพลิเคชั่นหรือไม่ใน Android


147

เราได้ติดตั้งแอปพลิเคชั่นแบบเป็นโปรแกรม

  1. หากติดตั้งแอปพลิเคชั่นไว้ในอุปกรณ์แอปพลิเคชั่นจะเปิดขึ้นโดยอัตโนมัติ
  2. มิฉะนั้นติดตั้งแอปพลิเคชันเฉพาะ

แนะนำฉัน. ฉันไม่รู้. ขอบคุณ


สำเนาซ้ำที่เป็นไปได้ของAndroid - ตรวจสอบว่ามีแอปอื่นอยู่หรือไม่
noelicus

คำตอบ:


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 (Native Method) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): ที่ android.view.IWindowSession $ Stub $ Proxy.add (IWindowSession .java: 516) 05-14 11: 37: 25.305: E / AndroidRuntime (7554): ที่ android.view.ViewRootImpl.setView (ViewRootImpl.java:494) "
DJhon

2
@BlueGreen: สวัสดีหวังว่าลิงก์นี้อาจช่วยคุณได้stackoverflow.com/questions/11451393/…ถ้าคุณใช้คลาสกล่องโต้ตอบหมายความว่าโปรดตรวจสอบ :)
Aerrow

1
@ Aerrow .. สมมติว่าฉันกำลังตรวจสอบ. apk ของฉันติดตั้งอยู่หรือไม่ เวลาติดตั้ง ... ฉันได้รับข้อยกเว้นเดียวกันขณะตรวจสอบแพ็คเกจ com.test.installedornot.My .apk ของฉันมีขนาดมากกว่า 9MB ในกรณีนี้ฉันจะจัดการข้อยกเว้นนี้ได้อย่างไร
DJhon

@BlueGreen: รหัสด้านบนจะตรวจสอบเฉพาะแอปที่ติดตั้งในขณะที่ติดตั้งสิ่งนี้จะไม่ทำงาน สำหรับกรณีของคุณใช้ Broadcast receiver เพื่อรับการแจ้งเตือนหลังจากติดตั้ง 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 Store หากแอพหายไปแม้ว่าจะต้องใช้ความระมัดระวังในอุปกรณ์ที่ไม่มี Play Store


สิ่งนี้ต้องใช้สิทธิ์ Android ที่เฉพาะเจาะจงเพื่อทำงานอย่างไร
Bootstrapper

@Bootstrapper: ไม่ไม่ต้องมีการอนุญาตพิเศษ
Jonik

ขอบคุณ (วิธีแก้ปัญหาการทำงาน)
อาเหม็ด Naveed

26

รหัสด้านบนใช้งานไม่ได้สำหรับฉัน วิธีการต่อไปนี้ใช้งานได้

สร้างวัตถุเจตนาด้วยข้อมูลที่เหมาะสมจากนั้นตรวจสอบว่าเจตนานั้นสามารถโทรออกได้หรือไม่ใช้ฟังก์ชั่นต่อไปนี้:

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
เนื้อหาของเจตนาคืออะไร สตริงที่มีชื่อแพคเกจไม่ทำงาน
Henrique de Sousa

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

หากแอปพลิเคชันถูกปิดใช้งานมันควรจะผิด
Hugo

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();จะเป็นมิตรกับสไตล์ java มากกว่านี้
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" ฉันได้แก้ไขคำตอบของฉันเพื่อแสดง packageName แทน uri
youravgjoe

3

ฉันคิดว่าการใช้รูปแบบลอง / จับไม่ค่อยดีสำหรับการแสดง ฉันแนะนำให้ใช้สิ่งนี้:

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 `` `ความสนุกสนานส่วนตัว isAppInstalled (บริบท: บริบท, uri: String): Boolean {val packageInfoList = context.packageManager.getInstalledPackages (PackageManager.GET_ACTIVITIES) คืน packageInfoList.asSequence () = uri} .any ()} `` `
Kishan B

3

น้ำยาทำความสะอาด (ไม่ต้องลองจับ) กว่าคำตอบที่ยอมรับได้ (ขึ้นอยู่กับAndroidRate Library ):

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

ตรวจสอบการติดตั้งแอพหรือไม่ใน Android โดยใช้ kotlin

สร้างส่วนขยาย 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

@Egemen Hamutçuคำตอบใน kotlin 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

ดังนั้น nicer กับ 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.