表題通りです。
*若干文章修正しました。
単純に他のアプリを起動したい場合、
WEB上で軽く検索かけると
明示的インテントでこちょこちょやるか
暗黙的インテントでインテントに対応するアプリを
一覧表示させてだったりという方法がでてきたりします。
だけどわざわざ一覧から選択させるのは
ユーザビリティー的にいけてない感じがするし
明示的にやるにしてもクラスファイルを探したりとだるい。
なのでそんな時は
PackageManager.getLaunchIntentForPackage(パッケージ名)
これ使うと楽です。
起動できるアプリなら下記な感じで起動可能。
/////////////////////////////////////////////////////
String pk = "com.android.vending" //GooglePlayの例
PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(pk);
if(intent !=null){
//Try catchでもいい
startActivity(intent);
}
/////////////////////////////////////////////////////
あとgetInstalledPackagesとかでアプリリスト作る場合、
何も考えずにリスト化すると起動できないのもまざります。
起動できないパッケージの場合、例えばWidgetだけのAPPでActivity持ってません。
もちろんManifestに下記の設定なんてしてません。
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
って時は起動できなかったりするので注意しませう。
なので起動する前にPackageManager.queryIntentActivities(Intent intent,int flag)で調べます。
*たぶんIntentのnullチェックでもいけるとおもうけどいけなくてクラッシュした記憶があった気がするので上記で調べたほうが安全かもと。ただ時間はちょいとられます。
使い方としては
/////////////////////////////////////////////////////
PackageManager pm = getPackageManager();
List<ResolveInfo> list=pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
if(list.size() > 0){
//1以上ならなら起動できる
}
/////////////////////////////////////////////////////
って感じです。
ちなみに端末の各設定画面なんかは基本同じintentを使えます
(例えば android.provider.Settings.ACTION_BLUETOOTH_SETTINGS)
でも端末ごとに搭載されてる、されてないなんかがあるみたいなので
そんなのももろもろこれで調べれます。
最後に最初のgetLaunchIntentForPackageと
組み合わせてみるとこんな感じでいいかなって感じ。
///////////////////////////////////////////////////////
public void isIntentStarting() {
PackageManager pm = getPackageManager();
//とりあえずGooglePlayでインテント作る。
String pk = "com.android.vending";
Intent intent = pm.getLaunchIntentForPackage(pk);
//インテントがいけるならtrueが返りstartActivityする。
if(isIntentAvailable(intent,pm)){
startActivity(intent);
}else{
Toast.makeText(getApplicationContext(), "起動できません", Toast.LENGTH_SHORT).show();
}
}
//インテントが起動できるか確認用。
public boolean isIntentAvailable(Intent intent,PackageManager pm){
if(intent != null){
List<ResolveInfo> list=pm.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
return false;
}
///////////////////////////////////////////////////////
以上でした。