Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 剪贴板API调用在不调用onPermissionRequest()的情况下抛出NotAllowedError_Javascript_Android_Android Webview_Clipboard - Fatal编程技术网

Javascript 剪贴板API调用在不调用onPermissionRequest()的情况下抛出NotAllowedError

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

我有一个带有按钮的简单页面,按下按钮时,使用异步剪贴板API写入剪贴板


测试剪贴板
函数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源代码中的及其周围环境。