Zwischenablage-API-Aufruf löst NotAllowedError aus, ohne onPermissionRequest() aufzurufen

Lesezeit: 3 Minuten

Benutzer-Avatar
cyqsimon

Ich habe eine einfache Seite mit einer Schaltfläche, die beim Drücken die asynchrone Zwischenablage-API verwendet, um in die Zwischenablage zu schreiben.

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

Dies funktioniert sowohl auf Chrome als auch auf Firefox, auf dem Desktop und auf Mobilgeräten. Auf Android Webview wird jedoch der folgende Fehler ausgegeben:

NotAllowError: Write permission denied.


Ich dachte, ich muss überschreiben WebChromeClient.onPermissionRequest() die Erlaubnis zu erteilen, aber seltsam onPermissionRequest() scheint nicht aufgerufen worden zu sein, und derselbe Fehler wird immer noch ausgegeben.

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

Ich bekomme immer noch den gleichen Fehler:

NotAllowError: Write permission denied.

Auch Logcat hat nichts geloggt.


Ich vermutete, dass meine Android-App möglicherweise zusätzliche Berechtigungen für den Zugriff auf die Zwischenablage benötigt, aber laut https://developer.android.com/about/versions/10/privacy/changes#clipboard-data, sollte meine App die Berechtigung haben, wenn sie den Fokus hat. In der Tat funktioniert der folgende Code:

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

Folgendes habe ich auch deklariert in AndroidManifest.xml falls die Aktion des Anforderns einer Erlaubnis eine Erlaubnis erfordert:

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

Das hat nichts gebracht.

Es ist also wahrscheinlich kein Problem mit der Berechtigung auf App-Ebene.


Was ist los?

Wie kann ich API-Aufrufe für die asynchrone Zwischenablage in Webview zum Laufen bringen?


Betriebssystem: Android 10 Q

Webansicht: v. 81.0.4044.111

  • Ähnliche Frage, auch keine Antwort: stackoverflow.com/questions/61429649/…

    – BDL

    26. April 2020 um 9:36 Uhr

  • Ich weiß nichts über Android, aber dieser Artikel von Google bezieht sich auf die Nutzung der Permissions API (des Browsers).

    – Ketzeraffe

    27. April 2020 um 12:55 Uhr

  • Könnte ein Fehler sein.

    – Travis J

    28. April 2020 um 2:42 Uhr

  • @hereticMonkey danke für den Link, aber ich glaube nicht, dass er etwas ändert. Es heißt: “Der Versuch, Daten aus der Zwischenablage zu lesen oder zu schreiben, wird den Benutzer automatisch um Erlaubnis bitten, wenn sie noch nicht erteilt wurde”, was bedeutet, dass es keine explizite Möglichkeit gibt, diese Erlaubnis in JS anzufordern, außer nur zu versuchen, die Zwischenablage zu verwenden, was ich glauben ist wahr. Wie in der Frage erwähnt, wenn ich das in einer Webview-Umgebung mache, onPermissionRequest() wurde tatsächlich nie aufgerufen.

    – cyqsimon

    28. April 2020 um 9:30 Uhr

Benutzer-Avatar
Ankit Makwana

Zwischenablage-APIs writeText method docs sagt, wir müssen erhalten clipboard-write Berechtigung mit Permissions API aber navigator.permission ist in WebView undefiniert, vielleicht weil sie Webberechtigungen nicht mit Android OS-Berechtigungen mischen möchten.

Es gibt noch eine weitere Möglichkeit, Text aus Android WebView in die Zwischenablage zu kopieren: durch Aufrufen der nativen Java-Methode aus dem WebView JavaScript (JS)-Code.

Aktivieren Sie JS in WebView:

myWebView.getSettings().setJavaScriptEnabled(true);

JS-Schnittstelle hinzufügen:

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

Erstellen Sie eine Methode zum Kopieren des Textes in die Zwischenablage 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);
    }
}

Rufen Sie dann die obige Methode mit auf testClipboard:

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

  • Das wundert mich Android Webview nicht umgesetzt navigator.permission. Nun, das ist eine Schande. Ich werde vorerst deinen Workaround verwenden. Vielen Dank.

    – cyqsimon

    7. Mai 2020 um 5:10 Uhr

  • Ja, es ist überraschend, weil andere Berechtigungen wie Kamera, Mikrofon durchgearbeitet werden PermissionRequest innerhalb der Webansicht.

    – Ankit Makwana

    7. Mai 2020 um 5:51 Uhr

  • @NihthiyaAlthaf In Ihrer Webseiten-HTML/JS-Datei, in der Sie Text in die Zwischenablage kopieren möchten.

    – Ankit Makwana

    10. November 2020 um 12:08 Uhr

  • @AnkitMakwana Ich habe diese Kopierschaltfläche von SDK auf meiner Webseite

    – Nihthiya Althaf

    11. November 2020 um 13:02 Uhr

  • Gibt es eine Lösung für diesen sich nur ändernden Client-Code?

    – Tiago Neto

    24. Januar um 19:09 Uhr

1092140cookie-checkZwischenablage-API-Aufruf löst NotAllowedError aus, ohne onPermissionRequest() aufzurufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy