onPermissionRequest ()를 호출하지 않고 클립 보드 API 호출에서 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은 아무것도 기록하지 않았습니다.


내 안드로이드 앱에 클립 보드에 액세스 할 수있는 추가 권한이 필요하다고 생각했지만 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" />

이것은 아무것도하지 않았다.

따라서 앱 수준 권한에는 문제가되지 않습니다.


무슨 일이야?

Webview에서 비동기 클립 보드 API 호출을 사용하려면 어떻게해야합니까?


운영체제 : Android 10 Q

웹뷰 : v. 81.0.4044.111


비슷한 질문, 대답이 없습니다 : stackoverflow.com/questions/61429649/…
BDL


버그 일 수 있습니다.
트래비스 J

@hereticMonkey는 링크를 위해 thx하지만 아무것도 변경되지 않는다고 생각합니다. "클립 보드 데이터를 읽거나 쓰려고하면 권한이 부여되지 않은 경우 자동으로 사용자에게 권한을 묻는 메시지가 표시됩니다"라는 메시지가 표시됩니다. 이는 클립 보드를 사용하는 것 외에는 JS에서이 권한을 요청하는 명시적인 방법이 없음을 의미합니다. 믿습니다. 질문에서 언급했듯이 Webview 환경에서 그렇게 할 때 onPermissionRequest()실제로 호출 된 적이 없습니다.
cyqsimon

답변:


2

Clipboard API의 writeText메소드 문서에 따르면 clipboard-write권한 API를 사용하여 권한 을 얻어야한다고 말합니다 . 그러나 navigator.permission웹보기에서 정의되지 않았습니다. 아마도 웹 권한을 안드로이드 OS 권한과 혼합하고 싶지 않기 때문입니다.

android webview에서 webview javascript 코드에서 기본 java 메소드를 호출하여 텍스트를 클립 보드에 복사하는 방법이 하나 더 있습니다.

우선 webview에서 자바 스크립트를 활성화하십시오.

myWebView.getSettings().setJavaScriptEnabled(true);

그런 다음 자바 스크립트 인터페이스를 추가하십시오.

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.