Mam prostą stronę z przyciskiem, który po naciśnięciu używa Async Clipboard API do pisania w schowku.
<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));
}
Działa to zarówno w Chrome, jak i Firefox, na komputerach i urządzeniach mobilnych. Jednak w Android Webview wyświetla następujący błąd:
NotAllowError: Write permission denied.
Uznałem, że muszę przeskoczyć, WebChromeClient.onPermissionRequest()
aby udzielić pozwolenia, ale dziwnie onPermissionRequest()
nie wydaje się, że został wywołany, a ten sam błąd jest nadal zgłaszany.
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());
}
Nadal pojawia się ten sam błąd:
NotAllowError: Write permission denied.
Również Logcat nic nie zarejestrował.
Podejrzewałem, że może moja aplikacja na Androida wymaga dodatkowych uprawnień, aby uzyskać dostęp do schowka, ale zgodnie z https://developer.android.com/about/versions/10/privacy/changes#clipboard-data moja aplikacja powinna mieć uprawnienia, gdy jest skupiona . Rzeczywiście działa następujący kod:
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("MyLbl", "I have permission");
clipboard.setPrimaryClip(clip);
Oświadczyłem również, że AndroidManifest.xml
w przypadku, gdy działanie w celu uzyskania pozwolenia wymaga pozwolenia:
<uses-permission android:name="android.webkit.PermissionRequest" />
To nic nie zrobiło.
Prawdopodobnie nie jest to problem z uprawnieniami na poziomie aplikacji.
Co się dzieje?
Jak mogę uzyskać wywołania interfejsu API schowka Async do pracy w Widoku sieci?
System operacyjny: Android 10 Q
Webview: v. 81.0.4044.111
źródło
onPermissionRequest()
w rzeczywistości nigdy nie został wywołany.Odpowiedzi:
Dokumentacja
writeText
metody API schowka mówi, że musimy uzyskaćclipboard-write
pozwolenie za pomocą interfejsu API uprawnień. alenavigator.permission
jest niezdefiniowany w widoku internetowym, być może dlatego, że nie chcą mieszać uprawnień internetowych z uprawnieniami systemu Android.Jest jeszcze jeden sposób, w jaki możemy skopiować tekst do schowka z Androida webview (przez wywołanie natywnej metody Java z kodu javascript webview).
Przede wszystkim włącz javascript na webview:
Następnie dodaj interfejs javascript:
Utwórz metodę, która skopiuje tekst do schowka za pomocą
android.content.ClipboardManager
Teraz możesz po prostu wywołać powyższą metodę z
testClipboard
metody:źródło
Android Webview
to nie wdrożyłonavigator.permission
. Cóż, szkoda. Na razie skorzystam z twojego obejścia. Dziękuję Ci.PermissionRequest
internetową.