Free HTML to APK
डेवलपर

JavaScript API

Free HTML to APK से बने ऐप्स एक नेटिव ब्रिज window.FreeApp के रूप में जोड़ते हैं। इसे सादे JavaScript, React या Vue, या गेम इंजन से कॉल करें। अगर आप कॉल्स को गार्ड करें तो आपका पेज सामान्य ब्राउज़र में भी चलता रहता है।

शुरू करें

ब्रिज आपकी स्क्रिप्ट चलने के कुछ पल बाद आ सकता है, इसलिए नेटिव सेटअप freeappready इवेंट में करें, और अगर window.FreeApp पहले से मौजूद हो तो तुरंत भी करें। ब्राउज़र के लिए हमेशा एक फ़ॉलबैक दें।

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');

जिन कॉल्स को अनुमति चाहिए (कैमरा, माइक्रोफ़ोन, लोकेशन, नोटिफ़िकेशन) वे पहली बार उपयोगकर्ता से पूछते हैं। बिल्डर के अनुमतियाँ चरण में संबंधित अनुमति चालू करें; टेम्पलेट अपने कोड में इस्तेमाल होने वाली अनुमतियाँ खुद चालू कर देते हैं।

फ़ीडबैक और UI

FreeApp.brightness(level: number): void

इस विंडो के लिए 0.0 से 1.0; नेगेटिव मान सिस्टम की ब्राइटनेस लौटा देता है।

FreeApp.fullscreen(on: boolean): void

सिस्टम बार छिपाएँ (इमर्सिव)।

FreeApp.keepAwake(on: boolean): void

स्क्रीन चालू रखें।

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

तुरंत लोकल नोटिफ़िकेशन (Android 13+ पर अनुमति माँगता है)।

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

पेज को PDF के रूप में प्रिंट / सेव करें।

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

id लौटाता है।

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

नेटिव टेक्स्ट-टू-स्पीच, lang जैसे 'en-US'।

FreeApp.statusBar(hexColor: string): void

जैसे '#2563EB'।

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

छोटा नेटिव टोस्ट।

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

एक बार का वाइब्रेशन (डिफ़ॉल्ट 50 ms) या [off, on, off, on…] पैटर्न।

कैमरा और स्कैनिंग

FreeApp.camera.capture(opts?: {maxSize?: number, quality?: number, mirror?: boolean}): Promise<{dataUrl, facing}>

चल रहे प्रीव्यू से एक स्थिर फ़ोटो।

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}>

नेटिव, कम क्षमता वाले फ़ोन पर भी तेज़।

FreeApp.saveToGallery(dataUrl: string, fileName?: string): Promise<{uri}>

एक इमेज को Photos में सेव करता है।

FreeApp.scanCode(opts?: {formats?: string[] /* e.g. ['QR_CODE','EAN_13','CODE_128'] */, facing?: 'back' | 'front'}): Promise<{text, format}>

टॉर्च के साथ फ़ुल-स्क्रीन नेटिव QR / बारकोड स्कैनर; 'cancelled' के साथ reject होता है।

FreeApp.torch(on: boolean): boolean

फ़्लैशलाइट; फ़्लैश न हो तो false लौटाता है।

लोकेशन और सेंसर

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

एक stop फ़ंक्शन लौटाता है।

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

किसी जगह या "lat,lng" को मैप्स ऐप में खोलें।

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

एक stop फ़ंक्शन लौटाता है, या उपलब्ध न हो तो null।

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

एक stop फ़ंक्शन लौटाता है।

डिवाइस और ऐप

FreeApp.app(): {packageName, versionName, versionCode, name, firstInstall}
FreeApp.battery(): {level: number /* 0-100 */, charging: boolean}
FreeApp.biometric(title: string, subtitle?: string): Promise<boolean>

फ़िंगरप्रिंट / फ़ेस अनलॉक।

FreeApp.device(): {manufacturer, model, brand, androidVersion, sdkInt, language, screenWidth, screenHeight, density, isTablet, darkMode}
FreeApp.launchUrl(): string | null

वह डीप लिंक जिससे ऐप खुला।

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

ऐप चलते समय खुले लिंक।

FreeApp.online(): boolean

फ़ाइलें, शेयरिंग और स्टोरेज

FreeApp.copy(text: string): void

क्लिपबोर्ड पर कॉपी करें।

FreeApp.open(url: string): void

बाहरी ब्राउज़र / ऐप में खोलें।

FreeApp.paste(): string

क्लिपबोर्ड का टेक्स्ट पढ़ें।

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>

Downloads में सेव करता है; FreeApp.on('saved', d => …) से {name, ok, location} मिलता है।

FreeApp.share(text: string, title?: string): void

Android शेयर शीट।

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

कोई असली फ़ाइल शेयर करें।

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

स्थायी नेटिव की/वैल्यू (JSON)।

NFC

FreeApp.nfc.read(): Promise<{tagId, techs: string[], writable, maxSize, records: Array<{type: "text" | "uri" | "mime" | "unknown", value, mime?, lang?}>}>

टैग का इंतज़ार करता है; FreeApp.nfc.stop() रद्द करता है।

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}>

अनुमतियाँ

FreeApp.hasPermission(name: string): boolean
FreeApp.openSettings(): void

इस ऐप का सिस्टम सेटिंग्स पेज खोलें।

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}>

विज्ञापन

बिल्डर में AdMob चालू होने पर उपलब्ध। टेस्ट मोड में Google के टेस्ट विज्ञापन दिखाए जाते हैं।

FreeApp.ads.loadBanner(unit?: string, position?: 'top' | 'bottom'): void

बैनर लोड करके दिखाएँ। बिना आर्ग्युमेंट के यह बिल्डर में तय यूनिट और पोज़िशन इस्तेमाल करता है।

FreeApp.ads.showBanner(position?) / hideBanner() / isBannerLoaded()

बैनर दिखाएँ, छिपाएँ या जाँचें।

FreeApp.ads.loadInterstitial(unit?) / showInterstitial() / isInterstitialLoaded()

स्क्रीनों के बीच फ़ुल-स्क्रीन विज्ञापन। फ़ुल-स्क्रीन विज्ञापनों के बीच न्यूनतम अंतर लागू रहता है।

FreeApp.ads.loadRewarded(unit?) / isRewardedLoaded()

रिवॉर्डेड विज्ञापन पहले से लोड करें।

FreeApp.ads.showRewarded(): Promise<{ok, amount, type}>

रिवॉर्डेड विज्ञापन दिखाता है; जब उपयोगकर्ता को इनाम मिल जाए तो resolve होता है, जल्दी बंद करने पर reject होता है।

FreeApp.ads.privacyOptionsRequired(): boolean / showPrivacyOptions()

उपयोगकर्ताओं को अपनी सहमति के विकल्प बदलने देता है (कुछ क्षेत्रों में ज़रूरी)।

FreeApp.ads.adapterStatus(): {[network]: {installed, configured, ready, description, latencyMs}}

मीडिएशन के साथ: कौन से पार्टनर नेटवर्क ऐप के अंदर हैं और आपके AdMob खाते में कौन से सेट अप हैं।

FreeApp.ads.openAdInspector(): void

टेस्ट डिवाइस पर Google का Ad Inspector खोलता है।

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

विज्ञापन इवेंट जैसे initialized, bannerLoaded, interstitialDismissed या rewardedFailed। एक unsubscribe फ़ंक्शन लौटाता है।

"विज्ञापन हटाएँ" खरीदारी के साथ, बैनर और फ़ुल-स्क्रीन विज्ञापन बंद हो जाते हैं और adFree इवेंट फ़ायर होता है। रिवॉर्डेड विज्ञापन काम करते रहते हैं, क्योंकि लोग उन्हें खुद देखना चुनते हैं।

इन-ऐप खरीदारी

तब उपलब्ध, जब बिल्डर में खरीदारी चालू हो। अपने Google Play अकाउंट से एक बार वाले प्रोडक्ट, कॉइन जैसे कंज़्यूमेबल और सदस्यताएँ बेचें। पहले Play Console में उन्हीं ID के साथ प्रोडक्ट बनाएँ। खरीदारी Google Play से इंस्टॉल की गई कॉपी में काम करती है, इसलिए टेस्टिंग ट्रैक और लाइसेंस टेस्टर के साथ टेस्ट करें।

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[]>

आपके प्रोडक्ट की Google Play से लाइव जानकारी: टाइटल, लोकल कीमत, करेंसी, और सदस्यताओं के लिए बिलिंग अवधि और ऑफ़र। जिन ID को Play नहीं पहचानता, वे छोड़ दी जाती हैं।

FreeApp.billing.buy(id: string, opts?: {offer?: string}): Promise<Purchase>

Google Play की पेमेंट शीट खोलता है। सदस्यता के लिए, offer कोई बेस प्लान या ऑफ़र ID चुनता है। त्रुटि होने पर reject करता है, जिसका code cancelled, pending, not_found, unavailable, busy, network या developer_error होता है।

FreeApp.billing.owned(): string[] / isOwned(id): boolean

यूज़र के पास क्या है, फ़ोन पर सेव, इसलिए यह तुरंत और ऑफ़लाइन भी जवाब देता है। पेड फ़ीचर अनलॉक करने के लिए इसे स्टार्टअप पर इस्तेमाल करें।

FreeApp.billing.restore(): Promise<{purchases, owned}>

यूज़र के पास जो कुछ है, वह सब Google Play से फिर से पूछता है, "खरीदारी वापस लाएँ" बटन के लिए।

FreeApp.billing.consume(idOrToken: string): Promise

एक बार वाले प्रोडक्ट को इस्तेमाल कर देता है ताकि उसे फिर से खरीदा जा सके। बिल्डर में कंज़्यूमेबल के रूप में लिखे प्रोडक्ट अपने-आप इस्तेमाल हो जाते हैं।

FreeApp.billing.isAdFree(): boolean

true, जब यूज़र के पास बिल्डर में सेट किए गए "विज्ञापन हटाएँ" प्रोडक्ट में से कोई एक हो। तब ऐप बैनर और फ़ुल-स्क्रीन विज्ञापन अपने-आप बंद कर देता है।

FreeApp.billing.manageSubscriptions(id?: string): void

Google Play की सदस्यता स्क्रीन खोलता है, जहाँ यूज़र अपना प्लान रद्द करते या बदलते हैं।

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

खरीदारी के इवेंट: purchase (यहाँ अनलॉक करें), pending, owned (owned लिस्ट बदली: कोई खरीदारी, रिफ़ंड या खत्म हुई सदस्यता), failed और unavailable। एक अनसब्सक्राइब फ़ंक्शन लौटाता है।

कम्पैटिबिलिटी लेयर

दूसरे HTML-to-APK टूल के लिए लिखे गए पेज जो window.AndroidAPI को कॉल करते हैं, काम करते रहते हैं: वही मेथड नाम, कॉलबैक ID और इवेंट नाम समर्थित हैं, और बिना विज्ञापन वाले ऐप्स में विज्ञापन कॉल सुरक्षित रूप से कुछ नहीं करते।