Pano API çağrısı, OnPermissionRequest () öğesini çağırmadan NotAllowedError atar


12

Basıldığında, panoya yazmak için Async Clipboard API'sini kullanan bir düğmeyle basit bir sayfam var.

<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));
}

Bu, hem Chrome hem de Firefox, masaüstü ve mobil cihazlarda çalışır. Ancak Android Webview'da aşağıdaki hatayı atar:

NotAllowError: Write permission denied.


WebChromeClient.onPermissionRequest()İzin vermek için geçersiz kılmam gerektiğini düşündüm , ancak garip bir onPermissionRequest()şekilde çağrılmış gibi görünmüyor ve aynı hata hala atılıyor.

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());
}

Ben hala aynı hatayı alıyorum:

NotAllowError: Write permission denied.

Ayrıca Logcat hiçbir şey kaydetmedi.


Android Uygulamamın panoya erişmek için ek izinler gerektirdiğinden şüpheliyim, ancak https://developer.android.com/about/versions/10/privacy/changes#clipboard-data'ya göre , Uygulamam odaklandığında izin almalıdır . Aslında, aşağıdaki kod çalışır:

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);

AndroidManifest.xmlİzin isteme eyleminin izin gerektirmesi durumunda aşağıdakileri de beyan ettim :

<uses-permission android:name="android.webkit.PermissionRequest" />

Bu hiçbir şey yapmadı.

Bu nedenle, muhtemelen Uygulama düzeyi izniyle ilgili bir sorun değildir.


Ne oluyor?

Async Clipboard API çağrılarının Web görünümünde çalışmasını nasıl sağlayabilirim?


İşletim Sistemi: Android 10 Q

Web görünümü: s. 81.0.4044.111


Benzer soru, ayrıca cevap yok: stackoverflow.com/questions/61429649/…
BDL


Bir hata olabilir.
Travis J

@hereticMonkey bağlantı için thx ama bir şey değiştirdiğini sanmıyorum. "Pano verilerini okuma veya yazma girişimi, daha önce verilmemişse kullanıcıdan izin için otomatik olarak istenir" ifadesini belirtir; bu, JS'de yalnızca panoyu kullanmaya çalışmaktan başka bu izni istemenin açık bir yolu olmadığını ima eder. inanmak doğrudur. Soruda belirtildiği gibi, bunu bir Webview ortamında yaptığımda, onPermissionRequest()aslında hiçbir zaman çağrılmadı.
cyqsimon

Yanıtlar:


4

Pano API'sı writeTextdocs yöntemi, clipboard-writeizinler api'yi kullanarak izin almamız gerektiğini söylüyor . ancak navigator.permissionweb izinlerini android os izinleriyle karıştırmak istemedikleri için web görünümünde tanımlanmamıştır.

Android webview (webview javascript kodundan yerli java yöntemini çağırarak) panoya metin kopyalamak için bir yolu daha var.

Her şeyden önce web görünümünde javascript'i etkinleştirin:

myWebView.getSettings().setJavaScriptEnabled(true);

Ardından javascript arayüzünü ekleyin:

myWebView.addJavascriptInterface(new WebAppInterface(), "NativeAndroid");

Metni kullanarak panoya kopyalayacak yöntem oluşturma android.content.ClipboardManager

public class WebAppInterface {
    @JavascriptInterface
    public void copyToClipboard(String text) {
        ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        ClipData clip = ClipData.newPlainText("demo", text);
        clipboard.setPrimaryClip(clip);
    }
}

Şimdi yukarıdaki yöntemi yöntemden çağırabilirsiniz testClipboard:

function testClipboard() {
  navigator.clipboard.writeText("Clipboard API Test").then(
    v => alert("Success"),
    e => alert("Fail\n" + e));

  NativeAndroid.copyToClipboard("Clipboard API Test");
}

Android WebviewUygulanmadığına şaşırdım navigator.permission. Bu bir utanç. Geçici çözümünüzü şu an için kullanacağım. Teşekkür ederim.
cyqsimon

1
Evet, şaşırtıcı, çünkü kamera, mikrofon gibi diğer izinler PermissionRequestweb görünümü içinde çalışıyor .
Ankit Makwana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.