【Xamarin .Android】【C#】端末に対象のアプリが入っているか判定. 無ければストアへ


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)))


投稿者:

ちょまど

千代田まどかです。よくちょまどと呼ばれます。Microsoft 社員。文系出身プログラマ兼マンガ家です。私の書いた記事一覧がこちらです

コメントを残す

メールアドレスが公開されることはありません。