JavaScript API
Aplikasi yang dibuat dengan Free HTML to APK menyisipkan jembatan bawaan sebagai window.FreeApp. Panggil dari JavaScript biasa, dari React atau Vue, atau dari mesin game. Halaman Anda tetap berfungsi di browser biasa jika Anda menjaga panggilannya.
Memulai
Jembatan bisa tiba sesaat setelah skrip Anda berjalan, jadi lakukan penyiapan bawaan pada peristiwa freeappready, dan juga langsung jika window.FreeApp sudah ada. Selalu sediakan cadangan untuk browser.
function setup() { FreeApp.statusBar('#E2552A'); FreeApp.toast('Hello from Android'); } if (window.FreeApp) setup(); else window.addEventListener('freeappready', setup, { once: true }); document.querySelector('#buzz').onclick = () => window.FreeApp ? FreeApp.vibrate(40) : console.log('Not in the app');
Panggilan yang memerlukan izin (kamera, mikrofon, lokasi, notifikasi) meminta pengguna pada pertama kali. Aktifkan izin yang sesuai di langkah Izin pada builder; templat mengaktifkan apa yang dipakai kodenya.
Umpan balik & UI
FreeApp.brightness(level: number): void0,0 hingga 1,0 untuk jendela ini, nilai negatif mengembalikan kecerahan sistem.
FreeApp.fullscreen(on: boolean): voidSembunyikan bilah sistem (imersif).
FreeApp.keepAwake(on: boolean): voidBiarkan layar tetap menyala.
FreeApp.notify(title: string, body?: string): voidNotifikasi lokal instan (meminta izin di Android 13+).
FreeApp.orientation(value: 'portrait' | 'landscape' | 'sensor_portrait' | 'sensor_landscape' | 'sensor' | 'unspecified'): voidFreeApp.print(): voidCetak / simpan halaman sebagai PDF.
FreeApp.scheduleNotification(title: string, body: string, delayMs: number, opts?: {id?: number, url?: string, repeatMs?: number, exact?: boolean}): numberMengembalikan id.
FreeApp.speak(text: string, lang?: string): voidText-to-speech bawaan, lang seperti 'en-US'.
FreeApp.statusBar(hexColor: string): voidContoh: '#2563EB'.
FreeApp.stopSpeaking(): voidFreeApp.toast(message: string): voidToast bawaan singkat.
FreeApp.vibrate(ms?: number | number[]): voidGetaran sekali (default 50 ms) atau pola [mati, hidup, mati, hidup…].
Kamera & pemindaian
FreeApp.camera.capture(opts?: {maxSize?: number, quality?: number, mirror?: boolean}): Promise<{dataUrl, facing}>Foto diam dari pratinjau yang sedang berjalan.
FreeApp.camera.start(opts?: {facing?: 'back' | 'front', element?: string | Element /* place the preview over this element */, behind?: boolean /* draw under a transparent page so HTML controls float on top */}): Promise<{facing}>FreeApp.camera.switch(): Promise<{facing}>; FreeApp.camera.torch(on: boolean): boolean; FreeApp.camera.stop(): void; FreeApp.camera.isOpen(): booleanFreeApp.compressImage(dataUrl: string, opts?: {maxSize?: number, quality?: number}): Promise<{dataUrl, width, height, bytes}>Bawaan, cepat di ponsel kelas bawah.
FreeApp.saveToGallery(dataUrl: string, fileName?: string): Promise<{uri}>Menyimpan gambar ke Foto.
FreeApp.scanCode(opts?: {formats?: string[] /* e.g. ['QR_CODE','EAN_13','CODE_128'] */, facing?: 'back' | 'front'}): Promise<{text, format}>Pemindai QR / barcode layar penuh bawaan dengan lampu senter; ditolak dengan 'cancelled'.
FreeApp.torch(on: boolean): booleanSenter, mengembalikan false jika tidak ada lampu kilat.
Lokasi & sensor
FreeApp.address(lat: number, lng: number): Promise<{address, city, country, countryCode, postalCode, street}>FreeApp.compass(cb: (d: {heading: number /* degrees */, pitch: number, roll: number}) => void): (() => void) | nullMengembalikan fungsi stop.
FreeApp.location(opts?: {maxAge?: number}): Promise<{lat, lng, accuracy, altitude, speed, provider, time, fromLastKnown}>FreeApp.maps(query: string): voidBuka tempat atau "lat,lng" di aplikasi peta.
FreeApp.sensors.start(type: 'accelerometer' | 'gyroscope' | 'magnetometer' | 'light' | 'proximity' | 'pressure' | 'gravity' | 'linear_acceleration' | 'rotation' | 'humidity' | 'temperature' | 'steps' | 'step_detector', cb: (d: {type, values: number[], x, y, z, accuracy, t}) => void, intervalMs?: number): (() => void) | nullMengembalikan fungsi stop, atau null jika tidak tersedia.
FreeApp.sensors.stop(type: string): voidFreeApp.watchLocation(cb: (p) => void, opts?: {interval?: number, distance?: number}): () => voidMengembalikan fungsi stop.
Perangkat & aplikasi
FreeApp.app(): {packageName, versionName, versionCode, name, firstInstall}FreeApp.battery(): {level: number /* 0-100 */, charging: boolean}FreeApp.biometric(title: string, subtitle?: string): Promise<boolean>Buka kunci sidik jari / wajah.
FreeApp.device(): {manufacturer, model, brand, androidVersion, sdkInt, language, screenWidth, screenHeight, density, isTablet, darkMode}FreeApp.launchUrl(): string | nullTautan dalam yang membuka aplikasi.
FreeApp.network(): 'wifi' | 'cellular' | 'ethernet' | 'vpn' | 'other' | 'none' | 'unknown'FreeApp.on('deeplink', (d: {url}) => void): () => voidTautan yang dibuka saat aplikasi berjalan.
FreeApp.online(): booleanFile, berbagi & penyimpanan
FreeApp.copy(text: string): voidSalin ke papan klip.
FreeApp.open(url: string): voidBuka di browser / aplikasi eksternal.
FreeApp.paste(): stringBaca teks papan klip.
FreeApp.pickFile(opts?: {accept?: string[], multiple?: boolean}): Promise<{name, mime, size, dataUrl}>FreeApp.saveFile(name: string, mime: string, data: string /* base64 or data: URL */ | Blob): Promise<boolean>Menyimpan ke Downloads; FreeApp.on('saved', d => …) memberi {name, ok, location}.
FreeApp.store.get(key: string): any | nullFreeApp.store.set(key: string, value: any): voidPenyimpanan key/value bawaan yang persisten (JSON).
NFC
FreeApp.nfc.read(): Promise<{tagId, techs: string[], writable, maxSize, records: Array<{type: "text" | "uri" | "mime" | "unknown", value, mime?, lang?}>}>Menunggu tag; FreeApp.nfc.stop() membatalkan.
FreeApp.nfc.status(): 'ready' | 'disabled' | 'unsupported' | 'not_enabled_in_app'FreeApp.nfc.write(records: string | Array<{type: 'text' | 'uri' | 'mime', value: string, mime?: string}>): Promise<{written}>Izin
FreeApp.hasPermission(name: string): booleanFreeApp.openSettings(): voidBuka halaman pengaturan sistem aplikasi ini.
FreeApp.permissionStatus(name: 'camera' | 'microphone' | 'location' | 'notifications' | 'activity'): 'granted' | 'prompt' | 'blocked' | 'unavailable'FreeApp.requestPermission(name: 'camera' | 'microphone' | 'location' | 'notifications'): Promise<boolean>FreeApp.requestPermissions(names: string[]): Promise<{[name]: boolean}>Iklan
Tersedia saat AdMob diaktifkan di builder. Dalam mode uji, iklan uji Google ditampilkan.
FreeApp.ads.loadBanner(unit?: string, position?: 'top' | 'bottom'): voidMemuat dan menampilkan banner. Tanpa argumen, ia memakai unit dan posisi yang diatur di builder.
FreeApp.ads.showBanner(position?) / hideBanner() / isBannerLoaded()Tampilkan, sembunyikan, atau periksa banner.
FreeApp.ads.loadInterstitial(unit?) / showInterstitial() / isInterstitialLoaded()Iklan layar penuh di antara layar. Jeda minimum antar iklan layar penuh diberlakukan.
FreeApp.ads.loadRewarded(unit?) / isRewardedLoaded()Muat lebih awal iklan berhadiah.
FreeApp.ads.showRewarded(): Promise<{ok, amount, type}>Menampilkan iklan berhadiah; berhasil saat pengguna mendapat hadiah, ditolak jika mereka menutupnya lebih awal.
FreeApp.ads.privacyOptionsRequired(): boolean / showPrivacyOptions()Memungkinkan pengguna mengubah pilihan persetujuan mereka (diwajibkan di beberapa wilayah).
FreeApp.ads.adapterStatus(): {[network]: {installed, configured, ready, description, latencyMs}}Dengan mediasi: jaringan mitra mana yang ada di dalam aplikasi dan mana yang telah disiapkan akun AdMob Anda.
FreeApp.ads.openAdInspector(): voidMembuka Ad Inspector Google di perangkat uji.
FreeApp.ads.on(cb: (event) => void): () => voidPeristiwa iklan seperti initialized, bannerLoaded, interstitialDismissed atau rewardedFailed. Mengembalikan fungsi untuk berhenti berlangganan.
Dengan pembelian Hapus iklan, iklan banner dan layar penuh berhenti dan peristiwa adFree dipicu. Iklan berhadiah tetap berfungsi, karena orang memilih untuk menontonnya.
Pembelian dalam aplikasi
Tersedia saat Pembelian diaktifkan di pembuat aplikasi. Jual produk sekali beli, produk habis pakai seperti koin, dan langganan melalui akun Google Play Anda sendiri. Buat produknya dulu di Play Console, dengan ID yang sama. Pembelian berfungsi di salinan yang dipasang dari Google Play, jadi uji dengan jalur pengujian dan penguji lisensi.
const billing = window.FreeApp && FreeApp.billing; if (billing && billing.isOwned('pro_unlock')) unlockPro(); // Unlock in the purchase event: it also arrives for purchases finished while the app was closed. billing && billing.on(e => { if (e.event === 'purchase' && e.id === 'pro_unlock') unlockPro(); }); buyButton.onclick = async () => { try { await billing.buy('pro_unlock'); } catch (err) { if (err.code === 'pending') show('Payment pending'); else if (err.code !== 'cancelled') show('Purchase failed'); } };
FreeApp.billing.products(ids: string[]): Promise<Product[]>Detail terkini produk Anda dari Google Play: judul, harga lokal, mata uang, dan untuk langganan, periode penagihan serta penawarannya. ID yang tidak dikenal Play tidak disertakan.
FreeApp.billing.buy(id: string, opts?: {offer?: string}): Promise<Purchase>Membuka lembar pembayaran Google Play. Untuk langganan, offer memilih paket dasar atau ID penawaran. Ditolak dengan kesalahan yang kodenya cancelled, pending, not_found, unavailable, busy, network, atau developer_error.
FreeApp.billing.owned(): string[] / isOwned(id): booleanApa yang dimiliki pengguna, disimpan di ponsel, jadi langsung menjawab dan juga saat offline. Gunakan saat aplikasi dimulai untuk membuka fitur berbayar.
FreeApp.billing.restore(): Promise<{purchases, owned}>Meminta ulang ke Google Play semua yang dimiliki pengguna, untuk tombol Pulihkan pembelian.
FreeApp.billing.consume(idOrToken: string): PromiseMemakai habis produk sekali beli agar bisa dibeli lagi. Produk yang dicantumkan sebagai habis pakai di pembuat aplikasi otomatis dipakai habis untuk Anda.
FreeApp.billing.isAdFree(): booleanTrue jika pengguna memiliki salah satu produk Hapus iklan yang diatur di pembuat aplikasi. Aplikasi lalu menghentikan iklan banner dan layar penuh dengan sendirinya.
FreeApp.billing.manageSubscriptions(id?: string): voidMembuka layar langganan Google Play, tempat pengguna membatalkan atau mengubah paket mereka.
FreeApp.billing.on(cb: (event) => void): () => voidPeristiwa pembelian: purchase (buka fitur di sini), pending, owned (daftar yang dimiliki berubah: pembelian, pengembalian dana, atau langganan yang berakhir), failed, dan unavailable. Mengembalikan fungsi untuk berhenti berlangganan.
Lapisan kompatibilitas
Halaman yang ditulis untuk alat HTML-ke-APK lain yang memanggil window.AndroidAPI tetap berfungsi: nama metode, ID callback, dan nama peristiwa yang sama didukung, dan panggilan iklan aman tanpa efek di aplikasi tanpa iklan.