2017-05-16 25 views
11

Tôi đang làm việc trên một ứng dụng di động có tính năng trò chuyện video. Tôi tìm thấy một thư viện javascript tốt đẹp cho webrtc, mà dường như tải tốt trong QWebView nhưng tôi cần phải cho phép nó để truy cập vào máy ảnh và microphone và tôi không thể tìm ra cách để làm điều đó. Có thể không? QWebEngineView có tín hiệu và khe cắm tiện dụng cho điều đó, nhưng nó không được hỗ trợ cho thiết bị di động.Giấy phép QML WebView Camera

Quyền kê khai không hoạt động như được mô tả here.

Lỗi Qt tương ứng: cant access camera and mic with QML WebView

Bất kỳ ý tưởng nào?

+0

Đối với Android, bạn chỉ có thể thêm các điều khoản cho AndroidManifest.xml - chi tiết [ở đây] (http://doc.qt.io/qtcreator/creator-deploying-android.html) – Skynet

+1

@ Derek, Tôi vui mừng khi biết, bạn đã tìm ra giải pháp cho điều này, bởi vì tôi đang ở trong tình trạng tương tự. Cảm ơn trước. –

Trả lời

5

Giấy phép kê khai không hoạt động đối với Android 22>. Vì vậy, trong trường hợp của bạn, bạn cần phải truy cập thời gian chạy cho phép. Thực hiện điều này trong Java.

if (ContextCompat.checkSelfPermission(thisActivity, 
     Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

    // Should we show an explanation? 
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
      Manifest.permission.READ_CONTACTS)) { 

     // Show an explanation to the user *asynchronously* -- don't block 
     // this thread waiting for the user's response! After the user 
     // sees the explanation, try again to request the permission. 

    } else { 

     // No explanation needed, we can request the permission. 

     ActivityCompat.requestPermissions(thisActivity, 
       arrayOf(Manifest.permission.READ_CONTACTS), 
       MY_PERMISSIONS_REQUEST_READ_CONTACTS) 

     // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
     // app-defined int constant. The callback method gets the 
     // result of the request. 
    } 
} 

Xem từ Official Doc. Nhưng trong trường hợp của bạn, tôi nghĩ rằng bạn cần mức độ thông qua NDK, để gọi hành vi tương tự. Nó cũng được mô tả here.

+0

cảm ơn bạn đã cập nhật. Câu trả lời ở trên liên quan đến Quyền ứng dụng. Vấn đề của chúng tôi là w.r.t. WebView yêu cầu truy cập Phương tiện từ chức năng js (Nội dung Web). Android Native java thực hiện việc này bằng cách sử dụng lớp Hỗ trợ 'WebCromeClient' (android.webkit.WebChromeClient). Vui lòng kiểm tra bình luận của tôi cho câu trả lời của Hubi. – Swapnil

5

Qt đã triển khai mẫu quyền của Android trong phiên bản 5.10.

Xem tại đây: http://doc.qt.io/qt-5/qtandroid.html.

Các chức năng bạn phải sử dụng bao gồm:

  • checkPermission
  • requestPermissions
  • requestPermissionsSync

Nếu bạn muốn truy cập vào một máy ảnh và micro, bạn phải yêu cầu sự cho phép trước khi sử dụng . Ví dụ:

QStringList perms; 
perms << "android.permission.CAMERA" << "android.permission.RECORD_AUDIO"; 
QtAndroid::checkPermissions(perms, [](const PermissionResultMap& resMap) { 
    foreach(const QString &key, resMap.keys()) { 
     qDebug() << "Result of permission" << key << ":" << resMap[key]; 
    } 
}); 
+0

Thực ra, chúng tôi muốn Thông báo cho ứng dụng máy chủ lưu trữ rằng nội dung web đang yêu cầu quyền truy cập vào các tài nguyên được chỉ định và cấp cho nó. Android bản địa (java) 'WebView' (android.webkit.WebView) cung cấp chức năng này bằng cách sử dụng 'WebCromeClient' (android.webkit.WebChromeClient) và có chức năng 'onPermissionRequest()', qt WebView có chức năng tương tự hay không. Khi hàm Js yêu cầu truy cập Media. – Swapnil

+0

Không trực tiếp, nhưng có lẽ điều này có thể giúp: http://doc.qt.io/qt-5/qtwebchannel-index.html – Hubi

2

Chúng tôi đã giải quyết lỗi QT này bằng cách biên dịch lại mã QT và cập nhật các lọ tương ứng. Chúng tôi đã tải về mã nguồn QT cho Android bằng cách sử dụng công cụ bảo trì. Trong khi đi qua mã nguồn QT, chúng tôi thấy rằng do một số lý do các nhà phát triển Qt không ghi đè onPermissionRequest() của WebCromeClient do đó WebView không cho phép truy cập Phương tiện vào các chức năng JS. Vui lòng làm theo các bước sau để giải quyết vấn đề.

  1. Tải về QT Mã nguồn.

  2. Cập nhật mã trong QtAndroidWebViewController.java. Lớp học này được đặt tại ~/Qt/5.10.0/Src/qtwebview/src/jar/src/org/qtproject/qt5/android/view. Thêm chức năng sau vào lớp bên trong QtAndroidWebChromeClient.

    @Override void công khai onPermissionRequest (PermissionYêu cầu yêu cầu) { request.grant (request.getResources()); }

  3. Tùy thuộc vào SDK Android của bạn, bạn có thể cần phải nhận xét/thay đổi chức năng không dùng nữa cho các phiên bản Android cũ hơn. Ngoài ra, bạn có thể thay đổi một vài phương pháp trong QtAndroidWebViewClient theo các phiên bản mới của Android.

  4. Sau đó, dự án nhập khẩu ~/Qt/5.10.0/Src/qtwebview Trong tác giả Qt của bạn, Bạn có thể cần một số kiến ​​thức Java để giải quyết các vấn đề (nếu bạn nhận được một số vấn đề xây dựng)

  5. Tùy thuộc vào đường dẫn thư mục xây dựng của bạn Cài đặt, dự án xây dựng thành công sẽ tạo hai lọ trong đường dẫn build_folder/jarQtAndroidWebView.jar, QtAndroidWebView-bundled.jar.

  6. Thay thế các bình trong đường dẫn ~/Qt/5.10.0/android_armv7/jar/.

  7. Bây giờ xây dựng lại (Clean build) dự án ban đầu của bạn, đang sử dụng WebView và vấn đề được giải quyết.

    Lưu ý: Đường dẫn có thể thay đổi tùy theo đường dẫn tải xuống QT và hệ điều hành, nhưng có thể thay thế bình xây dựng trên bất kỳ hệ thống nào (như lọ java).

    Nếu QT giải quyết vấn đề này trong bản phát hành tiếp theo, chúng tôi có thể thay thế các lọ đã cập nhật.