Tôi có một trang đơn giản với một nút, khi nhấn, sử dụng API Clipboard Async để ghi vào bảng tạm.
<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));
}
Điều này hoạt động trên cả Chrome và Firefox, máy tính để bàn và thiết bị di động. Tuy nhiên, trên Android Webview, nó đưa ra lỗi sau:
NotAllowError: Write permission denied.
Tôi hình dung mình cần ghi đè WebChromeClient.onPermissionRequest()
để cấp quyền, nhưng kỳ lạ onPermissionRequest()
là dường như không được gọi, và lỗi tương tự vẫn được đưa ra.
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());
}
Tôi vẫn nhận được cùng một lỗi:
NotAllowError: Write permission denied.
Ngoài ra Logcat đăng nhập không có gì.
Tôi nghi ngờ có thể Ứng dụng Android của tôi yêu cầu quyền truy cập bổ sung để truy cập vào bảng tạm, nhưng theo https://developer.android.com/about/versions/10/privacy/changes#clipboard-data , Ứng dụng của tôi nên có quyền khi tập trung vào . Thật vậy, đoạn mã sau hoạt động:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);
Tôi cũng đã tuyên bố như sau trong AndroidManifest.xml
trường hợp hành động yêu cầu sự cho phép cần có sự cho phép:
<uses-permission android:name="android.webkit.PermissionRequest" />
Điều này không làm gì cả.
Vì vậy, nó có thể không phải là một vấn đề với sự cho phép cấp độ ứng dụng.
Chuyện gì đang xảy ra vậy?
Làm cách nào tôi có thể nhận các lệnh gọi API Clipboard Async để hoạt động trong Webview?
HĐH: Android 10 Q
Webview: câu 81.0.4044.111
onPermissionRequest()
trên thực tế chưa bao giờ được gọi.