Перевод текста на русский язык:
Сначала кратко опишу проблемы, с которыми мы столкнулись в рекламе. После того как приложение получило определённое количество пользователей, обычно возникает желание подключить стороннюю рекламу для монетизации. Однако во многих странах не разрешают размещать приложения с рекламой сторонних компаний, если только это не реклама от их собственных платформ. В этом случае я могу только усмехнуться. Эти трудности кажутся непреодолимыми для нас.
Что же делать дальше? Всё верно, речь идёт о плагинах. В качестве примера я использую 360 с открытым исходным кодом RePlugin (https://github.com/Qihoo360/RePlugin), а более подробное описание и инструкции по использованию можно найти в официальной документации.
1. Руководство по подключению плагина RePlugin Шаг 1: добавьте зависимость RePlugin Plugin Gradle Добавьте зависимость replugin-plugin-gradle в build.gradle (обратите внимание: не app/build.gradle) в корне проекта:
buildscript {
dependencies {
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.2.0'
...
}
}
Шаг 2: добавьте зависимость библиотеки RePlugin Plugin В app/build.gradle примените плагин replugin-plugin-gradle и добавьте зависимость replugin-plugin-lib:
apply plugin: 'replugin-plugin-gradle'
dependencies {
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.2.0'
...
}
Теперь вы можете разрабатывать плагины так же, как и при обычном подключении рекламы. Результатом будет APK, который можно «установить на устройство» или «использовать в качестве плагина».
2. Руководство по подключению основной программы RePlugin Шаг 1: добавьте зависимость Host Gradle Добавьте зависимость replugin-host-gradle в файл build.gradle в корне проекта (обратите внимание: не в app/build.gradle):
buildscript {
dependencies {
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.2.0'
...
}
}
Шаг 2: добавьте зависимость хост-библиотеки RePlugin В файле app/build.gradle примените плагин replugin-host-gradle и добавьте зависимость replugin-host-lib:
apply plugin: 'replugin-host-gradle'
repluginHostConfig {
useAppCompat = true
}
dependencies {
...
compile 'com.qihoo360.replugin:replugin-host-lib:2.1.7'
}
Шаг 3: настройте класс Application
public class App extends Application{
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
RePlugin.App.attachBaseContext(this);
}
@Override
public void onCreate() {
super.onCreate();
RePlugin.App.onCreate();
}
}
3. Вызов плагина рекламы из хост-приложения
Скомпилируйте плагин рекламы, и полученный xx.apk переименуйте в xx.jar. Поместите xx.jar в каталог assets/plugins хост-приложения. RePlugin автоматически получит этот встроенный плагин.
Обработка рекламы GDT (Guangdian Tong). Поскольку все клики в рекламе GDT обрабатываются SDK, мы используем следующий подход: хост-приложение переходит к заставке плагина, после чего в плагине завершается запрос, показывается реклама, и после клика пользователь возвращается на главную страницу хоста. (1) Хост-приложение переходит на активность плагина:
try {
String config = AssetsUtils.readText(MainActivity.this, "ad_config.json");
Intent intent = new Intent();
intent.setComponent(new ComponentName("adPlugin", "com.plugin.ad.LogoActivity"));
intent.putExtra("EXTRA_CONFIG", config);
intent.putExtra("EXTRA_POI", POI_FIRST);
RePlugin.startActivity(MainActivity.this, intent);
} catch (Throwable e) {
e.printStackTrace();
}
(2) Плагин обрабатывает запрос на показ рекламы GDT и действует согласно обычной логике рекламы.
(3) Плагин возвращается на главную страницу хост-приложения:
private void intoMainPage() {
//TODO 打开宿主应用
Intent intent = new Intent();
intent.setClassName("com.wifi.robot", "com.wifi.robot.ui.SecondActivity");
startActivity(intent);
finish();
}
(4) В файле манифеста хост-приложения добавьте необходимые настройки, иначе реклама не будет реагировать:
<!-- 广点通广告 -->
<service
android:name="com.qq.e.comm.DownloadService"
android:exported="false" />
<activity
android:name="com.qq.e.ads.ADActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize" />
Примечание: чтобы избежать проблем с отсутствием прибыли от рекламы, рекомендуется сделать имена пакетов хост-приложений и плагинов максимально похожими.
(1) Сначала в плагине мы делаем слой упаковки для запроса рекламы:
package com.plugin.ad.managers;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import com.plugin.ad.listeners.ILoadListener;
import com.plugin.ad.models.ADModel;
import com.plugin.ad.models.ModelManager;
import com.plugin.ad.utils.JsonUtil;
/**
* 广告请求管理类
* Created by wong on 17-8-16.
*/
public class LoadManager {
/**
* 初始化
*
* @param config
*/
private static void onInit(String config) {
ADModel adModel = JsonUtil.getInstance().fromJson(config, ADModel.class);
ModelManager.operationNativeConfig(adModel.place_ids);
ModelManager.putAdKey("gdt", adModel.gdt_key);
}
``` **Запрос на нативную рекламу**
public static void requestNativeAD(Context context, String config, int poi, final ILoadListener listener) { onInit(config); LoadGdtManager.loadAD(context,poi,listener); }
**Запрос рекламы**
public static void loadAD(Context context, final int poi, final ILoadListener listener) { NativeAD nativeAD = new NativeAD(context, getGdtKey(), getGdtId(poi), new NativeAD.NativeAdListener() { @Override public void onADLoaded(List list) { if (null != list && !list.isEmpty()) { listener.gdtNativeSuccess(poi, list.get(0)); } else { listener.failure("Empty"); } }
@Override
public void onNoAD(int i) {
listener.failure("onNoAD->" + i);
}
@Override
public void onADStatusChanged(NativeADDataRef nativeADDataRef) {
}
@Override
public void onADError(NativeADDataRef nativeADDataRef, int i) {
}
});
nativeAD.loadAD(1);
}
(2) В хосте отражение метода requestNativeAD() класса LoadManager
a. Получение ClassLoader плагина
ClassLoader classLoader = RePlugin.fetchClassLoader("adPlugin");
b. Получение необходимого класса
Class<?> methodClass = classLoader.loadClass("com.plugin.ad.managers.LoadManager");
c. Поскольку метод requestNativeAD(), запрашивающий рекламу, имеет один параметр — интерфейс.
(Здесь необходимо использовать динамический прокси)
Получение интерфейса, который будет проксироваться
/**
d. Далее происходит отражение запроса интерфейса
/**
Обратите внимание, что передаваемый Context должен быть контекстом плагина.
e. В динамическом прокси получение обратного вызова
public class LoadCallBackProx implements InvocationHandler { /**
/**
Здесь я использовал EventBus для передачи обратных вызовов рекламы в запрошенный интерфейс
/**
object.getClass().getMethod("onExposured", new Class[]{View.class}).invoke(object, findViewById(R.id.activity_main));
} catch (Exception e) {
e.printStackTrace();
}
}
**Отражение при нажатии на рекламу**
/**
Четыре. Наконец, это моя первая статья, буду рад отзывам.
Хост-приложение: https://github.com/AndWong/RePluginHostForAD/tree/master/app
Приложение плагина: https://github.com/AndWong/RePluginHostForAD/tree/master/pluginApp
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )