У меня есть простая страница с кнопкой, которая при нажатии использует 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
Webview: v. 81.0.4044.111
источник
onPermissionRequest()
фактически никогда не вызывался.Ответы:
В
writeText
документе API метода буфера обмена говорится, что нам нужно получитьclipboard-write
разрешение с помощью Permissions api. ноnavigator.permission
не определено в веб-просмотре, возможно, потому что они не хотят смешивать веб-разрешения с разрешениями Android OS.Есть еще один способ, с помощью которого мы можем скопировать текст в буфер обмена из веб-просмотра Android (вызвав нативный метод Java из кода JavaScript веб-просмотра).
Прежде всего включите JavaScript на веб-сайте:
Затем добавьте интерфейс javascript:
Создать метод, который будет копировать текст в буфер обмена, используя
android.content.ClipboardManager
Теперь вы можете просто вызвать вышеуказанный метод из
testClipboard
метода:источник