Javascript 剪贴板API调用在不调用onPermissionRequest()的情况下抛出NotAllowedError
我有一个带有按钮的简单页面,按下按钮时,使用异步剪贴板API写入剪贴板Javascript 剪贴板API调用在不调用onPermissionRequest()的情况下抛出NotAllowedError,javascript,android,android-webview,clipboard,Javascript,Android,Android Webview,Clipboard,我有一个带有按钮的简单页面,按下按钮时,使用异步剪贴板API写入剪贴板 测试剪贴板 函数testClipboard(){ navigator.clipboard.writeText(“剪贴板API测试”)。然后( v=>警报(“成功”), e=>alert(“Fail\n”+e)); } 这适用于Chrome和Firefox、桌面和移动设备。但是,在Android Webview上,它会引发以下错误: notallower错误:写入权限被拒绝。 我想我需要重写WebChromeClien
测试剪贴板
函数testClipboard(){
navigator.clipboard.writeText(“剪贴板API测试”)。然后(
v=>警报(“成功”),
e=>alert(“Fail\n”+e));
}
这适用于Chrome和Firefox、桌面和移动设备。但是,在Android Webview上,它会引发以下错误:
notallower错误:写入权限被拒绝。
我想我需要重写
WebChromeClient.onPermissionRequest()
来授予权限,但奇怪的是onPermissionRequest()
似乎没有被调用,并且仍然抛出相同的错误
公共类WebChromeController扩展WebChromeClient{
@凌驾
公共作废onPermissionRequest(PermissionRequest请求){
Log.d(“myTag”、“权限请求”);
Log.d(“myTag”,request.getResources().toString());
request.grant(request.getResources());
}
}
受保护的void initWebView(){
// ...
setWebChromeClient(新的WebChromeController());
}
我仍然得到相同的错误:
notallower错误:写入权限被拒绝。
Logcat也没有记录任何信息
我怀疑可能我的Android应用程序需要额外的权限才能访问剪贴板,但根据我的经验,我的应用程序在有焦点时应该有权限。事实上,以下代码是有效的:
ClipboardManager剪贴板=(ClipboardManager)getSystemService(Context.clipboard\u服务);
clipdataclip=ClipData.newPlainText(“MyLbl”,“我有权限”);
剪贴板.setPrimaryClip(clip);
我还在AndroidManifest.xml
中声明了以下内容,以防请求权限的操作需要权限:
这没用
因此,这可能不是应用程序级权限的问题
发生了什么事 如何让异步剪贴板API调用在Webview中工作
操作系统:安卓10q
网络视图:v。81.0.4044.111剪贴板API的
writeText
方法文档说,我们需要使用权限API获得剪贴板写入
权限,但使用navigator。权限在WebView中未定义,可能是因为他们不想将web权限与Android操作系统权限混合使用
还有一种方法可以将文本从Android WebView复制到剪贴板:从WebView JavaScript(JS)代码调用本机Java方法
在WebView中启用JS:
myWebView.getSettings().setJavaScriptEnabled(true);
添加JS接口:
myWebView.addJavascriptInterface(new WebAppInterface(), "NativeAndroid");
使用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);
}
}
然后使用testClipboard
调用上述方法:
function testClipboard() {
navigator.clipboard.writeText("Clipboard API Test").then(
v => alert("Success"),
e => alert("Fail\n" + e));
NativeAndroid.copyToClipboard("Clipboard API Test");
}
类似的问题,也没有答案:我对安卓一无所知,但是。可能是个bug。@hereticMonkey thx链接,但我认为它不会改变任何东西。它表示“如果尚未授予用户权限,尝试读取或写入剪贴板数据将自动提示用户请求权限”,这意味着除了尝试使用剪贴板之外,在JS中没有明确的方式请求此权限,我相信这是正确的。如问题中所述,当我在Webview环境中执行此操作时,onPermissionRequest()
实际上从未被调用。我很惊讶Android Webview
没有实现navigator.permission
。好吧,真遗憾。我暂时用你的变通办法。谢谢。是的,这是令人惊讶的,因为其他权限(如照相机、麦克风)正在通过webview中的PermissionRequest
工作。@NihthiyaAlthaf在您的网页html/js文件中,您要将文本复制到剪贴板的位置。@AnkitMakwana我从我的网页剪贴板中的sdk获得的复制按钮是Android WebView中未实现的权限之一,有关详细信息,请参阅Chromium源代码中的及其周围环境。