2012-09-05 164 views
2

我已經爲我的Android應用程序(比如說myapp://主機)註冊了url方案。以編程方式檢測Android上是否安裝了應用程序

在我的其他應用程序中,我可以通過使用Intent啓動該應用程序,但是如何檢查第一個應用程序是否已安裝而不啓動它?

iOS中

,它是那麼容易,因爲

[[UIApplication sharedApplication] canOpenUrl:@"myapp://"]; 

有Android中的等價? (簡單的方法)

我想檢查使用網址方案。我知道如何使用包名來檢查,但我不知道如何從PackageInfo獲得url方案,以及...(較硬的方式)

PackageManager pm = m_cContext.getPackageManager(); 
    boolean installed = false; 
    try { 
     @SuppressWarnings("unused") 
     PackageInfo pInfo = pm.getPackageInfo(szPackageName, PackageManager.GET_ACTIVITIES); 
     installed = true; 
    } 
    catch (PackageManager.NameNotFoundException e) { 
     installed = false; 
    } 

提前感謝!

注:這是同一個問題的適用於iOS的Android版本:0​​Detecting programmatically whether an app is installed on iPhone

回答

2

如果你知道如何啓動應用程序,然後創建一個啓動您的應用程序的意圖,然後調用queryIntentActivities

Intent intent = //your app launching intent goes here 
PackageManager packageManager = mContext.getPackageManager(); 
List<ResolveInfo> resolvedActivities = packageManager.queryIntentActivities(intent,0); 
if(resolvedActivities.size() >0) 
    \\present 
+3

這通常會起作用,但是可能有多個活動可以處理URL,所以最好真正檢查包名('ResolveInfo.activityInfo.packageName')。由於供應商爲避免(像往常一樣,有問題的)Applet專利所做的一些變化,情況變得更加複雜。這裏有更多的細節:http://commonsware.com/blog/2012/07/24/linkify-problem-detection-mitigation.html –

0

我使用類PackageManagerqueryIntentActivities在靜態方法:

public static boolean canOpenIntent(Context context, Intent intent) 
{ 
    boolean canOpenUrl = false; 
    PackageManager packageManager  = context.getPackageManager(); 
    List<ResolveInfo> resolvedActivities = packageManager.queryIntentActivities(intent, 0); 
    if(resolvedActivities.size() > 0) 
     canOpenUrl = true; 
    return canOpenUrl; 
} 
相關問題