ক্লিপবোর্ডের এপিআই কল কলপ্রেমেশনআরকেস্ট () না করেই নোটহেল্ড এয়ারকে ছুড়ে ফেলে


12

আমার কাছে একটি বোতাম সহ একটি সহজ পৃষ্ঠা রয়েছে, যা টিপলে, ক্লিপবোর্ডে লেখার জন্য অ্যাসিঙ্ক ক্লিপবোর্ড এপিআই ব্যবহার করে।

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

এটি ক্রোম এবং ফায়ারফক্স, ডেস্কটপ এবং মোবাইল উভয় ক্ষেত্রেই কাজ করে। তবে অ্যান্ড্রয়েড ওয়েবভিউতে এটি নিম্নলিখিত ত্রুটিটি ছুড়ে ফেলেছে:

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.

এছাড়াও লগক্যাট কোনও লগইন হয়নি।


আমার সন্দেহ হয়েছিল যে আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিকে ক্লিপবোর্ডটি অ্যাক্সেস করার জন্য অতিরিক্ত অনুমতি প্রয়োজন, কিন্তু 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 ক্লিপবোর্ড এপিআই কল পেতে পারি?


ওএস: অ্যান্ড্রয়েড 10 কিউ

ওয়েবভিউ: বনাম 81.0.4044.111


অনুরূপ প্রশ্ন, এরও কোনও উত্তর নেই: stackoverflow.com/questions/61429649/…
বিডিএল

আমি অ্যান্ড্রয়েড সম্পর্কে কিছুই জানি না, তবে গুগলের এই নিবন্ধটি অনুমতিগুলি API (ব্রাউজারের) ব্যবহার করে
হেরেটিক বানর

একটি বাগ হতে পারে।
ট্র্যাভিস জে

লিঙ্কটির জন্য @hereticMonkey thx কিন্তু আমার মনে হয় না এটি কোনও পরিবর্তন করে। এতে বলা হয়েছে "ক্লিপবোর্ডের ডেটা পড়ার বা লেখার চেষ্টাটি ব্যবহারকারীকে স্বয়ংক্রিয়ভাবে অনুমতি দেওয়ার জন্য অনুরোধ জানাবে", বোঝায় যে ক্লিপবোর্ডটি ব্যবহারের চেষ্টা ব্যতিরেকে জেএসে এই অনুমতিটির অনুরোধ করার কোনও সুস্পষ্ট উপায় নেই, যা আমি বিশ্বাস সত্য। প্রশ্নে উল্লিখিত হিসাবে, যখন আমি এটি একটি ওয়েবভিউ পরিবেশে করি, onPermissionRequest()আসলে কখনই অনুরোধ করা হয়নি।
cyqsimon

উত্তর:


4

ক্লিপবোর্ডের এপিআইয়ের writeTextপদ্ধতি ডক্স বলছে, আমাদের clipboard-writeঅনুমতি এপিআই ব্যবহার করে অনুমতি নেওয়া দরকার । তবে navigator.permissionওয়েবভিউতে এটি অপরিবর্তিত রয়েছে, কারণ তারা অ্যান্ড্রয়েড ওএস অনুমতিগুলির সাথে ওয়েব অনুমতিগুলি মেশাতে চান না।

আরও একটি উপায় আছে যার মাধ্যমে আমরা অ্যান্ড্রয়েড ওয়েবভিউ থেকে ক্লিপবোর্ডে টেক্সট অনুলিপি করতে পারি (ওয়েবভিউ জাভাস্ক্রিপ্ট কোড থেকে নেটিভ জাভা পদ্ধতি কল করে)।

সবার আগে ওয়েবভিউতে জাভাস্ক্রিপ্ট সক্ষম করুন:

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ভিউয়ের মধ্য দিয়ে কাজ করছে ।
অঙ্কিত মাকওয়ানা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.