Ücretsiz APK oluştur

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.

navigator.clipboard web standardı#

navigator.clipboard.writeText / readText (and write / read)

Örnek

Uygulamanın içinde telefonun gerçek panosu tarafından yanıtlanan standart Clipboard API.

Döndürür: writeText(text) → kopyalandığında çözülen, aksi halde NotAllowedError ile reddedilen bir Promise. readText() → pano metniyle bir Promise (boşsa ""). write([item]) / read() → standarttaki gibi Promise'ler. Gerekir: hiçbir şey. Belge başlangıcında kurulur, bu yüzden sayfanız ayrıştırılırken yapılan bir denetim bunu zaten görür.

Kopyala:

async function copyLink(link) {
  if (!(navigator.clipboard && navigator.clipboard.writeText)) { alert('Copy is not available'); return; }
  try {
    await navigator.clipboard.writeText(link);
    showMessage('Link copied');
  } catch (e) {
    showMessage('Could not copy');
  }
}

Yapıştır - bir dokunuşla:

document.getElementById('paste').onclick = async function () {
  try {
    var text = await navigator.clipboard.readText();
    document.getElementById('input').value = text;
  } catch (e) {
    showMessage('Could not read the clipboard');
  }
};

Bir görseli kopyalayın (örneğin bir canvas üzerine çizilmiş QR kodu) şununla: ClipboardItem:

async function copyCanvas(canvas) {
  if (!(navigator.clipboard && navigator.clipboard.write && window.ClipboardItem)) {
    alert('Copying images is not available here');
    return;
  }
  var blob = await new Promise(function (r) { canvas.toBlob(r, 'image/png'); });
  try {
    await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);
    showMessage('Image copied');
  } catch (e) {
    showMessage('Could not copy the image');
  }
}

Notlar: Uygulamada writeText/readText, WebToApk.copyToClipboard ve WebToApk.readClipboard çağırır. write() yalnızca ilk ClipboardItem öğesini alır ve text/plain, text/html ile bir görseli (en fazla 16 MB; aynı öğede görsel metinden önceliklidir) destekler. read(), panonun metni, HTML'i veya görseliyle [item] olarak çözülür (boşsa []). Yalnızca uygulamanın kendi sayfaları okuyabilir: uygulamanın içinde açılan yabancı bir web sitesi reddedilir (NotAllowedError). Kullanıcı dokunuşuyla okuyun - Android 12+ "panodan yapıştırıldı" bildirimi gösterir. Tarayıcıda aynı kod tarayıcının kendi izin kurallarıyla çalışır.

navigator.share web standardı#

navigator.share(data) / navigator.canShare(data)

Örnek

Uygulamanın içinde çalışacak şekilde ayarlanmış standart Web Share API: metin ve bağlantılar Android paylaşım sayfasını açar, files ise gerçek dosyalar olarak paylaşılır (WhatsApp, Gmail, Drive…).

Döndürür: navigator.share → sayfa açıldığında çözülen bir Promise (hangi uygulamanın seçildiğini söylemez). navigator.canShare → true/false. Gerekir: hiçbir şey. Belge başlangıcında kurulur, bu yüzden sayfanız ayrıştırılırken yapılan bir denetim bunu zaten görür.

Metin ve bağlantı:

async function shareItem(item) {
  if (!navigator.share) { alert('Sharing is not available here'); return; }
  try {
    await navigator.share({ title: item.name, text: 'Look at this', url: item.link });
  } catch (e) { /* in a browser: AbortError when the user closes the sheet */ }
}

Dosyalar - önce canShare ile kontrol edin:

async function sharePdf(blob) {
  var file = new File([blob], 'invoice.pdf', { type: 'application/pdf' });
  var data = { files: [file], title: 'Invoice', text: 'Invoice for March' };
  if (!(navigator.canShare && navigator.canShare(data))) {
    alert('File sharing is not available here');
    return;
  }
  try {
    await navigator.share(data);
  } catch (e) { console.log('Share failed', e); }
}

Kullanıcının seçtiği birkaç dosya - aynı türdeki fotoğraflar o türle paylaşılır:

document.getElementById('photos').onchange = async function (e) {
  var files = Array.from(e.target.files);
  if (!files.length) return;
  var data = { files: files, title: 'Trip photos' };
  if (!(navigator.canShare && navigator.canShare(data))) {
    alert('File sharing is not available here');
    return;
  }
  try {
    await navigator.share(data);
  } catch (err) { console.log('Share failed', err); }
};

Notlar: Uygulamada title konu olur ve text + url tek bir metin olarak gönderilir. files ile her dosya sayfada okunur ve base64 olarak gönderilir (WebToApk.shareFiles), bu yüzden dosyaları birkaç MB ile sınırlı tutun. Paylaşım sayfası açılamazsa dosyalar bunun yerine indirme olarak kaydedilir ve promise yine de çözülür. canShare, her metin paylaşımı için true döndürür. Yapay zekayla oluşturulan uygulamalar şuradan share kullanabilir: @/lib/appmintNative.

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 { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[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.

clearSharedText köprü#

window.WebToApk.clearSharedText()

Sayfa kullandıktan sonra saklanan paylaşımı temizler.

Örnek

Sayfanız kullandıktan sonra, uygulamaya paylaşılan metni veya bağlantıyı unutur.

Döndürür: hiçbir şey. Gerekir: hiçbir şey (paylaşımın kendisi için Metin ve bağlantılar işaretli Diğer Uygulamalardan Paylaşım Al gerekir).

Saklanan paylaşımı okuyun, kullanın, sonra yeniden yüklemeden sonra tekrar işlenmesin diye temizleyin:

if (window.WebToApk && typeof window.WebToApk.getSharedText === 'function') {
  var raw = window.WebToApk.getSharedText();
  if (raw) {
    var shared = JSON.parse(raw);          // { text, subject, url, receivedAt }
    saveNote(shared.subject, shared.text);
    window.WebToApk.clearSharedText();     // getSharedText() now returns ""
  }
}

window.addEventListener('appmint:shared', function (e) {
  saveNote(e.detail.subject, e.detail.text);
  if (window.WebToApk && window.WebToApk.clearSharedText) window.WebToApk.clearSharedText();
});

Önce sorun ve kullanıcı hangi düğmeye dokunursa dokunsun paylaşımı temizleyin:

function askAboutShare(s) {
  var dialog = document.getElementById('share-dialog');
  document.getElementById('share-preview').textContent = s.text;
  dialog.hidden = false;
  function done() {
    dialog.hidden = true;
    if (window.WebToApk && typeof window.WebToApk.clearSharedText === 'function') {
      window.WebToApk.clearSharedText();
    }
  }
  document.getElementById('share-save').onclick = function () { saveNote(s.subject, s.text); done(); };
  document.getElementById('share-discard').onclick = done;
}

Başarısız bir yükleme yeniden denenebilsin diye, yalnızca güvenle kaydedildikten sonra temizleyin:

async function importShare() {
  if (!(window.WebToApk && typeof window.WebToApk.getSharedText === 'function')) return;
  var raw = window.WebToApk.getSharedText();
  if (!raw) return;
  var s = JSON.parse(raw);
  try {
    var res = await fetch('/api/bookmarks', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ url: s.url || s.text, title: s.subject })
    });
    if (!res.ok) throw new Error('HTTP ' + res.status);
    window.WebToApk.clearSharedText();
  } catch (e) {
    showMessage('Could not save the link — tap Retry');   // Retry calls importShare() again
  }
}

Notlar: Temizleme yalnızca getSharedText() işlevini etkiler. Yeni bir paylaşım, saklananın yerini alır ve appmint:shared olayını yeniden tetikler. Uygulamaya paylaşılan dosyalar ayrıca şu şekilde serbest bırakılır: AppMint.releaseOpenedFile().

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.

getSharedText köprü#

window.WebToApk.getSharedText(): String

Başka bir uygulamanın BU uygulamaya paylaştığı metin veya bağlantı ("<app> uygulamasına paylaş" - YouTube uygulamasından paylaşılan bir YouTube videosu bağlantısı olarak gelir), JSON `{text, subject, url, receivedAt}` olarak veya hiçbir şey paylaşılmadıysa "". Okunana kadar saklanır, böylece paylaşımdan sonra açılan bir uygulama da görür; uygulama çalışırken gelen bir paylaşım ayrıca `appmint:shared` tetikler. Başlıkla paylaşılan bir fotoğraf veya video, dosyayı AppMint.getOpenedFile() üzerinden, başlığı ise burada iletir. Derlemedeki "Diğer uygulamalardan paylaşım al" seçeneğini ve "Metin ve bağlantılar" işaretini gerektirir; bu, paylaşım sayfası girişini kaydeder.

Örnek

Başka bir uygulamanın uygulamanıza paylaştığı ("Paylaş → uygulamanız") metin veya bağlantı, JSON dizesi olarak; hiçbir şey paylaşılmadıysa "".

Döndürür: {text, subject, url, receivedAt} veya "" JSON dizesi (eşzamanlı). url, text içinde (veya "") bulunan ilk http(s):// bağlantısıdır; receivedAt milisaniye cinsinden bir zamandır. Gerekir: derleme sırasında Diğer Uygulamalardan Paylaşım Al açık ve Metin ve bağlantılar işaretli - bu, uygulamanızı diğer uygulamaların Paylaş menüsüne koyar.

Paylaşım siz temizleyene kadar saklanır; bu yüzden başlangıçta okuyun ve uygulama çalışırken gelen paylaşımları dinleyin:

function handleShare(s) {
  addBookmark(s.url || s.text, s.subject);
  if (window.WebToApk && window.WebToApk.clearSharedText) window.WebToApk.clearSharedText();
}

// 1. On start (the app may have been opened by the share).
if (window.WebToApk && typeof window.WebToApk.getSharedText === 'function') {
  var raw = window.WebToApk.getSharedText();
  if (raw) handleShare(JSON.parse(raw));
}

// 2. While running: detail has the same keys { text, subject, url, receivedAt }.
window.addEventListener('appmint:shared', function (e) {
  handleShare(e.detail);
});

Tercih ederseniz genel bir kanca aynı nesneyi alır:

window.onAppMintShared = function (s) { handleShare(s); };

Uygulamaya paylaşılan bir YouTube videosunu url alanını kullanarak açın:

function openSharedVideo() {
  if (!(window.WebToApk && typeof window.WebToApk.getSharedText === 'function')) return;
  var raw = window.WebToApk.getSharedText();
  if (!raw) return;
  var s = JSON.parse(raw);
  var m = /(?:youtu\.be\/|[?&]v=)([\w-]{11})/.exec(s.url || s.text);
  if (m) {
    showVideo(m[1]);
    window.WebToApk.clearSharedText();
  } else {
    showMessage('That share is not a video link');
  }
}

Notlar: YouTube uygulamasından paylaşılan bir YouTube videosu, bağlantısı olarak gelir. Başlıkla BİRLİKTE paylaşılan bir fotoğraf veya video, dosyayı AppMint.getOpenedFile() üzerinden, başlığı ise burada iletir. Kullandıktan sonra paylaşımı temizleyin, yoksa sonraki başlangıçta yeniden görürsünüz. Yapay zekayla oluşturulan uygulamalar şuradan sharedText() / onShared() kullanabilir: @/lib/appmintNative.

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.

shareFiles köprü#

window.WebToApk.shareFiles(filesJson: String, title: String, text: String): Boolean

navigator.share({files:[...]}) için GERÇEK yerel dosya paylaşımı. Android WebView'de Web Share API yoktur ve text/plain ACTION_SEND bir dosya taşıyamaz - bu yüzden bundan önce paylaşılan bir görsel paylaşılmak yerine yalnızca KAYDEDİLİYORDU. filesJson şu biçimdedir: [{name, mimeType, base64}, ...]; her birini önbelleğe yazar, uygulamanın FileProvider'ı üzerinden açarız ve gerçek Android paylaşım sayfası (WhatsApp, Gmail, …) açılsın diye ACTION_SEND / ACTION_SEND_MULTIPLE tetikleriz. Sayfa açıldıysa true döndürür.

Örnek

Android paylaşım sayfası üzerinden bir veya daha fazla gerçek dosyayı (görsel, PDF…) paylaşır. Sayfalar normalde kabuğun buraya yönlendirdiği standart navigator.share({ files: [...] }) işlevini kullanır.

Döndürür: paylaşım sayfası açıldıysa true, aksi halde false (eşzamanlı). Gerekir: hiçbir şey.

Önce standart API:

async function shareCanvas(canvas) {
  var blob = await new Promise(function (r) { canvas.toBlob(r, 'image/png'); });
  var file = new File([blob], 'drawing.png', { type: 'image/png' });
  if (!(navigator.canShare && navigator.canShare({ files: [file] }))) {
    alert('File sharing is not available here');
    return;
  }
  try {
    await navigator.share({ files: [file], title: 'My drawing', text: 'Made in my app' });
  } catch (e) { /* in a browser: the user closed the sheet */ }
}

Ham çağrı, [{name, mimeType, base64}] (data: öneki olmadan base64) ve ardından title ile bir JSON dizesi alır ve text:

function shareBase64Png(base64) {
  if (!(window.WebToApk && typeof window.WebToApk.shareFiles === 'function')) return false;
  var files = [{ name: 'receipt.png', mimeType: 'image/png', base64: base64 }];
  return window.WebToApk.shareFiles(JSON.stringify(files), 'Receipt', 'Your receipt');
}

Bir tabloyu CSV dosyası olarak dışa aktarın (metin base64'ten önce UTF-8 olarak kodlanır):

function shareCsv(rows) {
  if (!(window.WebToApk && typeof window.WebToApk.shareFiles === 'function')) return;
  var csv = rows.map(function (r) {
    return r.map(function (c) { return '"' + String(c).replace(/"/g, '""') + '"'; }).join(',');
  }).join('\n');
  var base64 = btoa(unescape(encodeURIComponent(csv)));
  var files = [{ name: 'expenses.csv', mimeType: 'text/csv', base64: base64 }];
  if (!window.WebToApk.shareFiles(JSON.stringify(files), 'Expenses', '')) {
    showMessage('Could not open the share sheet');
  }
}

Notlar: Dosyalar uygulamanın önbelleğine yazılır ve FileProvider'ı üzerinden paylaşılır. name içindeki güvenli olmayan karakterler _ olur. Aynı türdeki birkaç dosya o türle paylaşılır; karışık türler */* olarak paylaşılır. Dosyanın tamamı köprü üzerinden base64 olarak gider, bu yüzden birkaç MB ile sınırlı tutun. navigator.share({files}) sayfayı açamadığında kabuk dosyaları indirme olarak kaydeder ve promise yine de çözülür.

shareNative köprü#

window.WebToApk.shareNative(title: String, text: String, url: String)

Android paylaşım sayfası, sistem panosu ve sayfanın açtığı bir pencerenin kapatılması. Bunlar düz web karşılıklarıdır (navigator.share, navigator.clipboard, window.close) ve uygulamanın içinde aynı şekilde davranmaları için yerel olarak yanıtlanır.

Kendi başına değil, grubu Paylaşma, panoya kopyalama ve pencere tarafından açıklanır.

Örnek

Başlık, metin ve bağlantıyla Android paylaşım sayfasını açar. Sayfalar normalde kabuğun buraya yönlendirdiği standart navigator.share({title, text, url}) işlevini kullanır.

Döndürür: hiçbir şey (kullanıcının hangi uygulamayı seçtiğini söyleyemez). Gerekir: hiçbir şey.

Önce standart API - mobil tarayıcıda da çalışır:

document.getElementById('share-btn').onclick = async function () {
  if (!navigator.share) { alert('Sharing is not available here'); return; }
  try {
    await navigator.share({ title: 'My app', text: 'Look at this', url: 'https://mysite.com/item/42' });
  } catch (e) {
    // in a browser: AbortError when the user closes the sheet
  }
};

Ham çağrı; üç argüman da dizedir (birini atlamak için '' kullanın):

if (window.WebToApk && typeof window.WebToApk.shareNative === 'function') {
  window.WebToApk.shareNative('My app', 'Look at this', 'https://mysite.com/item/42');
}

Yalnızca metin, bağlantı yok - örneğin bir oyun skoru:

function shareScore(score) {
  if (!(window.WebToApk && typeof window.WebToApk.shareNative === 'function')) return;
  window.WebToApk.shareNative('My score', 'I scored ' + score + ' points. Can you beat it?', '');
}

Notlar: Paylaşılan metin text + yeni bir satır + url biçimindedir (veya yalnızca biri). title e-posta konusu ve paylaşım sayfasının başlığı olur. Yalnızca metin ve bağlantılar - dosya paylaşmak için navigator.share({files}) kullanın (bkz. shareFiles).

Uygulama içi mesajlarda share: düğmesi bağlantıları. Bağlantısı share:<text> olan bir düğme, sayfa kodu olmadan bu metinle aynı paylaşım sayfasını açar. Arkadaşlarını davet et şablonu share:Try {app}: {store} kullanır; uygulama kendi adını ve Play adresini doldurur. Sayfanız bunun gerçekleştiğini öğrenebilir:

window.addEventListener('appmint:inapp', function (e) {
  var d = e.detail;
  if (d.type === 'clicked' && d.link && d.link.indexOf('share:') === 0) analytics('invite_shared', d.name);
});

Uygulama içi mesajları kendiniz çiziyorsanız (setInAppPresentation('none')), bir share: düğmesini aynı şekilde çalıştırın:

function runInAppButton(link) {
  if (link.indexOf('share:') === 0 && window.WebToApk && WebToApk.shareNative) {
    WebToApk.shareNative('', link.slice(6), '');   // text only
  }
}

Bir copy:<text> bağlantısı paylaşmak yerine kopyalar; örneğin bir tanıtım mesajındaki kupon kodu:

window.addEventListener('appmint:inapp', function (e) {
  var d = e.detail;
  if (d.type === 'clicked' && d.link === 'copy:SAVE20') showToast('Code SAVE20 copied');
});

Her belge derlemesinde uygulama çalışma zamanından ve örnek dosyalarından oluşturulur. Markdown olarak okuyun · Tüm aileler.

22.10.2026 tarihinde yayınlanan köprüyle karşılaştırılarak kontrol edildi.