क्लिपबोर्ड एपीआई कॉल फेंकता है NotAllowedError onPermissionRequest () को लागू किए बिना


12

मेरे पास एक बटन के साथ एक सरल पृष्ठ है, जिसे दबाए जाने पर क्लिपबोर्ड पर लिखने के लिए Async क्लिपबोर्ड 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));
}

यह क्रोम और फ़ायरफ़ॉक्स, डेस्कटॉप और मोबाइल दोनों पर काम करता है। हालाँकि Android वेबव्यू पर यह निम्न त्रुटि देता है:

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" />

इसने कुछ नहीं किया।

तो यह शायद ऐप स्तर की अनुमति के साथ एक मुद्दा नहीं है।


क्या हो रहा है?

वेबव्यू में काम करने के लिए मैं Async क्लिपबोर्ड API कॉल कैसे प्राप्त कर सकता हूं?


OS: Android 10 Q

वेबव्यू: v। 81.0.4044.111


इसी तरह के सवाल, भी कोई जवाब नहीं: stackoverflow.com/questions/61429649/…
BDL


बग हो सकता है।
ट्रैविस जे

लिंक के लिए @hereticMonkey thx लेकिन मुझे नहीं लगता कि यह कुछ भी बदलता है। यह बताता है कि "क्लिपबोर्ड डेटा को पढ़ने या लिखने का प्रयास स्वचालित रूप से अनुमति के लिए उपयोगकर्ता को संकेत देगा यदि यह पहले से ही प्रदान नहीं किया गया है", इसका मतलब यह है कि जेएस में इस अनुमति का अनुरोध करने का कोई स्पष्ट तरीका नहीं है, केवल क्लिपबोर्ड का उपयोग करने की कोशिश के अलावा, जो मैं। विश्वास सच है। जैसा कि प्रश्न में उल्लेख किया गया है, जब मैं ऐसा करता हूं कि एक वेबव्यू वातावरण में, onPermissionRequest()वास्तव में कभी भी आह्वान नहीं किया गया है।
साइबरसिम

जवाबों:


4

क्लिपबोर्ड एपीआई की writeTextविधि डॉक्स कहती है, हमें clipboard-writeअनुमतियाँ एपीआई का उपयोग करके अनुमति प्राप्त करने की आवश्यकता है । लेकिन navigator.permissionवेबव्यू में अपरिभाषित है, हो सकता है क्योंकि वे Android ओएस अनुमतियों के साथ वेब अनुमतियों को मिश्रण नहीं करना चाहते हैं।

एक और तरीका है जिससे हम टेक्स्ट को एंड्रॉइड वेबव्यू से क्लिपबोर्ड पर कॉपी कर सकते हैं (वेबवार्ता जावास्क्रिप्ट कोड से देशी जावा विधि को कॉल करके)।

सबसे पहले वेबवार्ता पर जावास्क्रिप्ट सक्षम करें:

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");
}

मुझे आश्चर्य है कि Android Webviewलागू नहीं किया navigator.permission। खैर, यह शर्म की बात है। मैं आपके वर्कअराउंड समय का उपयोग करूंगा। धन्यवाद।
साइबरसिम

1
हां, यह आश्चर्य की बात है, क्योंकि कैमरा, माइक्रोफोन जैसी अन्य अनुमतियां PermissionRequestवेबव्यू के माध्यम से काम कर रही हैं ।
अंकित मकवाना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.