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.54 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. Ads.showBanner(this);
  62.  
  63. public class SettingsFrag extends Fragment implements BillingProcessor.IBillingHandler {
  64.  
  65. private boolean adsStatus; // храним текущий статус отображения рекламы
  66. private boolean initialize; // храним готовность к покупкам
  67. private BillingProcessor bp; // переменная нашего процессора
  68.  
  69. private PreferencesManager prefManager; // класс, который работает с SharedPreferences. Я для себя решил вынести всю логику отдельно
  70. private Resources resources; // для работы с ресурсами. Раз получаем и постоянно обращаемся
  71. private ToggleButton tbAdsState; // кнопка
  72.  
  73. Context mContext;
  74. @Override
  75. public void onAttach(Context context) {
  76. super.onAttach(context);
  77. this.mContext = context;
  78. // инициализируем `BillingProcessor`. В документации на `GitHub` сказано, что для защиты от липовых покупок через приложения типа
  79. // `freedom` необходимо в конструктор `BillingProcessor`'а передать еще и свой `MERCHANT_ID`. Где его взять - внизу текущего ответа опишу шаги
  80. bp = new BillingProcessor(context,
  81. InAppBillingResources.getRsaKey(), InAppBillingResources.getMerchantId(), this);
  82.  
  83. prefManager = new PreferencesManager(context); // класс, который работает с `SharedPreferences`
  84. adsStatus = prefManager.getAdsStatus(); // получаем из `SharedPreferences` сохраненное состояние рекламы (ВКЛ / ВЫКЛ)
  85. resources = context.getResources(); // получаем "доступ" к ресурсам
  86. }
  87.  
  88. public static SettingsFrag newInstance() {
  89. Bundle args = new Bundle();
  90. SettingsFrag fragment = new SettingsFrag();
  91. fragment.setArguments(args);
  92. return fragment;
  93. }
  94.  
  95. @Nullable
  96. @Override
  97. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  98. // создаем `View` экрана настроек
  99. View settView = inflater.inflate(R.layout.frag_sett_screen, container, false);
  100.  
  101. // инициализация других полей
  102. tbAdsState = (ToggleButton) settView.findViewById(R.id.tbAdsState);
  103. // инициализация других полей
  104.  
  105. // вешаем слушателя нажатий по кнопке `ToggleButton`
  106. tbAdsState.setOnClickListener(new View.OnClickListener() {
  107. @Override
  108. public void onClick(View v) {
  109.  
  110. // `adsStatus` : getAdsStatus из класса `PreferencesManager`
  111. // true - enabled (ВКЛ) | false - disabled (ВЫКЛ)
  112. if (adsStatus && initialize) {
  113. bp.purchase(getActivity(), InAppBillingResources.getSKU_Disable_Ads());
  114. }
  115.  
  116. if (!adsStatus) {
  117. tbAdsState.setChecked(false);
  118. Toast.makeText(getActivity(),
  119. getActivity().getResources().getString(R.string.txt_ads_is_already_disabled),
  120. Toast.LENGTH_LONG).show();
  121. }
  122.  
  123. }
  124. });
  125.  
  126. return settView;
  127. }
  128.  
  129. @Override
  130. public void onResume() {
  131. super.onResume();
  132. tbAdsState.setChecked(prefManager.getAdsStatus());
  133. }
  134.  
  135. // диалог, который скажет пользователю, что после покупки необходимо перезагрузиться
  136. private void restartDialog() {
  137.  
  138. AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
  139. builder.setTitle(resources.getString(R.string.msg_notification_Title));
  140. builder.setCancelable(false);
  141. builder.setPositiveButton("Ок",
  142. new DialogInterface.OnClickListener() {
  143. public void onClick(DialogInterface dialog, int id) {
  144. restartApp();
  145. dialog.cancel();
  146. }
  147. }
  148. );
  149. AlertDialog resetDialog = builder.create();
  150. resetDialog.show();
  151.  
  152. }
  153.  
  154. // перезагружаем приложение
  155. private void restartApp() {
  156. Intent rIntent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
  157. if (rIntent != null) {
  158. rIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  159. mContext.startActivity(rIntent);
  160. }
  161. }
  162.  
  163. // ... другие методы класса
  164. // [START billing part of class]
  165.  
  166. @Override
  167. public void onProductPurchased(@NonNull String productId, TransactionDetails details) {
  168. // Called when requested PRODUCT ID was successfully purchased
  169. // Вызывается, когда запрашиваемый PRODUCT ID был успешно куплен
  170.  
  171. if (bp.isPurchased(productId)) {
  172. prefManager.setAdsStatus(false); // 1. записываем в `SharedPreferences` состояние рекламы (ВЫКЛ / false)
  173. tbAdsState.setChecked(false); // 2. устанавливаем `TogglButton` в соответствующее состояние
  174. restartDialog(); // 3. перезагружаем приложение
  175. } else {
  176. tbAdsState.setChecked(true); // иначе, если не прошла покупка, оставляем состояние (ВКЛ / true)
  177. }
  178. }
  179.  
  180.  
  181. @Override
  182. public void onPurchaseHistoryRestored() {
  183. //Вызывается, когда история покупки была восстановлена,
  184. // и список всех принадлежащих идентификаторы продуктов был загружен из Google Play
  185.  
  186. // так Вы сможете НУЖНУЮ покупку проверить
  187. for (String sku : bp.listOwnedProducts()) {
  188. //MyAppLogs.show("Owned Managed Product: " + sku);
  189. boolean wasBouhtg = sku.equals(InAppBillingResources.getSKU_Disable_Ads());
  190. if (wasBouhtg) {
  191. // true - куплено
  192. // пишем в `SharedPreferences`, что отключили рекламу
  193. } else {
  194. // false - не куплено
  195. // пишем в `SharedPreferences`, что нужно показывать рекламу
  196. }
  197. }
  198. }
  199.  
  200. @Override
  201. public void onBillingError(int errorCode, Throwable error) {
  202. // Вызывается, когда появляется ошибка. См. константы класса
  203. // для получения более подробной информации
  204. }
  205.  
  206. @Override
  207. public void onBillingInitialized() {
  208. // Вызывается, когда bp был инициализирован и он готов приобрести
  209. initialize = true;
  210. }
  211. // [END billing part of class]
  212.  
  213. }
  214.  
  215. public class PreferencesManager {
  216.  
  217. private static SharedPreferences mSPref;
  218. private SharedPreferences.Editor mSPEditor;
  219.  
  220. private static final String APP_PREF = "app_pref"; // имя файла настроек Вашего приложения
  221.  
  222. private static final String APP_ADS_STATUS = "adsStatus"; // статус рекламы
  223.  
  224. public PreferencesManager(Context context) {
  225. mSPref = context.getSharedPreferences(APP_PREF, Context.MODE_PRIVATE);
  226. }
  227.  
  228. public void setAdsStatus(boolean adsStatus) {
  229. // true - enabled | false - disabled
  230. mSPEditor = mSPref.edit();
  231. mSPEditor.putBoolean(APP_ADS_STATUS, adsStatus);
  232. mSPEditor.apply();
  233. }
  234.  
  235. public boolean getAdsStatus() {
  236. return mSPref.getBoolean(APP_ADS_STATUS, true);
  237. }
  238. }
  239.  
  240. public class InAppBillingResources {
  241.  
  242. // Ваш `RSA` ключ из `Google Play Developer Console`
  243. private static final String RSA_KEY = "MAFD.........";
  244. private static final String MERCHANT_ID = "18........."; // Ваш `MERCHANT_ID` из `Google Play Developer Console`
  245. private static final String SKU_DISABLE_ADS = "android.test.purchased"; // Ваш `product_id`, создается в `Google Play Developer Console`
  246.  
  247.  
  248. public static String getRsaKey() {
  249. return RSA_KEY;
  250. }
  251.  
  252. public static String getMerchantId() {
  253. return MERCHANT_ID;
  254. }
  255.  
  256. public static String getSKU_Disable_Ads() {
  257. return SKU_DISABLE_ADS;
  258. }
  259. }
  260.  
  261. <?xml version="1.0" encoding="utf-8"?>
  262. <LinearLayout
  263. xmlns:android="http://schemas.android.com/apk/res/android"
  264. xmlns:tools="http://schemas.android.com/tools"
  265. android:orientation="vertical"
  266. android:layout_width="match_parent"
  267. android:layout_height="match_parent">
  268.  
  269. <ToggleButton
  270. android:id="@+id/tbAdsState"
  271. android:layout_width="178dp"
  272. android:layout_height="wrap_content"
  273. android:text="ToggleButton"
  274.  
  275. tools:layout_editor_absoluteX="87dp"
  276. tools:layout_editor_absoluteY="66dp"/>
  277.  
  278. </LinearLayout>
Add Comment
Please, Sign In to add comment