Guest User

Untitled

a guest
Jan 24th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.51 KB | None | 0 0
  1. compile 'com.google.android.gms:play-services-ads:9.4.0'
  2.  
  3. <meta-data
  4. android:name="com.google.android.gms.version"
  5. android:value="@integer/google_play_services_version" />
  6. <activity
  7. android:name="com.google.android.gms.ads.AdActivity"
  8. android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
  9. android:theme="@android:style/Theme.Translucent" />
  10.  
  11. <string name="banner_ad_unit_id">ca-app-pub-8911029118062557/6565681629</string>
  12.  
  13. <?xml version="1.0" encoding="utf-8"?>
  14. <RelativeLayout
  15. ...>
  16. <android.support.design.widget.CoordinatorLayout
  17. ...>
  18. ...
  19. </android.support.design.widget.CoordinatorLayout>
  20. <com.google.android.gms.ads.AdView
  21. android:id="@+id/banner"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:layout_alignParentBottom="true"
  25. android:layout_centerHorizontal="true"
  26. ads:adSize="SMART_BANNER"
  27. ads:adUnitId="@string/banner_ad_unit_id">
  28.  
  29. </com.google.android.gms.ads.AdView>
  30. </RelativeLayout>
  31.  
  32. public class Ads {
  33. // создаем метод для создания баннера
  34. public static void showBanner(final Activity activity) {
  35.  
  36. // создаем баннер, находим его по id
  37. final AdView banner = (AdView) activity.findViewById(R.id.banner);
  38. // строит и загружает баннер
  39. // импорт android.gms.ads
  40. AdRequest adRequest = new AdRequest.Builder().build();
  41. banner.loadAd(adRequest);
  42.  
  43. // слушатель загрузки баннера
  44. banner.setAdListener(new AdListener() {
  45. @Override
  46. public void onAdLoaded() {
  47. super.onAdLoaded();
  48. setupContentViewPadding(activity, banner.getHeight());
  49. }
  50. });
  51. }
  52.  
  53. // метод подвигает нижний край экрана, на высоте размера баннера
  54. public static void setupContentViewPadding(Activity activity, int padding) {
  55. View view = activity.findViewById(R.id.coordinator);
  56. view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), padding);
  57. }
  58. }
  59.  
  60. // внедряем баннер
  61.  
  62. public class SettingsFrag extends Fragment implements BillingProcessor.IBillingHandler {
  63.  
  64. private boolean adsStatus; // храним текущий статус отображения рекламы
  65. private boolean initialize; // храним готовность к покупкам
  66. private BillingProcessor bp; // переменная нашего процессора
  67.  
  68. private PreferencesManager prefManager; // класс, который работает с SharedPreferences. Я для себя решил вынести всю логику отдельно
  69. private Resources resources; // для работы с ресурсами. Раз получаем и постоянно обращаемся
  70. private ToggleButton tbAdsState; // кнопка
  71.  
  72. Context mContext;
  73. @Override
  74. public void onAttach(Context context) {
  75. super.onAttach(context);
  76. this.mContext = context;
  77. // инициализируем `BillingProcessor`. В документации на `GitHub` сказано, что для защиты от липовых покупок через приложения типа
  78. // `freedom` необходимо в конструктор `BillingProcessor`'а передать еще и свой `MERCHANT_ID`. Где его взять - внизу текущего ответа опишу шаги
  79. bp = new BillingProcessor(context,
  80. InAppBillingResources.getRsaKey(), InAppBillingResources.getMerchantId(), this);
  81.  
  82. prefManager = new PreferencesManager(context); // класс, который работает с `SharedPreferences`
  83. adsStatus = prefManager.getAdsStatus(); // получаем из `SharedPreferences` сохраненное состояние рекламы (ВКЛ / ВЫКЛ)
  84. resources = context.getResources(); // получаем "доступ" к ресурсам
  85. }
  86.  
  87. public static SettingsFrag newInstance() {
  88. Bundle args = new Bundle();
  89. SettingsFrag fragment = new SettingsFrag();
  90. fragment.setArguments(args);
  91. return fragment;
  92. }
  93.  
  94. @Nullable
  95. @Override
  96. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  97. // создаем `View` экрана настроек
  98. View settView = inflater.inflate(R.layout.frag_sett_screen, container, false);
  99.  
  100. // инициализация других полей
  101. tbAdsState = (ToggleButton) settView.findViewById(R.id.tbAdsState);
  102. // инициализация других полей
  103.  
  104. // вешаем слушателя нажатий по кнопке `ToggleButton`
  105. tbAdsState.setOnClickListener(new View.OnClickListener() {
  106. @Override
  107. public void onClick(View v) {
  108.  
  109. // `adsStatus` : getAdsStatus из класса `PreferencesManager`
  110. // true - enabled (ВКЛ) | false - disabled (ВЫКЛ)
  111. if (adsStatus && initialize) {
  112. bp.purchase(getActivity(), InAppBillingResources.getSKU_Disable_Ads());
  113. }
  114.  
  115. if (!adsStatus) {
  116. tbAdsState.setChecked(false);
  117. Toast.makeText(getActivity(),
  118. getActivity().getResources().getString(R.string.txt_ads_is_already_disabled),
  119. Toast.LENGTH_LONG).show();
  120. }
  121.  
  122. }
  123. });
  124.  
  125. return settView;
  126. }
  127.  
  128. @Override
  129. public void onResume() {
  130. super.onResume();
  131. tbAdsState.setChecked(prefManager.getAdsStatus());
  132. }
  133.  
  134. // диалог, который скажет пользователю, что после покупки необходимо перезагрузиться
  135. private void restartDialog() {
  136.  
  137. AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
  138. builder.setTitle(resources.getString(R.string.msg_notification_Title));
  139. builder.setCancelable(false);
  140. builder.setPositiveButton("Ок",
  141. new DialogInterface.OnClickListener() {
  142. public void onClick(DialogInterface dialog, int id) {
  143. restartApp();
  144. dialog.cancel();
  145. }
  146. }
  147. );
  148. AlertDialog resetDialog = builder.create();
  149. resetDialog.show();
  150.  
  151. }
  152.  
  153. // перезагружаем приложение
  154. private void restartApp() {
  155. Intent rIntent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
  156. if (rIntent != null) {
  157. rIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  158. mContext.startActivity(rIntent);
  159. }
  160. }
  161.  
  162. // ... другие методы класса
  163. // [START billing part of class]
  164.  
  165. @Override
  166. public void onProductPurchased(@NonNull String productId, TransactionDetails details) {
  167. // Called when requested PRODUCT ID was successfully purchased
  168. // Вызывается, когда запрашиваемый PRODUCT ID был успешно куплен
  169.  
  170. if (bp.isPurchased(productId)) {
  171. prefManager.setAdsStatus(false); // 1. записываем в `SharedPreferences` состояние рекламы (ВЫКЛ / false)
  172. tbAdsState.setChecked(false); // 2. устанавливаем `TogglButton` в соответствующее состояние
  173. restartDialog(); // 3. перезагружаем приложение
  174. } else {
  175. tbAdsState.setChecked(true); // иначе, если не прошла покупка, оставляем состояние (ВКЛ / true)
  176. }
  177. }
  178.  
  179.  
  180. @Override
  181. public void onPurchaseHistoryRestored() {
  182. //Вызывается, когда история покупки была восстановлена,
  183. // и список всех принадлежащих идентификаторы продуктов был загружен из Google Play
  184.  
  185. // так Вы сможете НУЖНУЮ покупку проверить
  186. for (String sku : bp.listOwnedProducts()) {
  187. //MyAppLogs.show("Owned Managed Product: " + sku);
  188. boolean wasBouhtg = sku.equals(InAppBillingResources.getSKU_Disable_Ads());
  189. if (wasBouhtg) {
  190. // true - куплено
  191. // пишем в `SharedPreferences`, что отключили рекламу
  192. } else {
  193. // false - не куплено
  194. // пишем в `SharedPreferences`, что нужно показывать рекламу
  195. }
  196. }
  197. }
  198.  
  199. @Override
  200. public void onBillingError(int errorCode, Throwable error) {
  201. // Вызывается, когда появляется ошибка. См. константы класса
  202. // для получения более подробной информации
  203. }
  204.  
  205. @Override
  206. public void onBillingInitialized() {
  207. // Вызывается, когда bp был инициализирован и он готов приобрести
  208. initialize = true;
  209. }
  210. // [END billing part of class]
  211.  
  212. }
  213.  
  214. public class PreferencesManager {
  215.  
  216. private static SharedPreferences mSPref;
  217. private SharedPreferences.Editor mSPEditor;
  218.  
  219. private static final String APP_PREF = "app_pref"; // имя файла настроек Вашего приложения
  220.  
  221. private static final String APP_ADS_STATUS = "adsStatus"; // статус рекламы
  222.  
  223. public PreferencesManager(Context context) {
  224. mSPref = context.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE);
  225. }
  226.  
  227. public void setAdsStatus(boolean adsStatus) {
  228. // true - enabled | false - disabled
  229. mSPEditor = mSPref.edit();
  230. mSPEditor.putBoolean(APP_ADS_STATUS, adsStatus);
  231. mSPEditor.apply();
  232. }
  233.  
  234. public boolean getAdsStatus() {
  235. return mSPref.getBoolean(APP_ADS_STATUS, true);
  236. }
  237. }
  238.  
  239. public class InAppBillingResources {
  240.  
  241. // Ваш `RSA` ключ из `Google Play Developer Console`
  242. private static final String RSA_KEY = "MAFD.........";
  243. private static final String MERCHANT_ID = "18........."; // Ваш `MERCHANT_ID` из `Google Play Developer Console`
  244. private static final String SKU_DISABLE_ADS = "android.test.purchased"; // Ваш `product_id`, создается в `Google Play Developer Console`
  245.  
  246.  
  247. public static String getRsaKey() {
  248. return RSA_KEY;
  249. }
  250.  
  251. public static String getMerchantId() {
  252. return MERCHANT_ID;
  253. }
  254.  
  255. public static String getSKU_Disable_Ads() {
  256. return SKU_DISABLE_ADS;
  257. }
  258. }
  259.  
  260. <?xml version="1.0" encoding="utf-8"?>
  261. <LinearLayout
  262. xmlns:android="http://schemas.android.com/apk/res/android"
  263. xmlns:tools="http://schemas.android.com/tools"
  264. android:orientation="vertical"
  265. android:layout_width="match_parent"
  266. android:layout_height="match_parent">
  267.  
  268. <ToggleButton
  269. android:id="@+id/tbAdsState"
  270. android:layout_width="178dp"
  271. android:layout_height="wrap_content"
  272. android:text="ToggleButton"
  273.  
  274. tools:layout_editor_absoluteX="87dp"
  275. tools:layout_editor_absoluteY="66dp"/>
  276.  
  277. </LinearLayout>
Add Comment
Please, Sign In to add comment