2012-06-17 14 views
10

Amazon App StoreまたはGoogle Playストアからアプリケーションがダウンロードされたかどうかを知る方法はありますか?もちろん、アプリ自体の中にあった。アプリがGoogle PlayやAmazonからダウンロードされたかどうかを確認するにはどうすればよいですか?

私は両方のサイトにアプリをデプロイしましたが、顧客がアプリケーション内でどこからダウンロードしたかを知りたいと思っています。私は知っている、私は各サービスに異なるアプリケーションを展開することができますが、これは、同じパッケージを使用してアプリ内の条件付きでそれを解決するいくつかの方法があった場合避けることができるいくつかのメンテナンス作業を追加します。

コードで
+3

それぞれのリリース内で、どこにアップロードされたかを示す変数だけがありますか?または、ユーザとしてOptionPaneを持っていてください... –

+9

'PackageManager'と' getInstallerPackageName() 'は、インストーラの内容を教えてくれます。さまざまなシナリオでどのような結果が得られるかを確認するには、実験を実行する必要があります。 – CommonsWare

+0

あなたが何を思いついたのか実験したら? – ahsteele

答えて

12

final PackageManager packageManager = getPackageManager(); 

try { 
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0); 
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Play Store 
    } 
} catch (final NameNotFoundException e) { 
    e.printStackTrace(); 
} 

はGoogle Playストアから来たかを示します "com.android.vending"。 Amazon Appstoreの内容はわかりませんが、上記のコードを使用してテストするのは簡単です。

経由ADB:

adb shell pm dump "PACKAGE_NAME" | grep "vending" 

例:

adb shell pm dump "com.android.chrome" | grep "vending" 

installerPackageName=com.android.vending 
+0

Androidスタジオデバッガに接続し、Google Nexus 7とKindle Fire HDの両方に直接ビルドすると、これは 'null 'の' installerPackageName'を生成します。それはデバッガに接続されていると予想されますか?それがrelease.apkのときに正当な文字列を返すでしょうか? –

+1

はい、いいえ。アプリがアプリストア経由でインストールされていない場合や、インストールしているアプリストアがフィールドを設定していない場合は、「null」と表示されます。 Android Studioで使用されるインストーラは、フィールドを設定しないため、nullです。 (私にとっては、「実行」タブの「DEVICE SHELL COMMAND:pm install -r」/data/local/tmp/com.mypackage.myapp "'のように)どんな場合でも、Android Studioは値を設定することはほとんどありませんcom.androidに。'com.android.studio'や何かにもっと可能性があります。 – nmr

1

ほとんどの場合、あなたはこれと同様のチェックを含むことにより、店舗名を取得することができますが:

final PackageManager packageManager = getPackageManager(); 

try { 
    final ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0); 
    if ("com.android.vending".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Play Store 
    } else if ("com.amazon.venezia".equals(packageManager.getInstallerPackageName(applicationInfo.packageName))) { 
     // App was installed by Amazon Appstore 
    } else { 
     // App was installed from somewhere else 
    } 
} catch (final NameNotFoundException e) { 
    e.printStackTrace(); 
} 

"com.andr oid.vending」Google Playストアやプレイです
『com.amazon.veneziaは』アマゾンのAppStoreであり、それはベータ期間中例えばとして、

は結果がしかし、信頼できない可能性がサイドロードされた
nullが店舗をテストこの値を設定し、ほかには、店舗名として解釈される可能性がインストーラのパッケージ名を指定してアプリをサイドロードすることができますしない場合があります。

adb install -i <INSTALLER_PACKAGE_NAME> <PATH_TO_YOUR_APK> 
あなたは、たとえば、異なる店舗ごとに異なるパッケージ名を持つ検討する必要があります

Googleの "com.example.yourapp"とAmazonの "com.example.yourapp.amazon" - あなたは簡単にできるあなたのGradleスクリプトにそれらを設定してください。

関連する問題