JavaScript köprü API'si
Paylaşma, panoya kopyalama ve yazdırma
Android paylaşım sayfası, sistem panosu, başka bir uygulamanın uygulamanıza paylaştığı metin ve yazdırma iletişim kutusu.
AppMint.pdf yardımcı#
AppMint.pdf.fromPage(options) / fromHtml(html, options)
Örnek
Yazdırma iletişim kutusu olmadan gerçek bir PDF (seçilebilir metin, vektör grafikler) oluşturur: fromPage sayfayı ekranda göründüğü gibi, @media print CSS'inizle düzenleyerek kaydeder; fromHtml ilettiğiniz HTML'yi uygulamanın kendi adresindeki görünmez bir sayfada işler - böylece göreli görseller, stil sayfaları ve yazı tipleri sayfanızdaki gibi yüklenir - yazı tiplerini ve tüm görselleri bekler, sonra kaydeder. window.print() hâlâ normal yazdırma iletişim kutusunu açar.
Döndürür: {ok: true, fileName, pages, bytes, saved, uri?, base64?} veya {ok: false, code, message} Promise'i - code şunlardan biridir: busy (aynı anda tek PDF), bad-options, failed, too-large (25 MB üzerinde base64) veya permission-denied (Android 7-9'da depolama reddedildi). Gerekir: hiçbir şey - her derlemede vardır. İndirilenler'e kaydetmek Android 10+'da izin gerektirmez.
Seçenekler: fileName (".pdf" eklenir; varsayılan: sayfa başlığı), pageSize 'A4' (varsayılan) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), milimetre cinsinden margins (tek bir sayı veya {top, right, bottom, left}; belirtilmezse kendi @page kuralınız), save 'downloads' (varsayılan) | 'share' | 'base64'.
Geçerli sayfayı İndirilenler'e kaydedin:
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}HTML'den oluşturulan bir makbuz, doğrudan paylaşım sayfasına (PDF oluşturulmadan önce görseller ve yazı tipleri yüklenir):
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Baytları geri alın ve kendiniz yükleyin:
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Ham çağrılar seçenekleri JSON metni ve bir geri çağırma kimliği olarak alır; bunun yerine yukarıdaki yardımcıyı kullanın:
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Notlar: Düğmeleri ve menüleri PDF'den @media print { .no-print { display: none } } ile gizleyin. İndirilen bir PDF, her indirme gibi "<name> indirildi · Aç" gösterir. fromHtml HTML'in betiklerini çalıştırır (betikle çizilen grafikler görünür) ancak uygulamanın yerel özelliklerine erişimi yoktur. Bir sayfadan uzun sayfalar Chrome'un yapacağı gibi bölünür; nerede bölüneceğini denetlemek için break-before: page kullanın.
window.print web standardı#
window.print()
Örnek
Uygulamanın içinde çalışacak şekilde ayarlanmış standart yazdırma çağrısı: Android'in yazdırma ekranını açar; kullanıcı kağıda yazdırır veya PDF olarak kaydeder.
Döndürür: hiçbir şey. Gerekenler: hiçbir şey.
document.getElementById('print-receipt').onclick = function () {
window.print();
};Uygulamanın denetimlerini bir yazdırma stil sayfasıyla kağıtta gizleyin:
<style>
@media print {
nav, .toolbar, button { display: none !important; }
body { background: #fff; color: #000; }
}
</style>Bir kargo etiketini çevresindeki sayfa olmadan yazdırın - aynı kaynaklı bir srcdoc iframe'i yalnızca kendi belgesini yazdırır:
function esc(s) {
return String(s).replace(/[&<>"]/g, function (c) {
return { '&': '&', '<': '<', '>': '>', '"': '"' }[c];
});
}
function printLabel(name, address) {
var frame = document.createElement('iframe');
frame.style.cssText = 'position:fixed;width:0;height:0;border:0';
frame.srcdoc = '<title>Label</title><style>body{font:18px sans-serif;margin:24px}</style>' +
'<b>' + esc(name) + '</b><br>' + esc(address).replace(/\n/g, '<br>');
frame.onload = function () {
frame.contentWindow.print();
setTimeout(function () { frame.remove(); }, 1000);
};
document.body.appendChild(frame);
}Notlar: window.print() ana sayfayı şu an çizildiği gibi yazdırır. Aynı kaynaktan bir <iframe> - bir yazdırma kitaplığının makbuzla doldurup iframe.contentWindow.print() çağırdığı gizli iframe veya kendi window.print() işlevini çağıran bir iframe sayfası - O iframe'in belgesini yazdırır (bkz. __printHtml). Farklı kaynaklı bir iframe sayfadan yazdırılamaz. Yerine geçen işlev sayfanın ilk betiğinden önce vardır. beforeprint iptal edilemez (hiçbir tarayıcıda).
__clipboardRead köprü#
window.WebToApk.__clipboardRead(): String
navigator.clipboard.read(): `{parts:[{type, text|base64}]}`. Bu kabukta readClipboard() ile aynı erişim (kaynak denetimi yoktur).
Örnek
navigator.clipboard.read() arkasındaki dahili aktarım. Sayfalar standart API'yi kullanır; bunu asla doğrudan çağırmayın - __ yöntemleri haber verilmeden değişebilir.
Döndürür: {parts:[{type, text|base64}]} - bu uygulamada readClipboard() ile aynı erişim. Gerekir: açılacak bir şey yok.
Genel API'yi kullanın:
canvas.toBlob(async (png) => {
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
});
const [item] = await navigator.clipboard.read();
if (item && item.types.includes('image/png')) preview(await item.getType('image/png'));Pano HTML içerdiğinde biçimi koruyarak, biçimlendirilmiş metni bir düzenleyiciye yapıştırın:
async function pasteRich(editor) {
try {
var items = await navigator.clipboard.read();
if (!items.length) { showMessage('The clipboard is empty'); return; }
var item = items[0];
if (item.types.includes('text/html')) {
editor.insertHtml(sanitize(await (await item.getType('text/html')).text()));
} else if (item.types.includes('text/plain')) {
editor.insertText(await (await item.getType('text/plain')).text());
}
} catch (e) {
showMessage('Could not read the clipboard');
}
}Kopyalanmış herhangi bir resmi (PNG, JPEG, WebP…) profil fotoğrafı olarak yapıştırın ve reddedilen bir okumayı ayırt edin:
document.getElementById('paste-photo').onclick = async function () {
try {
var items = await navigator.clipboard.read();
var item = items[0];
var type = item && item.types.find(function (t) { return t.indexOf('image/') === 0; });
if (!type) { showMessage('Copy a picture first'); return; }
uploadAvatar(await item.getType(type)); // a Blob of that type
} catch (e) {
if (e.name === 'NotAllowedError') showMessage('This page cannot read the clipboard');
else showMessage('Could not paste the picture');
}
};Notlar: Android 12+, bir uygulama panoyu okuduğunda kendi "panonuzdan yapıştırıldı" mesajını gösterir.
__clipboardWrite köprü#
window.WebToApk.__clipboardWrite(partsJson: String): Boolean
navigator.clipboard.write(): [partsJson], tek bir ClipboardItem için `[{type, text}|{type, base64}]` biçimindedir - text/plain, text/html veya içerik URI'si olarak kopyalanan bir görsel.
Örnek
navigator.clipboard.write([ClipboardItem]) arkasındaki dahili aktarım. Sayfalar standart API'yi kullanır; bunu asla doğrudan çağırmayın - __ yöntemleri haber verilmeden değişebilir.
Döndürür: parça yerleştirildiğinde true. Gerekir: açılacak bir şey yok.
Genel API'yi kullanın:
canvas.toBlob(async (png) => {
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
});
const [item] = await navigator.clipboard.read();
if (item && item.types.includes('image/png')) preview(await item.getType('image/png'));Biçimlendirilmiş metni ve düz sürümünü tek öğede kopyalayın; böylece zengin düzenleyiciler tabloyu, düz alanlar ise metni alır:
async function copyTable(table) {
if (!(navigator.clipboard && navigator.clipboard.write && window.ClipboardItem)) return;
try {
await navigator.clipboard.write([new ClipboardItem({
'text/html': new Blob([table.outerHTML], { type: 'text/html' }),
'text/plain': new Blob([table.innerText], { type: 'text/plain' })
})]);
showMessage('Table copied');
} catch (e) {
showMessage('Could not copy (' + e.name + ')'); // NotAllowedError when the write fails
}
}Sayfanın gösterdiği bir görseli, örneğin bir QR kodunu, sohbete yapıştırılabilsin diye kopyalayın:
async function copyImage(img) {
try {
var blob = await (await fetch(img.src)).blob(); // an image/* type, up to 16 MB
await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]);
showMessage('Image copied');
} catch (e) {
showMessage('Could not copy the image');
}
}Notlar: Öğe başına metin, HTML ve bir görsel. Görsel, uygulamanın FileProvider'ı üzerinden içerik URI'si olarak kopyalanır; böylece WhatsApp, Gmail veya Keep'e yapıştırılabilir.
__printHtml köprü#
window.WebToApk.__printHtml(html: String, baseUrl: String, title: String)
[html] - `window.print()` kılıfı ([PrintShim]) tarafından gönderilen, aynı kaynaklı bir iframe'in serileştirilmiş belgesi - içeriğini [baseUrl] adresindeki ekran dışı bir WebView ile yazdırır, çünkü ana WebView'in yazdırma bağdaştırıcısı yalnızca tüm sayfayı yazdırabilir. [title] yazdırma işini adlandırır (boşsa "<Uygulama adı> Document").
Örnek
Bir iframe'i yazdırmanın arkasındaki iç aktarım: iframe.contentWindow.print() (ve bir iframe sayfasının kendi window.print() işlevi) o iframe'in belgesini buraya gönderir ve uygulama bunu Android'in yazdırma ekranı üzerinden yazdırır. Sayfalar standart çağrıları kullanır; bunu asla doğrudan çağırmayın.
Döndürür: hiçbir şey. Gerekenler: hiçbir şey.
Bunun mümkün kıldığı makbuz deseni - yalnızca makbuzla doldurulmuş gizli bir iframe:
function printReceipt(order) {
var frame = document.createElement('iframe');
frame.style.display = 'none';
document.body.appendChild(frame);
var doc = frame.contentWindow.document;
doc.open();
doc.write('<html><head><title>Receipt ' + order.id + '</title>' +
'<style>body{font:14px sans-serif} td{padding:2px 8px}</style></head><body>' +
'<h2>Receipt ' + order.id + '</h2><table>' +
order.lines.map(function (l) { return '<tr><td>' + l.name + '</td><td>' + l.price + '</td></tr>'; }).join('') +
'</table></body></html>');
doc.close();
frame.contentWindow.print(); // prints the RECEIPT, not the page behind it
setTimeout(function () { frame.remove(); }, 1000);
}Aynı kaynaktan gizli bir iframe'e yüklenen kendi bilet sayfanız - CSS'i ve görselleri yüklenir, <title> öğesi de yazdırma işini adlandırır:
function printTicket(id) {
var frame = document.createElement('iframe');
frame.style.cssText = 'position:fixed;width:0;height:0;border:0';
frame.src = 'ticket.html?id=' + encodeURIComponent(id);
frame.onload = function () {
frame.contentWindow.print(); // prints ticket.html's DOM as it stands now
setTimeout(function () { frame.remove(); }, 1000);
};
document.body.appendChild(frame);
}iframe'in belgesini, anlık görüntüden hemen önce iframe'in penceresindeki beforeprint ile ayarlayın:
function printWithTimestamp(frame) {
var w = frame.contentWindow;
w.addEventListener('beforeprint', function () {
var p = w.document.createElement('p');
p.textContent = 'Printed ' + new Date().toLocaleString();
w.document.body.appendChild(p);
}, { once: true });
w.print(); // the printed copy includes the line added above
}Notlar: Argümanlar (html, baseUrl, title): iframe'in serileştirilmiş belgesi, göreli bağlantılarının çözümlendiği adres (bir about:blank iframe'i için sayfanın kendi adresi) ve yazdırma işi adı (iframe'in <title> öğesi, yoksa sayfanınki). Anlık görüntü print() çağrıldığında alınır - içindeki betikler yeniden çalışmaz - ve beforeprint / afterprint iframe'in penceresinde etrafında tetiklenir. Farklı kaynaklı bir iframe sayfadan yazdırılamaz.
copyToClipboard köprü#
window.WebToApk.copyToClipboard(text: String): Boolean
Promise sarmalayıcısını kullanın: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // sayfa yoksa mağaza sayfası r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Bkz. RatePrompt.
Tek başına değil, grubu olan Google Play'in uygulama içi değerlendirme sayfası altında açıklanmıştır.
Örnek
Düz metni telefonun panosuna kopyalar. Sayfalar normalde kabuğun buraya yönlendirdiği standart navigator.clipboard.writeText(text) işlevini kullanır.
Döndürür: başarıda true, başarısızlıkta false (eşzamanlı). Gerekir: hiçbir şey.
Önce standart API:
document.getElementById('copy-btn').onclick = async function () {
try {
await navigator.clipboard.writeText('PROMO-2026');
showMessage('Copied');
} catch (e) {
showMessage('Could not copy');
}
};Ham çağrı:
if (window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function') {
var ok = window.WebToApk.copyToClipboard('PROMO-2026');
showMessage(ok ? 'Copied' : 'Could not copy');
}Her kod bloğunda, etiketi güncellemek için eşzamanlı yanıtı kullanan bir "Kopyala" düğmesi:
document.querySelectorAll('pre').forEach(function (pre) {
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.onclick = function () {
var ok = !!(window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function' &&
window.WebToApk.copyToClipboard(pre.innerText));
btn.textContent = ok ? 'Copied' : 'Copy failed';
setTimeout(function () { btn.textContent = 'Copy'; }, 1500);
};
pre.parentNode.insertBefore(btn, pre);
});Notlar: Yalnızca düz metin (görsel veya HTML yok). Android 13+ kendi küçük "Kopyalandı" önizlemesini gösterir, bu yüzden orada kendi mesajınıza ihtiyaç duymayabilirsiniz.
pdfFromHtml köprü#
window.WebToApk.pdfFromHtml(html: String, optionsJson: String, callbackId: String)
[html] içeriğini uygulamanın kaynağında ekran dışında işler ve PDF olarak kaydeder - `AppMint.pdf.fromHtml(html, options)` kullanın.
Örnek
AppMint.pdf ile birlikte belgelenmiştir - oradaki örnek bunu da gösterir.
Yazdırma iletişim kutusu olmadan gerçek bir PDF (seçilebilir metin, vektör grafikler) oluşturur: fromPage sayfayı ekranda göründüğü gibi, @media print CSS'inizle düzenleyerek kaydeder; fromHtml ilettiğiniz HTML'yi uygulamanın kendi adresindeki görünmez bir sayfada işler - böylece göreli görseller, stil sayfaları ve yazı tipleri sayfanızdaki gibi yüklenir - yazı tiplerini ve tüm görselleri bekler, sonra kaydeder. window.print() hâlâ normal yazdırma iletişim kutusunu açar.
Döndürür: {ok: true, fileName, pages, bytes, saved, uri?, base64?} veya {ok: false, code, message} Promise'i - code şunlardan biridir: busy (aynı anda tek PDF), bad-options, failed, too-large (25 MB üzerinde base64) veya permission-denied (Android 7-9'da depolama reddedildi). Gerekir: hiçbir şey - her derlemede vardır. İndirilenler'e kaydetmek Android 10+'da izin gerektirmez.
Seçenekler: fileName (".pdf" eklenir; varsayılan: sayfa başlığı), pageSize 'A4' (varsayılan) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), milimetre cinsinden margins (tek bir sayı veya {top, right, bottom, left}; belirtilmezse kendi @page kuralınız), save 'downloads' (varsayılan) | 'share' | 'base64'.
Geçerli sayfayı İndirilenler'e kaydedin:
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}HTML'den oluşturulan bir makbuz, doğrudan paylaşım sayfasına (PDF oluşturulmadan önce görseller ve yazı tipleri yüklenir):
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Baytları geri alın ve kendiniz yükleyin:
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Ham çağrılar seçenekleri JSON metni ve bir geri çağırma kimliği olarak alır; bunun yerine yukarıdaki yardımcıyı kullanın:
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Notlar: Düğmeleri ve menüleri PDF'den @media print { .no-print { display: none } } ile gizleyin. İndirilen bir PDF, her indirme gibi "<name> indirildi · Aç" gösterir. fromHtml HTML'in betiklerini çalıştırır (betikle çizilen grafikler görünür) ancak uygulamanın yerel özelliklerine erişimi yoktur. Bir sayfadan uzun sayfalar Chrome'un yapacağı gibi bölünür; nerede bölüneceğini denetlemek için break-before: page kullanın.
pdfFromPage köprü#
window.WebToApk.pdfFromPage(optionsJson: String, callbackId: String)
Sayfayı yazdırma iletişim kutusu olmadan PDF olarak kaydeder - `AppMint.pdf.fromPage(options)` kullanın. [optionsJson] `{fileName, pageSize, landscape, margins, save}`; [callbackId] çözülür.
Örnek
AppMint.pdf ile birlikte belgelenmiştir - oradaki örnek bunu da gösterir.
Yazdırma iletişim kutusu olmadan gerçek bir PDF (seçilebilir metin, vektör grafikler) oluşturur: fromPage sayfayı ekranda göründüğü gibi, @media print CSS'inizle düzenleyerek kaydeder; fromHtml ilettiğiniz HTML'yi uygulamanın kendi adresindeki görünmez bir sayfada işler - böylece göreli görseller, stil sayfaları ve yazı tipleri sayfanızdaki gibi yüklenir - yazı tiplerini ve tüm görselleri bekler, sonra kaydeder. window.print() hâlâ normal yazdırma iletişim kutusunu açar.
Döndürür: {ok: true, fileName, pages, bytes, saved, uri?, base64?} veya {ok: false, code, message} Promise'i - code şunlardan biridir: busy (aynı anda tek PDF), bad-options, failed, too-large (25 MB üzerinde base64) veya permission-denied (Android 7-9'da depolama reddedildi). Gerekir: hiçbir şey - her derlemede vardır. İndirilenler'e kaydetmek Android 10+'da izin gerektirmez.
Seçenekler: fileName (".pdf" eklenir; varsayılan: sayfa başlığı), pageSize 'A4' (varsayılan) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), milimetre cinsinden margins (tek bir sayı veya {top, right, bottom, left}; belirtilmezse kendi @page kuralınız), save 'downloads' (varsayılan) | 'share' | 'base64'.
Geçerli sayfayı İndirilenler'e kaydedin:
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}HTML'den oluşturulan bir makbuz, doğrudan paylaşım sayfasına (PDF oluşturulmadan önce görseller ve yazı tipleri yüklenir):
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Baytları geri alın ve kendiniz yükleyin:
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Ham çağrılar seçenekleri JSON metni ve bir geri çağırma kimliği olarak alır; bunun yerine yukarıdaki yardımcıyı kullanın:
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Notlar: Düğmeleri ve menüleri PDF'den @media print { .no-print { display: none } } ile gizleyin. İndirilen bir PDF, her indirme gibi "<name> indirildi · Aç" gösterir. fromHtml HTML'in betiklerini çalıştırır (betikle çizilen grafikler görünür) ancak uygulamanın yerel özelliklerine erişimi yoktur. Bir sayfadan uzun sayfalar Chrome'un yapacağı gibi bölünür; nerede bölüneceğini denetlemek için break-before: page kullanın.
print köprü#
window.WebToApk.print()
Sayfayı şu anki haliyle Android'in yazdırma iletişim kutusuna verir; kağıda yazdırabilir veya PDF kaydedebilir. Yapılandırılacak bir şey yok - belgeyi WebView işler.
Kendi başına değil, grubu Yazdırma tarafından açıklanır.
Örnek
Sayfanın şu anki görünümü için Android'in yazdırma ekranını açar - kağıda yazdırın veya "PDF olarak kaydet". Sayfalar normalde kabuğun buraya yönlendirdiği standart window.print() işlevini kullanır.
Döndürür: hiçbir şey. Gerekenler: hiçbir şey.
Önce standart API:
document.getElementById('print-btn').onclick = function () {
window.print(); // in the app: the Android print screen
};Ham çağrı aynı işi yapar:
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
}Listeden bir faturayı, bir yazdırma stil sayfası için işaretleyerek yazdırın (işareti açık bırakın - yazdırma ekranı sayfayı print() döndükten sonra düzenler):
// CSS: @media print { .invoice:not(.print-me), nav, button { display: none !important; } }
function printInvoice(id) {
document.querySelectorAll('.invoice.print-me').forEach(function (el) {
el.classList.remove('print-me');
});
document.getElementById('invoice-' + id).classList.add('print-me');
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
} else {
window.print(); // a normal browser
}
}Notlar: Tüm WebView'i - ana sayfayı - yazdırır. Aynı kaynaklı bir iframe'in kendi print() işlevi yalnızca o iframe'i yazdırır (bkz. window.print). Düğmeleri ve menüleri gizlemek için bir @media print stil sayfası kullanın. İş "<Uygulama adı> Document" olarak adlandırılır. Hatalar yalnızca günlüğe kaydedilir.
readClipboard köprü#
window.WebToApk.readClipboard(): String
Promise sarmalayıcısını kullanın: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // sayfa yoksa mağaza sayfası r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Bkz. RatePrompt.
Tek başına değil, grubu olan Google Play'in uygulama içi değerlendirme sayfası altında açıklanmıştır.
Örnek
Telefonun panosunda şu an bulunan metni okur. Sayfalar normalde kabuğun buraya yönlendirdiği standart navigator.clipboard.readText() işlevini kullanır.
Döndürür: metin veya pano boşsa ya da okunamıyorsa "" (eşzamanlı). Gerekir: hiçbir şey.
Önce standart API - örneğin bir "Kodu yapıştır" düğmesi:
document.getElementById('paste-btn').onclick = async function () {
try {
var text = await navigator.clipboard.readText();
if (text) document.getElementById('code').value = text.trim();
else showMessage('The clipboard is empty');
} catch (e) {
showMessage('Could not read the clipboard');
}
};Ham çağrı:
if (window.WebToApk && typeof window.WebToApk.readClipboard === 'function') {
var text = window.WebToApk.readClipboard();
if (text) document.getElementById('code').value = text;
}Kopyalanan şeyin içinden ilk web adresini alan bir "Bağlantıyı yapıştır" düğmesi:
document.getElementById('paste-link').onclick = function () {
if (!(window.WebToApk && typeof window.WebToApk.readClipboard === 'function')) return;
var text = window.WebToApk.readClipboard();
var m = /https?:\/\/\S+/.exec(text);
if (m) document.getElementById('link').value = m[0];
else showMessage('There is no link on the clipboard');
};Notlar: Yalnızca kendi uygulamanızın sayfaları okuyabilir: uygulamanın içinde açılan yabancı bir web sitesi "" alır. Android, uygulamanın panoyu yalnızca ekrandayken okumasına izin verir ve Android 12+ "panodan yapıştırıldı" bildirimi gösterir - sayfa yüklenirken değil, kullanıcı dokunuşunda okuyun.