クリップボードAPI呼び出しは、onPermissionRequest()を呼び出さずにNotAllowedErrorをスローします


10

ボタンが付いたシンプルなページがあります。ボタンを押すと、非同期クリップボードAPIを使用してクリップボードに書き込みます。

<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));
}

これは、ChromeとFirefox、デスクトップとモバイルの両方で機能します。ただし、Android Webviewでは次のエラーがスローされます。

NotAllowError: Write permission denied.


WebChromeClient.onPermissionRequest()権限を付与するためにオーバーライドする必要があると考えましたが、不思議なonPermissionRequest()ことに呼び出されていないようで、同じエラーがまだスローされます。

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());
}

私はまだ同じエラーが出ます:

NotAllowError: Write permission denied.

また、Logcatは何もログに記録しませんでした。


私のAndroidアプリにはクリップボードにアクセスするための追加の権限が必要なのではないかと疑っていますがhttps://developer.android.com/about/versions/10/privacy/changes#clipboard-dataによると、アプリにはフォーカスがあるときに権限が必要です。実際、次のコードは機能します。

ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);

また、AndroidManifest.xml許可を要求するアクションに許可が必要な場合に備えて、次のことを宣言しました。

<uses-permission android:name="android.webkit.PermissionRequest" />

これは何もしませんでした。

したがって、それはおそらくアプリレベルの権限の問題ではありません。


何が起こっている?

非同期クリップボードAPI呼び出しをWebviewで機能させるにはどうすればよいですか?


OS:Android 10 Q

Webview:v。81.0.4044.111


同様の質問も回答なし:stackoverflow.com/questions/61429649/...
BDL


バグかもしれません。
Travis J

リンクの@hereticMonkey thxですが、何も変更しないと思います。「クリップボードデータの読み取りまたは書き込みを試みると、まだ付与されていない場合、ユーザーに自動的に許可を求める」とあり、クリップボードを使用する以外に、JSでこの許可を明示的に要求する方法はないことを示しています。本当だと信じている。質問で述べたように、Webview環境でそれを実行すると、onPermissionRequest()実際には呼び出されませんでした。
cyqsimon

回答:


2

クリップボードAPIのwriteTextメソッドドキュメントには、clipboard-writePermissions APIを使用してアクセス許可を取得する必要があるとあります。しかしnavigator.permission、おそらくWeb権限とAndroid OS権限を混在させたくないため、webviewで定義されていません。

Android WebViewからテキストをクリップボードにコピーする方法がもう1つあります(WebView JavaScriptコードからネイティブJavaメソッドを呼び出す)。

まず、WebビューでJavaScriptを有効にします。

myWebView.getSettings().setJavaScriptEnabled(true);

次に、javascriptインターフェースを追加します。

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");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.