У мене проста сторінка з кнопкою, яка при натисканні використовує API Async Clipboard для запису в буфер обміну.
<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 Async Clipboard працювати в Webview?
ОС: Android 10 Q
Веб-перегляд: v. 81.0.4044.111
onPermissionRequest()
насправді ніколи не використовувався.