Tengo una página simple con un botón que, cuando se presiona, usa la API Async Clipboard para escribir en el portapapeles.
<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));
}
Esto funciona tanto en Chrome como en Firefox, computadoras de escritorio y dispositivos móviles. Sin embargo, en Android Webview arroja el siguiente error:
NotAllowError: Write permission denied.
Pensé que necesitaba anular WebChromeClient.onPermissionRequest()
para otorgar el permiso, pero extrañamente onPermissionRequest()
no parece haber sido invocado, y todavía se produce el mismo error.
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());
}
Todavía recibo el mismo error:
NotAllowError: Write permission denied.
También Logcat no registró nada.
Sospeché que tal vez mi aplicación de Android requiere permisos adicionales para acceder al portapapeles, pero de acuerdo con https://developer.android.com/about/versions/10/privacy/changes#clipboard-data , mi aplicación debe tener permiso cuando se enfoca . De hecho, el siguiente código funciona:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);
También declaró lo siguiente en AndroidManifest.xml
caso de que la acción de solicitar permiso requiera permiso:
<uses-permission android:name="android.webkit.PermissionRequest" />
Esto no hizo nada.
Por lo tanto, probablemente no sea un problema con el permiso de nivel de aplicación.
¿Qué está pasando?
¿Cómo puedo hacer que las llamadas a la API del Portapapeles asíncrono funcionen en Webview?
SO: Android 10 Q
Vista web: v. 81.0.4044.111
onPermissionRequest()
de hecho nunca se ha invocado.