2011年4月17日 星期日

判斷某個 package 是否存在與開啟某個 App

最近的專案碰到的新東西…記錄一下…
以下是尋找裝置中是否有安裝某個 package
通常用在判斷當有裝某東西才做某些事時用到,目前知道的方法有兩種…

方法一,列舉出全部的 package 比對


boolean bExists = false;
final List<PackageInfo> packs = _service.getPackageManager().getInstalledPackages(0);
for(int i = 0; i < packs.size(); ++i)
{
final String packageName = packs.get(i).packageName;
if(packageName != null && packageName.startsWith("com.Ascii.Widget.AsciiApp"))
{
bExists = true; break;
}
}

if(!bExists)
{
//不存在
}


方法二,找該 package 的資訊


PackageManager manager = _service.getPackageManager();
Intent intent = new Intent().setPackage("com.Ascii.Widget.AsciiApp");
List<ResolveInfo> infos = manager.queryIntentActivities(intent, PackageManager.GET_INTENT_FILTERS);

if (infos == null || infos.size() < 1)
{
// 不存在
}


若尋找到此 package 要開啟它來做某些事呢?
開啟的方法就如下列範例,比較需注意的是除了 package Name 之外,
還要指定啟動的 Class Name


// 啟動某個 App,例如由目前的 HomeActivity 啟動 AsciiApp

public class HomeActivity extends Activity
{
public void ShowAsciiApp()
{
try
{
Context myContext = this.createPackageContext("com.Ascii.Widget.AsciiApp",  0);  
Intent intent = new Intent();
intent.setPackage("com.Ascii.Widget.AsciiApp");
intent.setClassName(myContext, "com.Ascii.Widget.AsciiApp.MainActivity");
intent.setAction("android.intent.action.MAIN");
this.startActivity(intent);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


若不知道想開啟的 package 起始類別叫啥米名字,印像中是有方法可以得到的,
好像在上面方法二的 infos 物件中某個 method 可以拿到,
等到空閒時再整理清楚一些。

當然也可以交給作業系統以預設 App 處理,例如 http 就會開啟瀏灠器…
Uri uri = Uri.parse("http://www.google.com.tw");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

沒有留言:

張貼留言