J'ai une page simple avec un bouton qui, lorsqu'elle est enfoncée, utilise l'API Async Clipboard pour écrire dans le presse-papiers.
<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));
}
Cela fonctionne à la fois sur Chrome et Firefox, sur ordinateur et sur mobile. Cependant, sur Android Webview, il génère l'erreur suivante:
NotAllowError: Write permission denied.
J'ai pensé que je devais remplacer WebChromeClient.onPermissionRequest()
pour accorder l'autorisation, mais étrangement, onPermissionRequest()
il ne semble pas avoir été invoqué, et la même erreur est toujours lancée.
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());
}
Je reçois toujours la même erreur:
NotAllowError: Write permission denied.
Logcat n'a rien enregistré non plus.
Je soupçonnais peut-être que mon application Android nécessite des autorisations supplémentaires pour accéder au presse-papiers, mais selon https://developer.android.com/about/versions/10/privacy/changes#clipboard-data , mon application devrait avoir l'autorisation lorsqu'elle est concentrée . En effet, le code suivant fonctionne:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);
J'ai également déclaré ce qui suit dans AndroidManifest.xml
cas où l'action de demander une autorisation nécessite une autorisation:
<uses-permission android:name="android.webkit.PermissionRequest" />
Cela n'a rien fait.
Ce n'est donc probablement pas un problème avec l'autorisation au niveau de l'application.
Qu'est-ce qui se passe?
Comment puis-je faire fonctionner les appels d'API Async Clipboard dans Webview?
Système d'exploitation: Android 10 Q
Webview: v. 81.0.4044.111
la source
onPermissionRequest()
n'a en fait jamais été invoqué.Réponses:
Les
writeText
documents de méthode de l'API Clipboard indiquent que nous devons obtenir uneclipboard-write
autorisation à l'aide de l'API Permissions. maisnavigator.permission
n'est pas défini dans la vue Web, peut-être parce qu'ils ne veulent pas mélanger les autorisations Web avec les autorisations OS Android.Il existe un autre moyen par lequel nous pouvons copier du texte dans le presse-papiers à partir de la vue Web Android (en appelant la méthode Java native à partir du code JavaScript Webview).
Tout d'abord, activez javascript sur la vue Web:
Ajoutez ensuite l'interface javascript:
Créer une méthode qui copiera le texte dans le presse-papiers en utilisant
android.content.ClipboardManager
Maintenant, vous pouvez simplement appeler la méthode ci-dessus à partir de la
testClipboard
méthode:la source