Saya memiliki halaman sederhana dengan tombol, yang ketika ditekan, menggunakan Async Clipboard API untuk menulis ke clipboard.
<body>
<button type="button" onclick="testClipboard();">
Test Clipboard
</button>
</body>
function testClipboard() {
navigator.clipboard.writeText("Clipboard API Test").then(
v => alert("Success"),
e => alert("Fail\n" + e));
}
Ini berfungsi baik di Chrome dan Firefox, desktop dan seluler. Namun di Android Webview ia melempar kesalahan berikut:
NotAllowError: Write permission denied.
Saya pikir saya perlu mengganti WebChromeClient.onPermissionRequest()
untuk memberikan izin, tetapi anehnya onPermissionRequest()
tampaknya tidak dipanggil, dan kesalahan yang sama masih terjadi.
public class WebChromeController extends WebChromeClient {
@Override
public void onPermissionRequest(PermissionRequest request) {
Log.d("myTag", "Permission request");
Log.d("myTag", request.getResources().toString());
request.grant(request.getResources());
}
}
protected void initWebView() {
// ...
myWebView.setWebChromeClient(new WebChromeController());
}
Saya tetap mengalami masalah yang sama:
NotAllowError: Write permission denied.
Logcat juga tidak mencatat apa pun.
Saya menduga mungkin Aplikasi Android saya memerlukan izin tambahan untuk mengakses clipboard, tetapi menurut https://developer.android.com/about/versions/10/privacy/changes#clipboard-data , Aplikasi saya harus memiliki izin ketika memiliki fokus . Memang, kode berikut berfungsi:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);
Saya juga menyatakan sebagai berikut AndroidManifest.xml
jika tindakan meminta izin memerlukan izin:
<uses-permission android:name="android.webkit.PermissionRequest" />
Ini tidak melakukan apa pun.
Jadi itu mungkin bukan masalah dengan izin tingkat Aplikasi.
Apa yang terjadi?
Bagaimana saya bisa mendapatkan panggilan API Async Clipboard untuk bekerja di Webview?
OS: Android 10 Q
Webview: v. 81.0.4044.111
sumber
onPermissionRequest()
sebenarnya tidak pernah dipanggil.Jawaban:
writeText
Dokumen metode Clipboard API mengatakan, kita perlu mendapatkanclipboard-write
izin menggunakan Izin api. tapinavigator.permission
tidak terdefinisi dalam tampilan web, mungkin karena mereka tidak ingin mencampur izin web dengan izin os android.Ada satu lagi cara dimana kita dapat menyalin teks ke clipboard dari tampilan web android (dengan memanggil metode java asli dari kode javascript tampilan web).
Pertama-tama aktifkan javascript di tampilan web:
Kemudian tambahkan antarmuka javascript:
Buat metode yang akan menyalin teks ke clipboard menggunakan
android.content.ClipboardManager
Sekarang Anda bisa memanggil metode di atas dari
testClipboard
metode:sumber