Поддержка ссылок Amazon и Android market (Google Play) внутри приложения

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

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

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

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

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

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

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


person user432209    schedule 29.03.2011    source источник
comment
@user432209: FWIW, совсем недавно это обсуждалось в android-developers группе Google: groups.google.com/group/android-developers/browse_frm/thread/   -  person CommonsWare    schedule 30.03.2011
comment
Вау, разочаровывает, но приятно знать. Спасибо.   -  person user432209    schedule 30.03.2011
comment
Запущен еще один рынок... еще один рынок, о котором нужно заботиться... нужно поддерживать еще одну версию того же приложения... Мне не нравится, как все идет...   -  person WarrenFaith    schedule 30.03.2011


Ответы (7)


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

person mttmllns    schedule 31.05.2013
comment
как amazon store устанавливает имя пакета? вы сами указываете имя пакета вручную. Вы можете это объяснить? - person Emil; 06.12.2017

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

  1. Завершите подготовку и подписание заявки.
  2. Установите его на тестовое устройство
  3. Используйте 1_

Как это сделать:

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

person Reed    schedule 07.10.2011

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

  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

person Sagar Waghmare    schedule 08.01.2013
comment
Всегда ли это Амазонка? Я думал, что любой телефон Android может загрузить приложение из магазина Amazon? - person Emil; 15.10.2017

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

Лучший способ — проверить, установлен ли рынок Android, и действовать соответствующим образом: установлен-на-моем-пользователе-устройстве">здесь.

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

person Carlo Medas    schedule 06.10.2011
comment
Очень круто! Искал такое поле, но не нашел! - person Peterdk; 19.12.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;
    }

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

person Peterdk    schedule 16.12.2012
comment
Мой Amazon Fire HD 7 (2013 г.) работает на рынке: намерения для магазина GP. Он обрабатывает их, открывая диалоговое окно, спрашивающее пользователя, хочет ли он перейти на страницу в Amazon Appstore для того же приложения (даже если эта страница не существует). Если пользователь нажимает «Продолжить», он переходит на страницу этого приложения в магазине приложений или, если приложение еще не существует в магазине приложений, на главную страницу магазина приложений. Таким образом, несмотря на то, что описанное выше могло сработать в 2012 году, вы не сможете просто проверить, существует ли приложение для обработки этого намерения, чтобы узнать, следует ли вам использовать Market или Amazon. URL. - person Carl; 10.08.2014

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

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

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

person ProjectJourneyman    schedule 31.03.2011
comment
После изучения большего количества рынков (Nook, BlackBerry и т. д.) стало еще более очевидным, что отдельные сборки являются единственным правильным решением. Динамическая проверка установленных маркетов очень проблематична и приведет к неправильным результатам для пользователей нескольких магазинов (например, Google Play и Amazon Appstore). Кроме того, существует больше проблем, чем просто связывание более сложных приложений. - person ProjectJourneyman; 23.04.2012
comment
ваш ответ действительно довольно старый, но мои вопросы: если пользователь устанавливает через amazon, имя пакета должно содержать amazon, не так ли? в чем проблема с этим? даже если телефон может иметь несколько магазинов. - person Emil; 15.10.2017
comment
Вы можете включить имя пакета amazon, если вы выберете для своей сборки amazon, но многие приложения используют одно и то же имя пакета для всех магазинов приложений. Затем вы можете проверить имя своего пакета, чтобы решить, как его связать. Я решил использовать ресурсы варианта сборки, чтобы определить, в какой сборке я нахожусь, и иметь библиотеку для обработки механики связывания для каждого магазина: github.com/TimMackenzie/AndroidMarketManager - person ProjectJourneyman; 06.12.2017

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

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

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

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

person Carl    schedule 10.08.2014