Eu tenho uma página simples com um botão que, quando pressionada, usa a API do Async Clipboard para gravar na área de transferência.
<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));
}
Isso funciona no Chrome e Firefox, desktop e móvel. No entanto, no Android Webview, ele lança o seguinte erro:
NotAllowError: Write permission denied.
Achei que precisava substituir WebChromeClient.onPermissionRequest()
para conceder a permissão, mas estranhamente onPermissionRequest()
não parece ter sido invocado e o mesmo erro ainda é gerado.
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());
}
Ainda obtenho o mesmo erro:
NotAllowError: Write permission denied.
O Logcat também não registrou nada.
Suspeitei que talvez meu aplicativo Android exija permissões adicionais para acessar a área de transferência, mas, de acordo com https://developer.android.com/about/versions/10/privacy/changes#clipboard-data , meu aplicativo deve ter permissão quando estiver focado . De fato, o seguinte código funciona:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);
Também declarei o seguinte AndroidManifest.xml
caso a ação de solicitar permissão exija permissão:
<uses-permission android:name="android.webkit.PermissionRequest" />
Isso não fez nada.
Portanto, provavelmente não é um problema com a permissão no nível do aplicativo.
O que está acontecendo?
Como faço para que as chamadas da API da área de transferência assíncrona funcionem no Webview?
Sistema operativo: Android 10 Q
Visualização da Web: v. 81.0.4044.111
fonte
onPermissionRequest()
na verdade nunca foi invocado.Respostas:
Os
writeText
documentos do método da API da área de transferência dizem que precisamos obterclipboard-write
permissão usando a API de permissões. masnavigator.permission
é indefinido na visualização na web, talvez porque não desejem misturar permissões da web com permissões do sistema operacional Android.Há mais uma maneira pela qual podemos copiar texto para a área de transferência do android webview (chamando o método java nativo do código javascript do webview).
Antes de tudo, ative o javascript no webview:
Em seguida, adicione a interface javascript:
Crie um método que copie o texto para a área de transferência usando
android.content.ClipboardManager
Agora você pode simplesmente chamar o método acima do
testClipboard
método:fonte