4

重複の可能性:
アプリケーションがグーグルプレイまたはサイドロードからインストールされていることを知る方法は?

複数のモバイルプラットフォーム間で移植可能なアプリケーションがあります。これは、アプリケーションが使用するかなり大きなデータをフェッチするために必要な独自の更新メカニズムを提供します。現在、このメカニズムは、アプリケーションの更新されたバージョンをダウンロードすることもできます。ユーザーが手動で.apkをインストールした場合、このメカニズムを介して新しいバージョンを出荷したいのですが、Androidマーケット(または他のマーケット)からインストールした場合は、マーケットアプリケーションがアップグレードを処理して自分で実行しますそれと競合するでしょう。

では、アプリケーション内から、アプリケーションが市場経由でインストールされたかどうかを検出することは可能ですか?

4

1 に答える 1

7

Google Playからインストールするとcom.android.vending.INSTALL_REFERRER、インストールプロセス中にブロードキャストが受信されます。このためのブロードキャストレシーバーを作成しSharedPreferencesの線に沿ってブール値をfromGooglePlay設定します。これは、レシーバーでtrueに設定できます。

ただし、Amazonのような他のアプリストアでも同様のレシーバーを使用できるとは思いません。

編集1:

@zaplがコメントで指摘しているように、これはAndroid 3.0以降では機能しません。これは、少なくとも1回起動されていないアプリは、ブロードキャストなどを受信する資格がないためです。

ただし、別の解決策を試すことができます。

あなたのアプリでは、どこかに一定のブール値がありますGOOGLE_PLAY_BUILD。Google Play用のapkを作成する場合は、これをに設定しtrue、手動配布用のapkを作成する場合は、これをに設定しfalseます。次に、実行時にその値を確認し、それに応じて動作します。

編集2:

あなたのアプリを配布するroot化されたデバイスに関するあなたの懸念に対処するために、ここにもっと複雑なシステムがあります。

各デバイスには一意のANDROID_IDがあります(ただし、ドキュメントに記載されている内容にもかかわらず、4.2のマルチユーザーには複数のユーザーがいるようです)。基本的には、一意のデバイスIDが必要なだけなので、MACアドレスでもかまいません。

Google Playブロードキャストを受信したかどうか、およびGoogle Playフラグの値に関係なく、一意のIDを格納するためのテーブルをWebサーバーに用意します。アプリを初めて起動するときに、そのデバイスのこれらの詳細をテーブルに追加します。

その後アプリを起動したら、3つの詳細すべてがローカルに保存されているコピーと一致するかどうかを確認するだけです。ユーザーがルート化されたユーザーからアプリを取得してインストールした場合、Google Playフラグは一致しているように見えますが、リファラーのインストール部分は一致しません。残念ながら、これはプレハニカムデバイスでのみ機能します。

または、わずかに信頼に基づくシステムでは、ユーザーに手動でインストールしたのか、GooglePlayからインストールしたのかを尋ねることができます。更新方法を選択することであり、Google Playの外部からインストールするために起訴することではないと言えば、彼らは喜んで真実を語ってくれると思います。

編集3

@Janがコメントで指摘したように、PackageManagerにはこの目的に使用できるgetInstallerPackageName()メソッドがあるようです。

于 2012-11-15T13:45:06.477 に答える