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()メソッドがあるようです。