Поддержка ссылок на Amazon и Android Market (Google Play) внутри приложения
Итак, одно из моих приложений было отклонено сегодня в магазине приложений Amazon. Причина в том, что внутри моего приложения я привязался к платной версии приложения на рынке Android. Разочаровывает, но что угодно, я думаю, каждый хочет их вырезать...
Итак, теперь мне осталось изменить приложение, чтобы изменить ссылку на рынок Android на ссылку магазина приложений Amazon. Не очень большое дело, если только я не сделаю этого, я останусь с расхождением, когда хочу загрузить более новую версию на рынок Android. В конце концов, было бы неплохо связать кого-то с магазином приложений Amazon, если они приобретут приложение с рынка Android.
Теперь мы все знаем, что это боль, поддерживающая/управляющая несколькими версиями одного и того же приложения. Следовательно, мой вопрос заключается в том, как я могу ссылаться на оба одновременно? Есть ли способ сказать, откуда было загружено приложение, поэтому я могу кодировать обе ссылки в приложении и, таким образом, автоматически указывать пользователю на тот или иной? Во-вторых, это против Amazon TOS, чтобы дать пользователю выбор (скажем, я выхожу из диалогового окна и спрашиваю пользователя, откуда его загружать)?
Спасибо всем.
Изменить: Прямо из службы обслуживания Amazon "Re: Ссылка на оба рынка" (я хочу, чтобы процесс утверждения был таким же быстрым, как эти ребята):
В настоящее время нам нужны любые ссылаясь на то, чтобы вернуться к Амазонке Appstore только для рыночных связей. Соединение с вашим сайтом разрешено, просто не на других рынках.
При указании на другие приложения из в вашем приложении, включая до продажи, завершение покупки должно быть Амазонка Appstore.
Ответы
Ответ 1
Хорошие новости! Видимо, последняя версия магазина Amazon наконец-то устанавливает PackageManager.getInstallerPackageName()
на "com.amazon.venezia"
, чтобы контрастировать с Google Play "com.android.vending"
. Это будет самый простой способ определить, загружено ли ваше приложение, установлено ли с Amazon или установлено из Google.
Ответ 2
Вот что вы можете сделать:
- Завершите подготовку и подписание приложения.
- Установите его на тестовое устройство
- Используйте
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 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, поэтому я не полностью его протестировал. Я уверен, что это сработает, но не может гарантировать никаких гарантий, поэтому, если вы используете то, что я предложил, и он не работает, пожалуйста, не держите меня в ответе.
Ответ 3
Вы можете сделать следующее:
-
Проверьте, не зависит ли устройство от производителя.
Например: https://developer.amazon.com/sdk/fire/specifications.html
-
Для написания отзывов и открытия магазина приложений Amazon используйте следующее намерение
amzn://apps/android?p=package_name
где p=Link
на странице сведений о конкретном имени пакета.
Ссылка: ссылка разработчика Amazon.
https://developer.amazon.com/sdk/in-app-purchasing/sample-code/deeplink.html
Ответ 4
Как вы сказали, вы можете использовать логическое значение, а затем будете вынуждены строить свои приложения дважды, поэтому я не знаю, как это сделать.
Лучший способ - проверить, установлен ли рынок Android и действовать соответственно: здесь.
Еще один более сложный способ - запросить имя установщика вашего приложения, используя PackageManager.getInstallerPackageName. Это требует дополнительной работы, поскольку приложение может быть установлено на параллельных рынках, даже если вы находитесь на устройстве Android с установленным рынком Android, а также вы должны проверить, установлен ли он как debug/development (в этом случае имя пакета установщика является нулевым).
Ответ 5
Какой трудный способ сделать это. Если вы просто хотите открыть рыночный URL-адрес, просто проверьте, имеет ли намерение с URL-адресом для рынка Android все действия, которые знают, как с ним справиться. Если нет, откройте приложение app amore 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 с константами, установленными на значение, представляющее рынок приложений, и легко выводить различные сборки. Это, однако, требует некоторого обучения, но когда вы его запускаете, это очень просто.
Ответ 6
Я также боролся с этим, но решил, что мгновенный успех, который я вижу в своем бесплатном приложении на Amazon, требует времени для создания второго набора .apks, когда я делаю новую сборку. На данный момент я пошел с флагом Amazon boolean и создаю одну общую версию, а затем версию, увеличенную на один для рынка Amazon. Никакие другие рынки не требуют внутреннего связывания, AFAIK.
В конечном итоге я намерен составить код для выбора рынка, чтобы автоматически определить, что делать, но есть много переменных - не только рыночный адрес одного приложения, но и то, как разные рынки распознают название компании для найти все приложения. Некоторые рыночные приложения захватывают основной протокол на рынке Android (например, Appslib и SlideMe, если я правильно помню), но не сохраняйте название компании таким же образом. Затем вам нужно решить, куда переходят ссылки upsell - на тот же рынок или на общий (я только представил мое бесплатное приложение для большинства рынков, которые я использую).
Я ожидаю, что мое платное приложение будет одобрено, но я уверен, что будет стоить того, чтобы он был доступен на рынке Amazon, учитывая, сколько загрузок я получил для своего бесплатного приложения.
Ответ 7
Просто реорганизуйте большую часть вашего проекта в библиотеку проектов, а затем создайте несколько проектов (например, для каждого магазина приложений), которые имеют только уникальные ресурсы значков и строк, их собственный идентификатор пакета, объявленный в манифесте, а затем основное действие который расширяет основное действие, которое вы определили в своей библиотеке.
Таким образом, все уникальные URL-адреса могут быть предоставлены путем переопределения в каждом конкретном действии проекта приложения виртуальных или абстрактных методов, определенных в основной деятельности вашей библиотеки. Код библиотеки, отображающий эти URL-адреса, может получить их через полиморфный вызов для каждого из этих методов.
Таким образом, каждый такой специализированный проект будет очень небольшим, и обслуживание будет главным образом в вашей библиотеке, как описано здесь:
Несколько приложений с общей базой кода