26

今日、私のアプリケーションの 1 つが Amazon アプリ ストアから拒否されました。理由は、アプリ内で Android マーケットの有料版アプリにリンクしていたためです。残念だけど、みんな自分のカットを望んでいるんだろうな…

そのため、アプリケーションを変更して、Android マーケットのリンクを Amazon アプリ ストアのリンクに変更する必要があります。今のところは大したことではありませんが、そうすると、Android マーケットに新しいバージョンをアップロードしたいときに矛盾が生じます。結局のところ、誰かが Android マーケットからアプリを購入した場合に、誰かを Amazon アプリ ストアにリンクするのはかなり愚かなことです。

同じアプリの複数のバージョンをサポート/管理するのは大変なことです。したがって、私の質問は、同時に両方にリンクするにはどうすればよいですか? アプリがどこからダウンロードされたかを知る方法はありますか?そのため、両方のリンクをアプリにコーディングして、ユーザーを自動的にどちらか一方に誘導することができますか? 第二に、ユーザーに選択肢を与えることは Amazon TOS に反しますか (代わりにダイアログをポップアップして、どこからダウンロードするかをユーザーに尋ねます)。

皆さんありがとう。

編集: Amazonカスタマーサービスから直接「Re:両方の市場へのリンク」(承認プロセスがこれらの人たちと同じくらい速ければいいのに):

当面は、マーケット リンクについてのみ、Amazon アプリストアに戻るリンクが必要です。あなたのウェブサイトへのリンクは許可されていますが、他の市場では許可されていません.

アップセルを含む、アプリ内から他のアプリを指す場合、購入の完了は Amazon アプリストアからである必要があります。

4

7 に答える 7

12

朗報です!どうやらAmazon ストアの最新バージョンは、PackageManager.getInstallerPackageName()Google "com.amazon.venezia"Play の"com.android.vending". これは、アプリがサイドロードされているか、Amazon からインストールされているか、Google からインストールされているかを判断する最も簡単な方法です。

于 2013-05-31T17:49:44.147 に答える
8

できることは次のとおりです。

  1. 申請書の準備と署名を完了します。
  2. テストデバイスにインストールします
  3. 使用するPackageManager.getPackageInfo

これを行う方法:

public static boolean isMarket(Context context){
    boolean isMarketSig = false;
    int currentSig = 1;
    try {
        Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
        for (Signature sig : sigs)
        {
            currentSig = sig.hashCode();


    Log.i("MyApp", "Signature hashcode : " + sig.hashCode());
// This Log is for first time testing so you can find out what the int value of your signature is.
            }
            } catch (Exception e){
                e.printStackTrace();


}
//-1545485543 was the int I got from the log line above, so I compare the current signature hashCode value with that value to determine if it's market or not.
        if (currentSig==-1545485543){
            isMarketSig = true;
    } else {
        isMarketSig = false;
    }

    return isMarketSig;
}
public static void openStore(Context context){
    if (isMarket(context)){
        Intent goToMarket = new Intent(Intent.ACTION_VIEW,Uri.parse("market://d" +
        "etails?id=com.jakar.myapp"));
        goToMarket.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(goToMarket);  
    } else {
        Intent goToAppstore = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.amazon.com/gp/mas/dl/andro" +
        "id?p=com.jakar.myapp"));
        goToAppstore.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(goToAppstore);
    }
}

基本的に、テスト デバイスにインストールされたアプリから取得する hashCode() は、市場から取得したものと同じになります。https://developer.amazon.com/help/faq.htmlによると、アプリストアは開発者アカウントに固有の署名でアプリケーションに署名するため、アプリストアからのハッシュコードは異なります。実際に署名したものを値します。

注:うまく市場を開拓できますが、私はまだこの方法を App Store に展開していないため、完全にはテストしていません。うまくいくと確信していますが、保証はできません。したがって、私が提案した方法を使用して失敗した場合でも、私に責任を負わせないでください。

于 2011-10-07T03:41:48.277 に答える
6

次のことができます。

  1. デバイスが製造元に基づいているかどうかを確認します。例: https://developer.amazon.com/sdk/fire/specifications.html

  2. レビューを書き、Amazon App Store を開くには、次のインテントを使用します

    amzn://apps/android?p=package_name
    

    p=Link特定のパッケージ名の詳細ページの 場所。

参照: Amazon 開発者リンク。

https://developer.amazon.com/sdk/in-app-purchasing/sample-code/deeplink.html

于 2013-01-08T08:06:38.710 に答える
5

あなたが言ったように、ブール値を使用して、アプリを 2 回ビルドすることを余儀なくされる可能性があるため、それは最善の方法ではないと思います。

最善の方法は、Android マーケットがインストールされているかどうかを確認し、それに応じて行動することです:こちら.

別のさらに複雑な方法は、PackageManager.getInstallerPackageNameを使用して、アプリのインストーラーの名前を照会することです。Android マーケットがインストールされている Android デバイスを使用している場合でも、並行マーケットによってアプリをインストールできるため、追加の作業が必要です。また、デバッグ/開発としてインストールされているかどうかを確認する必要があります (この場合、インストーラー パッケージ名は null です)。

于 2011-10-06T10:36:10.293 に答える
4

これを行うのはなんと難しいことでしょう。マーケットの URL を開きたいだけの場合は、Android マーケットの URL を含むインテントに、それを処理する方法を知っているアクティビティがあるかどうかを確認してください。そうでない場合は、別の意図で amazon アプリストアを開きます。

 /**
     * Returns intent that  opens app in Google Play or Amazon Appstore
     * @param context
     * @param packageName
     * @return null if no market available, otherwise intent
     */
    public static Intent showApp(Activity activity, String packageName)
    {
        Intent i = new Intent(Intent.ACTION_VIEW);
        String url = "market://details?id=" + packageName;
        i.setData(Uri.parse(url));

        if (isIntentAvailable(activity, i))
        {               
            return i;
        }

        i.setData(Uri.parse("http://www.amazon.com/gp/mas/dl/android?p=" + packageName));
        if (isIntentAvailable(activity, i))
        {
            return i;
        }
        return null;

    }

    public static boolean isIntentAvailable(Context context, Intent intent) {
        final PackageManager packageManager = context.getPackageManager();      
        List<ResolveInfo> list =
                packageManager.queryIntentActivities(intent,
                        PackageManager.MATCH_DEFAULT_ONLY);
        return list.size() > 0;
    }

別の方法は、ant を使用してビルドすることです。このようにして、アプリ市場を表す値に設定された定数を使用して Java クラスを動的に生成し、さまざまなビルドを簡単に出力できます。ただし、これには多少の学習が必要ですが、実行すると非常に簡単です。

于 2012-12-16T16:43:53.357 に答える
0

プロジェクトの大部分をプロジェクト ライブラリにリファクタリングし、一意のアイコンと文字列リソース、マニフェストで宣言された独自のパッケージ ID、およびライブラリで定義したメイン アクティビティ。

このように、特定のアプリ プロジェクトの各アクティビティで、ライブラリのメイン アクティビティで定義された仮想メソッドまたは抽象メソッドをオーバーライドすることで、すべての一意の URL を提供できます。これらの URL を表示するライブラリ コードは、これらの各メソッドへの多態的な呼び出しを介して URL を取得できます。

そうすれば、そのような特殊なプロジェクトはそれぞれ非常に小さくなり、ここで説明するように、メンテナンスは主にライブラリに対して行われます。

コードベースを共有する複数のアプリ

于 2014-08-10T04:41:53.203 に答える
0

私もこれに苦労していましたが、Amazon の無料アプリですぐに成功したので、新しいビルドを作成するときに .apk の 2 番目のセットを作成する時間が必要であると判断しました。ここでは、Amazon ブール値フラグを使用して、1 つの共通バージョンを作成し、次に Amazon 市場向けに 1 ずつインクリメントされたバージョンを作成します。知る限り、内部リンクを要求する市場は他にありません。

最終的には、何をすべきかを自動的に判断する巧妙な方法で Market Chooser をコーディングするつもりですが、多くの変数があります - 1 つのアプリの市場アドレスだけでなく、さまざまな市場がすべてのアプリを見つけるために会社名をどのように認識しているかなどです。 . 一部のマーケット アプリはメインの Android マーケット プロトコルをハイジャックします (たとえば、私の記憶が正しければ Appslib と SlideMe) が、同じように会社名を保存しません。次に、アップセル リンクの行き先を決める必要があります - 同じ市場または共通の市場 (私が使用するほとんどの市場に無料アプリを提出しただけです)。

有料アプリが承認されるのを待っていますが、無料アプリのダウンロード数を考えると、Amazon マーケットで利用できるようにする価値があると確信しています。

于 2011-03-31T06:43:57.920 に答える