Buat APK Gratis

API jembatan JavaScript

Getar dan suara

Umpan balik haptik, bunyi klik milik aplikasi yang dipicu pada event semantik Anda dan bukan setiap ketukan sembarangan, serta trek musik latar yang dipilih kreator saat build - getMusicVolume mengembalikan -1 jika aplikasi tidak membawa musik, sehingga layar pengaturan bisa menyembunyikan slider alih-alih menampilkan yang mati.

navigator.vibrate standar web#

navigator.vibrate(pattern)

Contoh

Menggetarkan ponsel, memakai Vibration API web biasa. navigator.vibrate bawaan Android WebView tidak pernah menggerakkan motor; aplikasi menggantinya saat dokumen dimulai agar benar-benar bergetar.

Mengembalikan: true jika permintaan diterima, false untuk masukan yang buruk (durasi negatif atau bukan angka). Membutuhkan: aktifkan Vibrate di Langkah 4 (Akses) saat Anda membuat build. Aplikasi buatan AI otomatis mengaktifkannya jika kodenya menggetarkan.

function buzz(pattern) {
  if ('vibrate' in navigator) navigator.vibrate(pattern);
}

document.getElementById('save').addEventListener('click', function () {
  buzz(30);                    // one short buzz, 30 ms
});

document.getElementById('wrong').addEventListener('click', function () {
  buzz([80, 40, 80]);          // buzz 80, pause 40, buzz 80
});

document.getElementById('alarm-off').addEventListener('click', function () {
  buzz(0);                     // 0 or [] stops a running vibration
});

Gunakan nilai kembalian untuk menangkap durasi yang salah, misalnya yang diketik pengguna:

document.getElementById('test-buzz').addEventListener('click', function () {
  var ms = parseInt(document.getElementById('buzz-ms').value, 10);   // '' gives NaN
  if (!('vibrate' in navigator)) return;
  if (!navigator.vibrate(ms)) {
    showError('Enter a duration of 0 ms or more.');
  }
});

Satu detak pendek saat tarik-untuk-muat-ulang melewati titik di mana melepas jari akan memuat ulang:

var armed = false;
var list = document.getElementById('feed');

list.addEventListener('touchmove', function () {
  var ready = list.scrollTop <= 0 && pullDistance() > 80;
  if (ready && !armed && 'vibrate' in navigator) navigator.vibrate(15);
  armed = ready;
}, { passive: true });

list.addEventListener('touchend', function () {
  if (armed) refreshFeed();
  armed = false;
});

Catatan:

  • Polanya adalah pola web: angka pertama adalah getar, lalu jeda, getar, jeda ... (aplikasi mengubahnya untuk Android).
  • Jika Vibrate tidak diaktifkan saat Anda membuat build, panggilan tetap mengembalikan true tetapi ponsel tidak bergetar.
  • Angka desimal dibulatkan ke bawah. Dalam array, angka negatif dihitung 0.
  • Di browser desktop navigator.vibrate mungkin tidak ada, jadi pertahankan pemeriksaan 'vibrate' in navigator.

cancelVibrate jembatan#

window.WebToApk.cancelVibrate()

Haptik sederhana untuk halaman (navigator.vibrate dan bentuk pola). Keduanya diabaikan kecuali build mengaktifkan izin Getar.

Dijelaskan oleh grupnya, Getaran, bukan sendiri.

Contoh

Menghentikan getaran yang masih berjalan. Sebagian besar halaman memakai navigator.vibrate(0) standar, yang memanggil ini untuk Anda.

Mengembalikan: tidak ada. Memerlukan: aktifkan Getar di Langkah 4 (Akses) saat Anda membuat build.

Cara standar:

if ('vibrate' in navigator) navigator.vibrate(0);   // or navigator.vibrate([])

Panggilan mentah, misalnya untuk menghentikan pola alarm panjang saat pengguna mengetuk "Tutup":

if (window.WebToApk && window.WebToApk.vibratePattern) {
  window.WebToApk.vibratePattern(JSON.stringify([1000, 500, 1000, 500, 1000]));
}

document.getElementById('dismiss').addEventListener('click', function () {
  if (window.WebToApk && typeof window.WebToApk.cancelVibrate === 'function') {
    window.WebToApk.cancelVibrate();
  }
});

Hentikan getaran yang sedang berjalan saat pengguna meninggalkan layar, agar ponsel tidak terus bergetar di saku mereka:

document.addEventListener('visibilitychange', function () {
  if (!document.hidden) return;
  if (window.WebToApk && typeof window.WebToApk.cancelVibrate === 'function') {
    window.WebToApk.cancelVibrate();
  }
});

Catatan: Aman dipanggil saat tidak ada yang bergetar.

getMusicVolume jembatan#

window.WebToApk.getMusicVolume(): Int

Level saat ini 0..100, atau -1 jika aplikasi ini tidak menyertakan musik latar.

Contoh

Membaca level musik latar aplikasi yang berulang, 0 sampai 100.

Mengembalikan: sebuah angka, secara sinkron: 0-100, atau -1 jika aplikasi ini dibuat tanpa file musik. Membutuhkan: file yang dipilih di bawah Background Music di Langkah 3 (Integrate), di bawah Display Options, saat Anda membuat build.

Tampilkan penggeser musik hanya saat ada musik:

var slider = document.getElementById('music-slider');
var level = -1;
if (window.WebToApk && typeof window.WebToApk.getMusicVolume === 'function') {
  level = window.WebToApk.getMusicVolume();
}

if (level < 0) {
  slider.parentNode.hidden = true;          // no music in this app: hide the setting
} else {
  slider.value = level;
  slider.addEventListener('input', function () {
    window.WebToApk.setMusicVolume(parseInt(slider.value, 10));
  });
}

Tombol bisu yang kembali ke level pengguna sendiri saat bisu dibatalkan (aplikasi juga mengingat 0, jadi simpan sendiri level lamanya):

function musicLevel() {
  return window.WebToApk && typeof window.WebToApk.getMusicVolume === 'function'
    ? window.WebToApk.getMusicVolume() : -1;
}
var muteBtn = document.getElementById('mute');

function paint() {
  var v = musicLevel();
  muteBtn.hidden = v < 0;
  muteBtn.textContent = v === 0 ? 'Unmute' : 'Mute';
}

muteBtn.addEventListener('click', function () {
  var v = musicLevel();
  if (v < 0) return;
  if (v > 0) {
    try { localStorage.setItem('musicBefore', String(v)); } catch (e) {}
    window.WebToApk.setMusicVolume(0);
  } else {
    var back = 40;
    try { back = parseInt(localStorage.getItem('musicBefore') || '40', 10); } catch (e) {}
    window.WebToApk.setMusicVolume(back);
  }
  paint();
});
paint();

Pudarkan musik dari levelnya saat ini ke level baru, misalnya di bawah adegan dialog:

function fadeMusicTo(target, ms) {
  if (!window.WebToApk || typeof window.WebToApk.getMusicVolume !== 'function') return;
  var start = window.WebToApk.getMusicVolume();
  if (start < 0 || start === target) return;
  var steps = 10, i = 0;
  var t = setInterval(function () {
    i++;
    window.WebToApk.setMusicVolume(Math.round(start + (target - start) * i / steps));
    if (i === steps) clearInterval(t);
  }, ms / steps);
}

fadeMusicTo(10, 800);     // dim under the dialogue
// later: fadeMusicTo(60, 800);  the last level set is the one kept for the next launch

Catatan: Mengembalikan level yang diatur oleh penggeser build atau oleh panggilan setMusicVolume terakhir Anda. Saat aplikasi lain atau panggilan telepon mengambil audio, musik mengecil atau berhenti sendiri; angka yang Anda baca tidak berubah.

getVolume jembatan#

window.WebToApk.getVolume(stream: String): String

Level satu stream: `{stream, current, max, percent, muted}` sebagai string JSON. stream: 'media' | 'alarm' | 'ring' | 'notification' | 'call'.

Contoh

Membaca salah satu level volume bawaan ponsel.

Mengembalikan: string JSON, secara sinkron: {"stream":"alarm","current":5,"max":7,"percent":71,"muted":false} - current/max adalah langkah bawaan ponsel (berbeda antar ponsel), percent adalah 0-100. stream adalah 'media', 'alarm', 'ring', 'notification' atau 'call'; nama lain menghasilkan {"error":"unknown_stream"}. Membutuhkan: tidak ada.

function warnIfAlarmSilent() {
  if (!(window.WebToApk && window.WebToApk.getVolume)) return;
  const v = JSON.parse(WebToApk.getVolume('alarm'));
  if (!v.error && v.percent === 0) {
    showMessage('Your alarm volume is off, so the alarm will not be heard.');
  }
}
warnIfAlarmSilent();

Tampilkan semua level di layar pengaturan:

['media', 'alarm', 'ring', 'notification'].forEach(function (s) {
  const v = JSON.parse(WebToApk.getVolume(s));
  document.getElementById('vol-' + s).value = v.percent;
});

Atur volume dan baca hasilnya. setVolume(stream, percent, showUi) menjawab dengan string JSON.

function setAlarmVolume(percent) {
  if (!(window.WebToApk && WebToApk.setVolume)) return;
  const r = JSON.parse(WebToApk.setVolume('alarm', percent, true));
  if (!r.ok) showMessage('Could not change the volume: ' + r.error);   // fixed_volume, muted, ...
  else document.getElementById('vol-alarm').value = r.percent;
}

playClick jembatan#

window.WebToApk.playClick()

Memutar suara ketukan aplikasi sesuai permintaan, sehingga halaman dapat memicunya pada event semantiknya SENDIRI (penekanan tombol) alih-alih pada setiap ketukan acak - yang memang dilakukan aplikasi native, dan alasan clickSoundMode dapat "off" sementara ini tetap bekerja. Tidak berbuat apa-apa hanya jika aplikasi dibuat TANPA suara ketukan (enableClickSound mati). Pada clickSoundMode "off" - tanpa suara otomatis di setiap ketukan - panggilan eksplisit tetap memutar: mode itu ada untuk aplikasi yang berbunyi pada event-nya sendiri. Selain itu, ia memutar umpan balik yang dikonfigurasi pembuat.

Contoh

Memutar suara ketukan aplikasi satu kali, agar tombol Anda sendiri dapat berbunyi klik seperti aplikasi native.

Mengembalikan: tidak ada. Membutuhkan: sakelar Tap Sound di Langkah 3 (Integrate), di bawah Display Options, saat Anda membuat build (aktif secara default). Jika sakelar mati, ini tidak melakukan apa-apa.

function clickSound() {
  if (window.WebToApk && typeof window.WebToApk.playClick === 'function') {
    window.WebToApk.playClick();
  }
}

document.querySelectorAll('button, .tab').forEach(function (el) {
  el.addEventListener('click', clickSound);
});

Satu listener untuk seluruh papan permainan, berbunyi klik hanya pada ketukan yang melakukan sesuatu:

document.getElementById('board').addEventListener('click', function (e) {
  var cell = e.target.closest('.cell');
  if (!cell || cell.classList.contains('taken')) return;   // a dead tap stays silent
  if (window.WebToApk && typeof window.WebToApk.playClick === 'function') {
    window.WebToApk.playClick();
  }
  placeMark(cell);
});

Beri pengguna Anda sakelar "Suara" sendiri di atas pengaturan build:

var toggle = document.getElementById('sounds-toggle');
var soundsOn = true;
try { soundsOn = localStorage.getItem('sounds') !== 'off'; } catch (e) {}
toggle.checked = soundsOn;

toggle.addEventListener('change', function () {
  soundsOn = toggle.checked;
  try { localStorage.setItem('sounds', soundsOn ? 'on' : 'off'); } catch (e) {}
});

function tapSound() {
  if (soundsOn && window.WebToApk && typeof window.WebToApk.playClick === 'function') {
    window.WebToApk.playClick();
  }
}

Catatan: Apa yang Anda dengar bergantung pada pilihan Suara ketukan:

  • Ikuti pengaturan ponsel (disarankan): klik sistem. Senyap jika pengguna mematikan "Suara sentuhan" di pengaturan ponsel. Ini disengaja.
  • Selalu putar di setiap ketukan: bunyi klik milik aplikasi, selalu terdengar. Setiap ketukan di halaman juga berbunyi klik, jadi Anda biasanya tidak membutuhkan playClick() dalam mode ini.

Panggil dari penekanan tombol yang nyata, bukan dari timer.

requestDndAccess jembatan#

window.WebToApk.requestDndAccess(): String

Akses Jangan Ganggu, dibutuhkan untuk mengubah level dering / notifikasi saat DND aktif. "granted" | "opened" (layar pengaturan dibuka) | "not_declared".

Contoh

Meminta akses Jangan Ganggu, yang diwajibkan Android sebelum aplikasi boleh mengubah volume dering atau notifikasi saat Jangan Ganggu aktif (setVolume lalu menjawab dnd_access_required).

Mengembalikan: sebuah string: 'granted' (sudah diizinkan), 'opened' (layar sistem tempat pengguna mengizinkannya dibuka - periksa lagi saat mereka kembali), atau 'not_declared' (build ini tidak membawa izinnya, sehingga Android tidak akan mendaftar aplikasi di sana). Membutuhkan: memanggil requestDndAccess di kode aplikasi Anda: build kemudian otomatis mendeklarasikan ACCESS_NOTIFICATION_POLICY.

function allowRingVolume() {
  if (!(window.WebToApk && window.WebToApk.requestDndAccess)) return;
  const r = WebToApk.requestDndAccess();
  if (r === 'opened') showMessage('Allow Do Not Disturb access for this app, then come back.');
  if (r === 'not_declared') showMessage('Turn off Do Not Disturb to change the ring volume.');
}

Coba ubah volume sekali lagi setelah pengguna mengizinkan akses:

function setRing(percent) {
  const r = JSON.parse(WebToApk.setVolume('ring', percent, true));
  if (r.ok || r.error !== 'dnd_access_required') return r;
  const a = WebToApk.requestDndAccess();     // 'granted' | 'opened' | 'not_declared'
  if (a === 'granted') return JSON.parse(WebToApk.setVolume('ring', percent, true));
  showMessage(a === 'opened' ? 'Allow access, then press the button again.' : 'Turn off Do Not Disturb first.');
  return r;
}

Senyapkan dering dari sakelar "mode rapat", dan jelaskan alasannya saat tidak bisa bekerja:

function meetingMode(on) {
  if (!(window.WebToApk && WebToApk.setVolume)) return;
  const r = JSON.parse(WebToApk.setVolume('ring', on ? 0 : 70, false));
  if (!r.ok && r.error === 'dnd_access_required') {
    const a = WebToApk.requestDndAccess();
    if (a === 'not_declared') showMessage('This build cannot change the ring volume while Do Not Disturb is on.');
  }
}

setMusicVolume jembatan#

window.WebToApk.setMusicVolume(percent: Int)

Atur level musik latar dari halaman, 0..100. Penggeser wizard menentukan bagaimana aplikasi MEMULAI; ini cara aplikasi memberi penggunanya kontrol musik, yang diharapkan ada di setiap game dengan layar pengaturan. Dibatasi di [BackgroundMusic.setVolume], sehingga halaman yang mengirim 500 atau -1 tidak dapat memberi MediaPlayer gain di luar rentang yang diterimanya. Level ini DIINGAT: peluncuran berikutnya dimulai dari level itu, bukan dari level wizard. Tidak berbuat apa-apa jika aplikasi dibuat tanpa trek - tidak ada yang bisa diatur, dan jawaban jujurnya adalah [getMusicVolume] mengembalikan -1 agar halaman dapat menyembunyikan penggesernya daripada menampilkan yang tidak berfungsi.

Contoh

Mengubah level musik latar aplikasi yang berulang, 0 sampai 100, misalnya dari layar pengaturan game Anda.

Mengembalikan: tidak ada. Memerlukan: berkas yang dipilih di bawah Musik Latar pada Langkah 3 (Integrasi), di bawah Opsi Tampilan, saat Anda membuat build. Tanpa musik, ini tidak melakukan apa-apa (periksa getMusicVolume() untuk -1).

Tombol bisu - aplikasi mengingat levelnya untuk peluncuran berikutnya:

function hasMusic() {
  return !!(window.WebToApk && window.WebToApk.getMusicVolume) && window.WebToApk.getMusicVolume() >= 0;
}

if (!hasMusic()) document.getElementById('mute').hidden = true;

document.getElementById('mute').addEventListener('click', function () {
  if (!hasMusic()) return;
  // clamped to 0..100 by the app, and kept for the next launch
  window.WebToApk.setMusicVolume(window.WebToApk.getMusicVolume() > 0 ? 0 : 40);
});

Tombol Mati / Rendah / Tinggi di layar pengaturan:

var LEVELS = { off: 0, low: 25, high: 70 };

document.querySelectorAll('[data-music]').forEach(function (btn) {
  btn.addEventListener('click', function () {
    if (!window.WebToApk || typeof window.WebToApk.setMusicVolume !== 'function') return;
    if (window.WebToApk.getMusicVolume() < 0) return;       // built without music
    window.WebToApk.setMusicVolume(LEVELS[btn.dataset.music]);
    markSelected(btn);
  });
});

Kecilkan musik saat video Anda sendiri diputar, lalu kembalikan (level diingat, jadi selalu pulihkan):

var video = document.getElementById('intro-video');
var before = -1;

video.addEventListener('play', function () {
  if (!window.WebToApk || typeof window.WebToApk.getMusicVolume !== 'function') return;
  before = window.WebToApk.getMusicVolume();
  if (before > 0) window.WebToApk.setMusicVolume(Math.round(before / 4));
});

function restoreMusic() {
  if (before > 0) window.WebToApk.setMusicVolume(before);
  before = -1;
}
video.addEventListener('pause', restoreMusic);
video.addEventListener('ended', restoreMusic);

Catatan: Level yang Anda atur disimpan: peluncuran berikutnya dimulai dari level itu, bukan dari level penggeser build (sampai pengguna menghapus data aplikasi). 0 membuat musik senyap tetapi tetap berputar.

setVolume jembatan#

window.WebToApk.setVolume(stream: String, percent: Double, showUi: Boolean): String

Mengatur sebuah stream ke [percent] (0-100); [showUi] menampilkan slider volume ponsel. `{ok:true, stream, current, max, percent}` atau `{ok:false, error}` - error adalah unknown_stream | bad_percent | fixed_volume | dnd_access_required | muted | not_applied | failed | foreign_origin (halaman di luar situs milik aplikasi sendiri).

Contoh

Mengatur salah satu level volume ponsel sendiri, 0-100 - misalnya menaikkan stream alarm untuk alarm bangun tidur, atau slider media di aplikasi musik.

Mengembalikan: string JSON: {"ok":true,"stream":"alarm","current":6,"max":7,"percent":86}, atau {"ok":false,"error":"…"} dengan error berupa unknown_stream, bad_percent, fixed_volume (perangkat ini tidak punya volume yang dapat diatur), dnd_access_required (Jangan Ganggu aktif dan memblokir level dering / notifikasi - lihat requestDndAccess()), foreign_origin (halaman di luar situs aplikasi Anda sendiri) atau failed. showUi: true menampilkan penggeser volume bawaan ponsel saat bergerak. Memerlukan: tidak ada untuk media, alarm, dan panggilan; dering dan notifikasi mungkin memerlukan akses Jangan Ganggu saat DND aktif.

function setAlarmLoud() {
  if (!(window.WebToApk && window.WebToApk.setVolume)) return;
  const r = JSON.parse(WebToApk.setVolume('alarm', 80, true));
  if (!r.ok) showMessage('Could not change the alarm volume: ' + r.error);
}

document.getElementById('ring-slider').oninput = function (e) {
  const r = JSON.parse(WebToApk.setVolume('ring', Number(e.target.value), false));
  if (r.error === 'dnd_access_required' && WebToApk.requestDndAccess() === 'not_declared') {
    showMessage('Turn off Do Not Disturb to change the ring volume.');
  }
};

Baca sebuah level, lalu atur slider media:

if (window.WebToApk && WebToApk.setVolume) {
  const now = JSON.parse(WebToApk.getVolume('media'));   // {stream, current, max, percent, muted}
  slider.value = now.percent;
  slider.oninput = () => {
    const r = JSON.parse(WebToApk.setVolume('media', Number(slider.value), false));
    if (r.ok) label.textContent = r.percent + '%';
    else if (r.error === 'fixed_volume') slider.disabled = true;   // this phone has no adjustable volume
  };
}

Tampilkan level dering saat ini dan bereaksi saat berubah:

if (window.WebToApk && WebToApk.getVolume) {
  const ring = JSON.parse(WebToApk.getVolume('ring'));   // {stream, current, max, percent, muted}
  document.getElementById('ring-slider').value = ring.percent;
  WebToApk.watchVolume(true);
  window.addEventListener('appmint:volume', (e) => {
    if (e.detail.stream === 'ring') document.getElementById('ring-slider').value = e.detail.percent;
  });
}

Catatan: nilai dibulatkan ke langkah terdekat ponsel, dan jawabannya membawa level yang benar-benar diatur. Stream panggilan tidak pernah turun di bawah minimumnya (biasanya 1).

vibrate jembatan#

window.WebToApk.vibrate(durationMs: Long)

Haptik sederhana untuk halaman (navigator.vibrate dan bentuk pola). Keduanya diabaikan kecuali build mengaktifkan izin Getar.

Dijelaskan oleh grupnya, Getaran, bukan sendiri.

Contoh

Menggetarkan ponsel satu kali selama jumlah milidetik yang diberikan. Sebagian besar halaman memakai navigator.vibrate(ms) standar, yang memanggil ini untuk Anda.

Mengembalikan: tidak ada. Memerlukan: aktifkan Getar di Langkah 4 (Akses) saat Anda membuat build. Tanpa itu panggilan ini tidak melakukan apa-apa.

Cara standar (berfungsi sama di browser):

if ('vibrate' in navigator) navigator.vibrate(50);

Panggilan mentah:

document.getElementById('like').addEventListener('click', function () {
  if (window.WebToApk && typeof window.WebToApk.vibrate === 'function') {
    window.WebToApk.vibrate(40);      // 40 ms
  }
});

// 0 (or any value <= 0) stops a running vibration
if (window.WebToApk && window.WebToApk.vibrate) window.WebToApk.vibrate(0);

Ketukan kecil setiap kali slider berpindah ke langkah baru, seperti pemilih native:

var slider = document.getElementById('size');
var last = slider.value;
slider.addEventListener('input', function () {
  if (slider.value === last) return;          // same step, no tick
  last = slider.value;
  if (window.WebToApk && typeof window.WebToApk.vibrate === 'function') {
    window.WebToApk.vibrate(10);              // 10 ms: a light tick
  }
});

Getaran lebih panjang saat formulir tidak dapat dikirim, agar pengguna merasakan kesalahannya:

document.getElementById('signup').addEventListener('submit', function (e) {
  if (this.checkValidity()) return;
  e.preventDefault();
  if (window.WebToApk && typeof window.WebToApk.vibrate === 'function') {
    window.WebToApk.vibrate(250);
  }
  this.reportValidity();
});

Catatan: Berikan bilangan bulat. Kekuatannya adalah bawaan ponsel; untuk ketukan lebih kuat/lemah gunakan Capacitor.Plugins.Haptics.impact atau Capacitor.Plugins.AppwrightHaptics.play. Untuk pola getar-jeda-getar gunakan vibratePattern.

vibratePattern jembatan#

window.WebToApk.vibratePattern(patternJson: String)

Menggetarkan pola hidup/mati, mis. "[100,50,100]" = getar 100ms, jeda 50, getar 100. Mendukung navigator.vibrate(array); utamakan API standar. Tidak berefek kecuali kreator mengaktifkan izin Vibrate.

Contoh

Menggetarkan pola hidup/mati, diberikan sebagai string JSON. Sebagian besar halaman memakai navigator.vibrate([...]) standar, yang memanggil ini untuk Anda.

Mengembalikan: tidak ada. Memerlukan: aktifkan Getar di Langkah 4 (Akses) saat Anda membuat build. Tanpa itu panggilan ini tidak melakukan apa-apa.

Cara standar:

if ('vibrate' in navigator) navigator.vibrate([100, 50, 100]);   // buzz, pause, buzz

Panggilan mentah menerima pola bergaya web yang sama sebagai string JSON:

function pattern(list) {
  if (window.WebToApk && typeof window.WebToApk.vibratePattern === 'function') {
    window.WebToApk.vibratePattern(JSON.stringify(list));
  }
}

pattern([200]);                     // one 200 ms buzz
pattern([100, 50, 100, 50, 300]);   // short, short, long
pattern([]);                        // empty list stops a running vibration

Pola ini diputar sekali, jadi alarm mengulanginya sendiri sampai pengguna menghentikannya:

var alarm = null;
var ALARM = JSON.stringify([500, 300, 500, 300, 500]);   // about 2.1 s

function startAlarm() {
  if (!window.WebToApk || typeof window.WebToApk.vibratePattern !== 'function') return;
  window.WebToApk.vibratePattern(ALARM);
  alarm = setInterval(function () { window.WebToApk.vibratePattern(ALARM); }, 3000);
}

function stopAlarm() {
  if (alarm === null) return;
  clearInterval(alarm);
  alarm = null;
  window.WebToApk.vibratePattern('[]');                 // stop the buzz that is still running
}

Catatan: Angka pertama adalah getar, lalu jeda, getar, jeda ... (urutan web). Aplikasi menambahkan "tunggu" awal Android untuk Anda, jadi jangan menaruh 0 di awal sendiri: [0, 100] berarti "getar 0 md, jeda 100 md" dan Anda tidak merasakan apa-apa. Angka negatif dihitung 0. Pola diputar sekali.

watchVolume jembatan#

window.WebToApk.watchVolume(on: Boolean): Boolean

Menyalakan (true) atau mematikan (false) event `appmint:volume`.

Contoh

Menyalakan atau mematikan event perubahan volume langsung: saat aktif, setiap perubahan level volume (tombol fisik, slider sistem, aplikasi lain) sampai ke halaman sebagai appmint:volume.

Mengembalikan: true jika perubahan berlaku. Membutuhkan: tidak ada.

if (window.WebToApk && window.WebToApk.watchVolume) {
  window.addEventListener('appmint:volume', function (e) {
    // e.detail = { stream: 'media', current: 9, max: 15, percent: 60, muted: false }
    document.getElementById('vol-' + e.detail.stream).value = e.detail.percent;
  });
  WebToApk.watchVolume(true);
  window.addEventListener('pagehide', function () { WebToApk.watchVolume(false); });
}

Objek yang sama juga dapat dijangkau lewat hook halaman, jika Anda lebih suka:

window.onAppMintVolume = function (level) {
  if (level.stream === 'alarm' && level.percent === 0) showMessage('Alarm volume is now off.');
};
WebToApk.watchVolume(true);

Tampilkan level sekali dengan getVolume, lalu biarkan tetap aktif hanya selama layar terlihat:

if (window.WebToApk && WebToApk.watchVolume && WebToApk.getVolume) {
  const meter = document.getElementById('media-meter');
  meter.value = JSON.parse(WebToApk.getVolume('media')).percent;
  const onVol = function (e) { if (e.detail.stream === 'media') meter.value = e.detail.percent; };
  document.addEventListener('visibilitychange', function () {
    if (document.hidden) { WebToApk.watchVolume(false); window.removeEventListener('appmint:volume', onVol); }
    else { window.addEventListener('appmint:volume', onVol); WebToApk.watchVolume(true); }
  });
}

Catatan: satu event per stream yang berubah (media, alarm, ring, notification, call). Matikan saat layar yang menampilkan level ditutup.

Dibuat dari runtime aplikasi dan file contohnya pada setiap build dokumentasi. Baca sebagai Markdown · Semua keluarga.

Diperiksa terhadap jembatan yang dirilis pada 2026-10-22.