Xamarin.Android での, 対象のアプリが端末内にインストールされているかどうかの判別と, もしインストールされていなかったらインストールページヘ飛ばす処理, についてです.
やりたいこと
自アプリから外部アプリを開かせるときに, その対象のアプリが端末に入っていなかったらおかしなことになります. (Androidではアプリが落ちて, iOSでは無反応.)
例えば, 『twitter://』というURIを開いたら, 公式のTwitterクライアントアプリが起動するのですが,
その時に端末にそのTwitterアプリが入っていなかったら, マズイですよね.
端末側(OS)は
「なんか『twitter://』開けって言われたけど, そんなの知らんしどうしればいいの」
って感じです.
なので
- もし対象のアプリが端末内に入っていたら → そのアプリのカスタムURLスキームで開く
- もし対象のアプリが端末内に入っていなかったら → そのアプリのインストールページ( Google Play Store の対象のページ )へ飛ばす
ということをします.
checking if the app is currently installed on the device
対象のアプリが端末内に入っているかどうかのチェックをします
参考: on Java (not on C#, Xamarin)
Detect an application is installed or not? | stackoverflow
対象のアプリがインストールされていたら true, まだインストールされていなかったら false を返す関数を書きました
// fragment内
// 対象のアプリがインストールされていたら true, まだインストールされていなかったら false を返す
bool IsInstalledApp(string package_name)
{
var package_manager = this.Activity.PackageManager;
try
{
package_manager.GetPackageInfo(
packageName: package_name
, flags: Android.Content.PM.PackageInfoFlags.Activities
);
return true; // インストールされている
}
catch (Android.Content.PM.PackageManager.NameNotFoundException)
{ }
return false; // インストールされていない
}
これは PackageManager クラスを使うのですが, これは Context にぶら下がっているものなので, Activity の下にいます.
だからこれを Activity 内に書くなら
this.Activity.PackageManager
ではなく, たんに
this.PackageManager
で いけると思います.
メイン処理
たとえば, 開きたい対象のアプリが以下のようなものだったとします:
| アプリID | “com.example.app” |
| カスタムURL | “app://” |
| GooglePlayのURL | “https://play.google.com/store/apps/details?id=com.example.app” |
その時のメイン処理を書きました.
外部のアプリを開く. もしそのアプリが端末に入っていなかったら GooglePlay の対象のインストールページヘ飛ばす処理 です
// 外部のアプリを開く. もしそのアプリが端末に入っていなかったら GooglePlay の対象のインストールページヘ飛ばす処理
public void OpenOtherApp()
{
// もし対象のアプリが端末にインストールされていたら:
if (IsInstalledApp(package_name: "com.example.app"))
{
var url = "app://app.example.com";
// 目的のアプリを起動する
var intent = new Intent(
action: Intent.ActionView
, uri: Android.Net.Uri.Parse(url)
);
StartActivity(intent);
}
// まだ対象のアプリが端末にインストールされていなかったら
else
{
// GooglePlay のインストールページに飛ばす
var intent = new Intent(
action: Intent.ActionView
, uri: Android.Net.Uri.Parse(uriString: "https://play.google.com/store/apps/details?id=com.example.app")
);
StartActivity(intent);
}
}
誰かの役に立てばいいなあ(((o(*゚▽゚*)o)))
