Поддержка ссылок Amazon и Android market (Google Play) внутри приложения - PullRequest
25 голосов
/ 30 марта 2011

Итак, сегодня одно из моих приложений было отклонено из магазина приложений Amazon. Причина была в том, что внутри моего приложения я связался с платной версией приложения на рынке Android. Разочаровывает, но что угодно, я думаю, все хотят, чтобы их вырезали ...

Так что теперь мне осталось изменить приложение, чтобы изменить ссылку Android Market на ссылку магазина приложений Amazon. Ничего страшного, за исключением того, что если я сделаю это, у меня останется несоответствие, когда я захочу загрузить более новую версию обратно на рынок Android. В конце концов, было бы довольно глупо связывать кого-то с магазином приложений Amazon, если они покупают приложение на рынке Android.

Теперь мы все знаем, что это проблема - поддержка / управление несколькими версиями одного и того же приложения. Следовательно, у меня возникает вопрос: как я могу связываться с обоими одновременно? Есть ли способ узнать, откуда было загружено приложение, чтобы я мог кодировать обе ссылки в приложение и, таким образом, автоматически указывать пользователю одну или другую? Во-вторых, противоречит ли Amazon TOS предоставлению пользователю выбора (скажем, вместо этого я выскакиваю диалоговое окно и спрашиваю пользователя, откуда его загружать)?

Спасибо всем.

Редактировать: Прямо из службы поддержки Amazon "Re: Связь с обоими рынками" (хотелось бы, чтобы процесс одобрения был таким же быстрым, как у этих ребят):

Пока нам нужны связывание, чтобы указать на Амазонку AppStore только для рыночных ссылок. Ссылка на ваш сайт разрешена, просто не другие рынки.

При указании на другие приложения из в вашем приложении, включая продажи, завершение покупки должно быть от Amazon Appstore.

Ответы [ 7 ]

12 голосов
/ 31 мая 2013

Хорошие новости! Очевидно, последняя версия магазина Amazon наконец устанавливает PackageManager.getInstallerPackageName() на "com.amazon.venezia" в отличие от "com.android.vending" в Google Play.Это будет самый простой способ определить, загружено ли ваше приложение, установлено ли оно из Amazon или установлено из Google.

8 голосов
/ 07 октября 2011

Вот что вы можете сделать:

  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, поэтому я не полностью его протестировал.Я уверен, что это сработает, но не может дать никаких гарантий, поэтому, если вы используете то, что я предложил, и это не помогает, пожалуйста, не привлекайте меня к ответственности.

6 голосов
/ 08 января 2013

Вы можете сделать следующие вещи:

  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

5 голосов
/ 06 октября 2011

Как вы сказали, вы можете использовать логическое значение, а затем дважды вынуждены создавать свои приложения, поэтому я верю, что это не лучший способ.

Лучший способ - проверить, установлен ли android market, и действоватьсоответственно: здесь .

Еще один более сложный способ - запросить имя установщика вашего приложения, используя PackageManager.getInstallerPackageName .Это требует дополнительной работы, поскольку приложение может быть установлено на параллельных рынках, даже если вы работаете на устройстве Android с установленным Android Market, а также вы должны проверить, установлено ли оно как отладка / разработка (в этом случае имя установочного пакета равно нулю).

4 голосов
/ 16 декабря 2012

Какой сложный способ сделать это. Если вы просто хотите открыть URL-адрес рынка, просто проверьте, имеет ли намерение с URL-адресом для рынка Android какое-либо действие, которое знает, как с этим справиться. Если нет, откройте магазин приложений 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;
    }

Другой способ - построить с помощью муравья. Таким образом, вы можете динамически генерировать Java-класс с константами, установленными в значение, представляющее рынок приложений, и легко выводить различные сборки. Это, однако, требует некоторого обучения, но когда оно работает, это очень просто.

0 голосов
/ 10 августа 2014

Просто реорганизуйте большую часть своего проекта в Библиотеку проектов, а затем создайте несколько проектов (например, для каждого магазина приложений), которые имеют только уникальные иконки и строковые ресурсы, собственный идентификатор пакета, объявленный в манифесте, а затем основное действие это расширяет основную деятельность, которую вы определили в вашей библиотеке.

Таким образом, все уникальные URL-адреса могут быть предоставлены путем переопределения в активности каждого конкретного проекта приложения виртуальных или абстрактных методов, определенных в основной деятельности вашей библиотеки. Код библиотеки, который отображает эти URL-адреса, может получить их посредством полиморфного вызова каждого из этих методов.

Таким образом, каждый такой специализированный проект будет очень маленьким, и обслуживание будет осуществляться в основном для вашей библиотеки, как описано здесь:

Несколько приложений с общей базой кода

0 голосов
/ 31 марта 2011

Я тоже боролся с этим, но решил, что мгновенный успех, который я вижу с моим бесплатным приложением на Amazon, гарантирует время для создания второго набора .apks, когда я делаю новую сборку.Сейчас я выбрал логический флаг Amazon и создал одну общую версию, а затем версию, увеличенную на единицу для рынка Amazon.Никакие другие рынки не требуют внутренней привязки, AFAIK.

В конечном итоге я намереваюсь закодировать средство выбора рынка с помощью хитрого способа автоматически выяснить, что делать, но есть много переменных - не только адрес рынкаодно приложение, но как разные рынки узнают название компании, чтобы найти все приложения.Некоторые рыночные приложения перехватывают основной протокол Android Market (например, Appslib и SlideMe, если я правильно помню), но не хранят название компании таким же образом.Затем вам нужно решить, куда будут переходить ссылки upsell - на тот же рынок или на обычный (я подал свое бесплатное приложение только на большинство рынков, которые я использую).

Я жду, пока появится мое платное приложениеодобрено, но я уверен, что оно будет стоить того, чтобы оно было доступно на рынке Amazon, учитывая, сколько загрузок я получил для моего бесплатного приложения.

...