การเรียก API ของคลิปบอร์ดโยน NotAllowedError โดยไม่เรียกใช้ onPermissionRequest ()


12

ฉันมีหน้าง่าย ๆ ด้วยปุ่มซึ่งเมื่อกดใช้ Async Clipboard 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));
}

สามารถใช้งานได้ทั้ง 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" />

นี่ไม่ได้ทำอะไรเลย

ดังนั้นจึงอาจไม่มีปัญหากับการอนุญาตระดับแอป


เกิดอะไรขึ้น?

ฉันจะรับการเรียก Async Clipboard API ให้ทำงานใน Webview ได้อย่างไร


ระบบปฏิบัติการ: Android 10 Q

มุมมองเว็บ: v. 81.0.4044.111


คำถามที่คล้ายกันไม่มีคำตอบ: stackoverflow.com/questions/61429649/ …
BDL

ฉันรู้อะไรเกี่ยวกับ Android แต่บทความนี้จาก Google หมายถึงการใช้สิทธิ์ API (ของเบราว์เซอร์)
Monkey Heretic

อาจเป็นข้อผิดพลาด
เทรวิส J

@hereticMonkey ขอบคุณสำหรับลิงก์ แต่ฉันไม่คิดว่ามันจะเปลี่ยนแปลงอะไร มันระบุว่า "การพยายามอ่านหรือเขียนข้อมูลคลิปบอร์ดจะแจ้งให้ผู้ใช้รับอนุญาตโดยอัตโนมัติหากยังไม่ได้รับอนุญาต" ซึ่งหมายความว่าไม่มีวิธีที่ชัดเจนในการขออนุญาตนี้ใน JS นอกเหนือจากเพียงแค่พยายามใช้คลิปบอร์ดซึ่งฉัน เชื่อว่าเป็นความจริง ดังที่กล่าวไว้ในคำถามเมื่อฉันทำเช่นนั้นในสภาพแวดล้อม Webview onPermissionRequest()ในความเป็นจริงไม่เคยถูกเรียก
cyqsimon

คำตอบ:


4

writeTextเอกสารวิธีการของคลิปบอร์ด API บอกว่าเราต้องได้รับclipboard-writeอนุญาตโดยใช้ Permissions api แต่navigator.permissionไม่ได้กำหนดใน webview อาจเป็นเพราะพวกเขาไม่ต้องการรวมสิทธิ์การใช้เว็บกับสิทธิ์ระบบปฏิบัติการ Android

มีอีกวิธีหนึ่งที่เราสามารถคัดลอกข้อความไปยังคลิปบอร์ดจาก android webview (โดยเรียกวิธี java พื้นเมืองจากรหัสจาวาสคริปต์ webview)

ก่อนอื่นให้เปิดใช้งานจาวาสคริปต์ในเว็บวิว:

myWebView.getSettings().setJavaScriptEnabled(true);

จากนั้นเพิ่มส่วนต่อประสาน Javascript:

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นั่นเป็นความอัปยศ ฉันจะใช้วิธีแก้ปัญหาของคุณในขณะนี้ ขอบคุณ.
cyqsimon

1
ใช่มันเป็นเรื่องที่น่าแปลกใจเพราะการอนุญาตอื่น ๆ เช่นกล้องไมโครโฟนทำงานผ่านเว็บPermissionRequestวิว
Ankit Makwana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.