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'): voidFreeApp.print(): voidपेज को PDF के रूप में प्रिंट / सेव करें।
FreeApp.scheduleNotification(title: string, body: string, delayMs: number, opts?: {id?: number, url?: string, repeatMs?: number, exact?: boolean}): numberid लौटाता है।
FreeApp.speak(text: string, lang?: string): voidनेटिव टेक्स्ट-टू-स्पीच, lang जैसे 'en-US'।
FreeApp.statusBar(hexColor: string): voidजैसे '#2563EB'।
FreeApp.stopSpeaking(): voidFreeApp.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(): booleanFreeApp.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): voidFreeApp.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.store.get(key: string): any | nullFreeApp.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): booleanFreeApp.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(): booleantrue, जब यूज़र के पास बिल्डर में सेट किए गए "विज्ञापन हटाएँ" प्रोडक्ट में से कोई एक हो। तब ऐप बैनर और फ़ुल-स्क्रीन विज्ञापन अपने-आप बंद कर देता है।
FreeApp.billing.manageSubscriptions(id?: string): voidGoogle Play की सदस्यता स्क्रीन खोलता है, जहाँ यूज़र अपना प्लान रद्द करते या बदलते हैं।
FreeApp.billing.on(cb: (event) => void): () => voidखरीदारी के इवेंट: purchase (यहाँ अनलॉक करें), pending, owned (owned लिस्ट बदली: कोई खरीदारी, रिफ़ंड या खत्म हुई सदस्यता), failed और unavailable। एक अनसब्सक्राइब फ़ंक्शन लौटाता है।
कम्पैटिबिलिटी लेयर
दूसरे HTML-to-APK टूल के लिए लिखे गए पेज जो window.AndroidAPI को कॉल करते हैं, काम करते रहते हैं: वही मेथड नाम, कॉलबैक ID और इवेंट नाम समर्थित हैं, और बिना विज्ञापन वाले ऐप्स में विज्ञापन कॉल सुरक्षित रूप से कुछ नहीं करते।