fix showing ads examples

Seto committed Nov 28, 2025 at 17:12 UTC 620dbb30e360412a67165df36b8ed9830c9275eb
3 files changed +89 -40
examples/admob-reactjs/src-tauri/gen-override/android/app/src/main/AndroidManifest.xml
+28 -17
@@ -1,45 +1,56 @@
1 -<?xml version="1.0" encoding="utf-8"?>
1 +<?xml version="1.0" encoding="utf-8" ?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
3 <uses-permission android:name="android.permission.INTERNET" />
4 - <uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
4 + <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
5
6 <!-- AndroidTV support -->
7 - <uses-feature android:name="android.software.leanback" android:required="false" />
7 + <uses-feature
8 + android:name="android.software.leanback"
9 + android:required="false"
10 + />
11
12 <application
13 android:icon="@mipmap/ic_launcher"
14 android:label="@string/app_name"
12 - android:theme="@style/Theme.tauri_app"
13 - android:usesCleartextTraffic="${usesCleartextTraffic}">
15 + android:theme="@style/Theme.admob_reactjs"
16 + android:usesCleartextTraffic="${usesCleartextTraffic}"
17 + >
18 <activity
19 android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
20 android:launchMode="singleTask"
21 android:label="@string/main_activity_title"
22 android:name=".MainActivity"
19 - android:exported="true">
23 + android:exported="true"
24 + >
25 <intent-filter>
26 <action android:name="android.intent.action.MAIN" />
27 <category android:name="android.intent.category.LAUNCHER" />
28 <!-- AndroidTV support -->
24 - <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
29 + <category
30 + android:name="android.intent.category.LEANBACK_LAUNCHER"
31 + />
32 </intent-filter>
33 </activity>
34
35 <provider
29 - android:name="androidx.core.content.FileProvider"
30 - android:authorities="${applicationId}.fileprovider"
31 - android:exported="false"
32 - android:grantUriPermissions="true">
36 + android:name="androidx.core.content.FileProvider"
37 + android:authorities="${applicationId}.fileprovider"
38 + android:exported="false"
39 + android:grantUriPermissions="true"
40 + >
41 <meta-data
34 - android:name="android.support.FILE_PROVIDER_PATHS"
35 - android:resource="@xml/file_paths" />
42 + android:name="android.support.FILE_PROVIDER_PATHS"
43 + android:resource="@xml/file_paths"
44 + />
45 </provider>
46
47 <meta-data
39 - android:name="com.google.android.gms.ads.APPLICATION_ID"
40 - android:value="ca-app-pub-3940256099942544~3347511713"/>
48 + android:name="com.google.android.gms.ads.APPLICATION_ID"
49 + android:value="ca-app-pub-3940256099942544~3347511713"
50 + />
51 <meta-data
42 - android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
43 - android:value="true"/>
52 + android:name="com.google.android.gms.ads.DELAY_APP_MEASUREMENT_INIT"
53 + android:value="true"
54 + />
55 </application>
56 </manifest>
examples/admob-reactjs/src-tauri/src/lib.rs
+8
@@ -8,6 +8,14 @@ fn greet(name: &str) -> String {
8 pub fn run() {
9 tauri::Builder::default()
10 .plugin(tauri_plugin_opener::init())
11 + .setup(|#[allow(unused)] app| {
12 + // Android-only plugin.
13 + #[cfg(target_os = "android")]
14 + {
15 + app.handle().plugin(tauri_plugin_admob::init())?;
16 + }
17 + Ok(())
18 + })
19 .invoke_handler(tauri::generate_handler![greet])
20 .run(tauri::generate_context!())
21 .expect("error while running tauri application");
examples/admob-reactjs/src/App.tsx
+53 -23
@@ -1,16 +1,52 @@
1 -import { useState } from "react";
1 +import { useEffect, useState } from "react";
2 import reactLogo from "./assets/react.svg";
3 -import { invoke } from "@tauri-apps/api/core";
3 +import {
4 + BannerAd,
5 + RewardedAd,
6 + showPrivacyOptionsForm,
7 +} from "tauri-plugin-admob-api";
8 import "./App.css";
9
10 function App() {
7 - const [greetMsg, setGreetMsg] = useState("");
8 - const [name, setName] = useState("");
11 + const [bannerAd, setBannerAd] = useState<BannerAd>();
12 + const [rewardedAd, setRewardedAd] = useState<RewardedAd>();
13
10 - async function greet() {
11 - // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
12 - setGreetMsg(await invoke("greet", { name }));
13 - }
14 + const showBannerAd = async () => {
15 + await bannerAd?.show();
16 + };
17 +
18 + const showRewardedAd = async () => {
19 + try {
20 + await rewardedAd?.show();
21 + const rewardPromise = await rewardedAd?.onRewarded(async (reward) => {
22 + console.log("RewardedAd get reward callback:", JSON.stringify(reward));
23 + });
24 + console.log(rewardPromise?.event);
25 + } catch (e) {
26 + console.log(e);
27 + }
28 + };
29 +
30 + const loadAds = async () => {
31 + const bannerAd = new BannerAd({
32 + adUnitId: "ca-app-pub-3940256099942544/9214589741",
33 + position: "top",
34 + });
35 +
36 + const rewardedAd = new RewardedAd({
37 + adUnitId: "ca-app-pub-3940256099942544/5224354917",
38 + });
39 +
40 + await bannerAd.load();
41 + await rewardedAd.load();
42 +
43 + setBannerAd(bannerAd);
44 + setRewardedAd(rewardedAd);
45 + };
46 +
47 + useEffect(() => {
48 + loadAds();
49 + });
50
51 return (
52 <main className="container">
@@ -29,21 +65,15 @@ function App() {
65 </div>
66 <p>Click on the Tauri, Vite, and React logos to learn more.</p>
67
32 - <form
33 - className="row"
34 - onSubmit={(e) => {
35 - e.preventDefault();
36 - greet();
37 - }}
38 - >
39 - <input
40 - id="greet-input"
41 - onChange={(e) => setName(e.currentTarget.value)}
42 - placeholder="Enter a name..."
43 - />
44 - <button type="submit">Greet</button>
45 - </form>
46 - <p>{greetMsg}</p>
68 + <div className="row">
69 + <button onClick={showPrivacyOptionsForm}>Show Privacy Form</button>
70 + </div>
71 + <div className="row">
72 + <button onClick={showBannerAd}>Show Banner Ad</button>
73 + </div>
74 + <div className="row">
75 + <button onClick={showRewardedAd}>Show Rewarded Ad</button>
76 + </div>
77 </main>
78 );
79 }