Gratis HTML ke APK
Pengembang

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): void

0,0 hingga 1,0 untuk jendela ini, nilai negatif mengembalikan kecerahan sistem.

FreeApp.fullscreen(on: boolean): void

Sembunyikan bilah sistem (imersif).

FreeApp.keepAwake(on: boolean): void

Biarkan layar tetap menyala.

FreeApp.notify(title: string, body?: string): void

Notifikasi lokal instan (meminta izin di Android 13+).

FreeApp.orientation(value: 'portrait' | 'landscape' | 'sensor_portrait' | 'sensor_landscape' | 'sensor' | 'unspecified'): void
FreeApp.print(): void

Cetak / simpan halaman sebagai PDF.

FreeApp.scheduleNotification(title: string, body: string, delayMs: number, opts?: {id?: number, url?: string, repeatMs?: number, exact?: boolean}): number

Mengembalikan id.

FreeApp.speak(text: string, lang?: string): void

Text-to-speech bawaan, lang seperti 'en-US'.

FreeApp.statusBar(hexColor: string): void

Contoh: '#2563EB'.

FreeApp.stopSpeaking(): void
FreeApp.toast(message: string): void

Toast bawaan singkat.

FreeApp.vibrate(ms?: number | number[]): void

Getaran 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(): boolean
FreeApp.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): boolean

Senter, 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) | null

Mengembalikan fungsi stop.

FreeApp.location(opts?: {maxAge?: number}): Promise<{lat, lng, accuracy, altitude, speed, provider, time, fromLastKnown}>
FreeApp.maps(query: string): void

Buka 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) | null

Mengembalikan fungsi stop, atau null jika tidak tersedia.

FreeApp.sensors.stop(type: string): void
FreeApp.watchLocation(cb: (p) => void, opts?: {interval?: number, distance?: number}): () => void

Mengembalikan 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 | null

Tautan dalam yang membuka aplikasi.

FreeApp.network(): 'wifi' | 'cellular' | 'ethernet' | 'vpn' | 'other' | 'none' | 'unknown'
FreeApp.on('deeplink', (d: {url}) => void): () => void

Tautan yang dibuka saat aplikasi berjalan.

FreeApp.online(): boolean

File, berbagi & penyimpanan

FreeApp.copy(text: string): void

Salin ke papan klip.

FreeApp.open(url: string): void

Buka di browser / aplikasi eksternal.

FreeApp.paste(): string

Baca 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.share(text: string, title?: string): void

Lembar berbagi Android.

FreeApp.shareFile(fileName: string, mimeType: string, base64OrDataUrl: string): boolean

Bagikan file sungguhan.

FreeApp.store.get(key: string): any | null
FreeApp.store.set(key: string, value: any): void

Penyimpanan 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): boolean
FreeApp.openSettings(): void

Buka 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'): void

Memuat 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(): void

Membuka Ad Inspector Google di perangkat uji.

FreeApp.ads.on(cb: (event) => void): () => void

Peristiwa 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): boolean

Apa 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): Promise

Memakai 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(): boolean

True 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): void

Membuka layar langganan Google Play, tempat pengguna membatalkan atau mengubah paket mereka.

FreeApp.billing.on(cb: (event) => void): () => void

Peristiwa 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.