21

私は自分のアプリをAmazonAppStoreとGooglePlayで公開する予定ですが、アプリがAmazon App Storeからインストールされたかどうかによって、動作が少し異なる必要があるものがいくつかあります。メソッドを正しく理解していればPackageManager.getInstallerPackageName(String packageName)、アプリをインストールしたアプリケーションの名前がわかります。右?もしそうなら、私のアプリAmazon App Storeからインストールされた場合、このメソッドによって返される値がどうなるかを誰かが知っていますか?そうでない場合、私のアプリがAmazon App Storeからインストールされたかどうかを判断するために使用できる他の方法を誰かが知っていますか?

注:PackageManager.getInstallerPackageName(String packageName)私のアプリをインストールしたアプリケーションの名前を決定するための使用法をほのめかして答えられたStackOverflowに関する他の質問を知ってい ます。ただし、Stack Overflowなどを検索したところ、Amazonアプリストアからアプリをインストールした場合に返される 値を特定できませんでした。PackageManager.getInstallerPackageName(String packageName)

4

4 に答える 4

24

samsungはPackageManager.getInstallerPackageName()を実装していないため、nullを返します。したがって、PackageManager.getInstalledPackages()を使用してすべてのパッケージを取得し、samsungappパッケージ名「com.sec.android.app.samsungapps」を検索します。

店舗:

null - developer
com.android.vending - google play
com.amazon.venezia - amazon app
com.sec.android.app.samsungapps - samsung app store

コード:

// lets start with google play store link
String link = "https://play.google.com/store/apps/details?id=com.hellothupten.capital2countryquiz";

//find out the installer for your app package name.
String installer = getPackageManager().getInstallerPackageName(
        "com.hellothupten.capital2countryquiz");

if (installer == null) {
    List<PackageInfo> installedPackages = getPackageManager()
            .getInstalledPackages(PackageManager.GET_ACTIVITIES);
    for (PackageInfo p : installedPackages) {
        if (p.packageName.contains("samsungapps")) {
            // change to samsung app store link
            link = "http://apps.samsung.com/mars/topApps/topAppsDetail.as?productId=000000840239";
            break;
        }
    }
} else if (installer.contains("amazon")) {
    // change to amazon app store link
    link = "amzn://apps/android?p=com.hellothupten.capital2countryquiz";
} else if (installer.contains("samsung")) {
    // change to samsung app store link. This does not
    // exist..but who knows samsung may implement
    // getInstallerPackageName in future, I assume it will
    // contain a word samsung in its package name.
    link = "http://apps.samsung.com/mars/topApps/topAppsDetail.as?productId=000000840239";

}

リンク変数をストアリンクとして使用します。

アップデート:

samsungapps://ProductDetail/com.sec.chaton

サムスン:http ://developer.samsung.com/android/technical-docs/Samsung-Apps-Deeplink-Guide

于 2014-05-22T21:37:07.673 に答える
11

朗報です!どうやら、Amazonストアの最新バージョンは最終的にGooglePlayのとは対照的に設定PackageManager.getInstallerPackageName()されています。"com.amazon.venezia""com.android.vending"

古いアプリは引き続き返さnullれます。実際にAPIを確認していないか、新しいストアをインストールしてから古いアプリをアップグレードするとインストーラーが設定されるかどうかは確認していません。ただし、新しいアプリをインストールしてチェックすると、正しく設定されている/data/system/packages.xmlことがわかります。installer

于 2013-05-31T17:39:57.703 に答える
7

を呼び出すPackageManager.getInstallerPackageName(myPackageName)と、myPackageName(インストーラーを決定するアプリの)パッケージの名前は次のようになります。

  • nullアプリがAmazonアプリストアからインストールされた場合
  • nullアプリがアプリストアの外部に直接インストールされた場合。
  • com.android.vendingアプリがGooglePlayからインストールされた場合。

(ポインタをありがとう@CommonsWare。)

于 2012-11-08T16:41:43.047 に答える
6

自分のアプリがAmazonストアからインストールされているかどうかを判断しようとしているので、以下はその状況に関係します。ただし、質問してから状況が変わったため、この回答は、2012年ではなく、投稿された2016年に有効です。

上記のように、2013年半ば以前にリリースされたバージョンのAmazonインストーラーによってインストールされたアプリは、そのメソッドにインストールされたアプリのパッケージ名が渡されると、getInstallerPackageName()からnullを返します。しかしその後、彼らはそのような電話のために「com.amazon.venezia」を返し始めました。そして最近、Amazon Undergroundアプリは、2番目のインストーラーパッケージ名com.amazon.mshop.androidを割り当てる場合があります。

したがって、これらの古いバージョンのインストーラーが実際に発生する可能性があると思われる場合、これは完全に信頼できる指標ではありません。単純にサイドロードされた(ローカルストレージに保持されているAPKからインストールされた)アプリも通常、getInstallerPackageName( )そのメソッドがそのパッケージに対して呼び出された場合、したがって、それらの古いAmazonストアアプリの1つによってインストールされたアプリと区別できなくなります。

この問題にもかかわらず、このアプローチを使用したいが、インストーラーをnullとしてマークする古いバージョンのインストーラーを持つデバイスのフォールスネガティブを回避したい場合は、次のことを試してください。

  • getInstallerPackageName()をテストして、null以外かどうかを確認します。

  • nullでない場合は、com.amazonで始まるかどうかをテストします。そうであれば、Amazonからインストールされたと信じることができ、そうでない場合は、Amazonからインストールされなかったと信じることができます。

  • ただし、nullの場合は、デバイス上のすべてのパッケージを繰り返し処理し、検出された各パッケージ名をgetInstallerPackageName()にフィードして、「com.amazon」で始まるパッケージが1つでもあるかどうかを確認して追加のテストを実行します。

    • その値を持つものがない場合、null値はあいまいであり、アプリがAmazonストアからインストールされたかどうか(サイドロードではなく)に関する情報がないことを考慮する必要があります。

    • ただし、そのインストーラーパッケージ値を持つアプリが1つでもある場合は、アプリがAmazonストアからインストールされていないと見なすことができます。これは、インストールされたアプリにタグを付けるバージョンのAmazonストアがデバイスで実行されているためです。 「com.amazon」で始まるインストーラーパッケージ名を使用します。これは、自分以外のアプリが実際にその方法でタグ付けされていることを前提としています。これは、他の方法で発生する可能性は非常に低いです。つまり、アプリのnull値は、Amazonインストーラーではなく、他のインストーラーによって作成されたということです。おそらく、アプリがAPKのローカルコピーからサイドロードされたことを意味します。

于 2016-04-22T07:34:28.703 に答える