2017-05-16 92 views
11

Pracuję nad aplikacją mobilną z funkcją czatu wideo. Znalazłem ładną bibliotekę javascript dla Webrtc, która wydaje się ładować dobrze w QWebView, ale muszę dać jej pozwolenie na dostęp do kamery i mikrofonu i nie mogę wymyślić, jak to zrobić. Czy to możliwe? QWebEngineView ma poręczny sygnał i slot na to, ale nie jest obsługiwany dla urządzeń mobilnych.Aparat QML WebView Camera Permission

Oczywista uprawnienia nie działają tak jak opisano here.

Odpowiadający Qt bug: cant access camera and mic with QML WebView

Jakieś pomysły?

+0

dla Androida, można po prostu dodać uprawnienia do AndroidManifest.xml - Szczegóły [tutaj] (http://doc.qt.io/qtcreator/creator-deploying-android.html) – Skynet

+1

@Derek, Cieszę się, że wiedziałem, czy znalazłeś rozwiązanie, ponieważ jestem w tej samej sytuacji. Z góry dziękuję. –

Odpowiedz

5

Manifest zezwolenie nie działa na Androidzie 22>. W twoim przypadku musisz uzyskać dostęp do uprawnień środowiska wykonawczego. Wykonanie tego w Javie.

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. 
    } 
} 

Zobacz od Official Doc. Ale w twoim przypadku, myślę, że potrzebujesz poziomu poprzez NDK, aby wywołać to samo zachowanie. Jest również opisany here.

+0

dzięki za aktualizację. Powyższa odpowiedź dotyczy pozwolenia na korzystanie z aplikacji. Nasz problem to w.r.t. WebView pyta o dostęp do mediów z funkcji js (zawartość internetowa). Android Native java robi to za pomocą klasy Supporting "WebCromeClient" (android.webkit.WebChromeClient). Proszę sprawdzić mój komentarz do odpowiedzi Hubi. – Swapnil

5

Qt wdrożyło model uprawnień Androida w wersji 5.10.

Zobacz tutaj: http://doc.qt.io/qt-5/qtandroid.html.

Funkcje trzeba użyć to:

  • checkPermission
  • requestPermissions
  • requestPermissionsSync

Jeśli chcesz uzyskać dostęp do kamery i mikrofonu trzeba zażądać uprawnienia przed użyciem . Przykład:

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

Właściwie chcemy powiadomić aplikację hosta, że ​​treść internetowa żąda pozwolenia na dostęp do określonych zasobów i udzielenie jej. Macierzysty Android (java) "WebView" (android.webkit.WebView) zapewnia tę funkcję za pomocą "WebCromeClient" (android.webkit.WebChromeClient) i ma funkcję "onPermissionRequest()", czy qt WebView ma podobną funkcjonalność. Gdy funkcja Js prosi o dostęp do multimediów. – Swapnil

+0

Nie bezpośrednio, ale być może może to pomóc: http://doc.qt.io/qt-5/qtwebchannel-index.html – Hubi

2

Rozwiązaliśmy ten problem przez QT rekompilacji kodu QT i aktualizowanie odpowiadające słoiki. Pobieramy kod źródłowy QT dla Androida za pomocą narzędzia Konserwacja. Przechodząc przez kod źródłowy QT okazało się, że z jakiegoś powodu programiści Qt nie przesyłają onPermissionRequest() z WebCromeClient, z powodu których WebView nie pozwala na dostęp mediów do funkcji JS. Wykonaj następujące kroki, aby rozwiązać problem.

  1. Pobierz kod źródłowy QT.

  2. kod Update w QtAndroidWebViewController.java. Ta klasa znajduje się pod numerem ~/Qt/5.10.0/Src/qtwebview/src/jar/src/org/qtproject/qt5/android/view. Dodaj następującą funkcję do wewnętrznej klasy QtAndroidWebChromeClient.

    @Override publiczny void onPermissionRequest (żądanie żądania Permission) { request.grant (request.getResources()); }

  3. W zależności od Twojego systemu Android, możesz potrzebować komentarza/zmiany przestarzałych funkcji dla starszych wersji Androida. Ponadto można zmienić kilka metod w QtAndroidWebViewClient według nowych wersji systemu Android.

  4. Następnie projekt import ~/Qt/5.10.0/src/qtwebview W swojej twórcy Qt, może zaistnieć potrzeba trochę wiedzy Java, aby rozwiązać problemy (jeśli masz jakieś problemy kompilacji)

  5. zależności od ścieżka do folderu kompilacji Ustawienia, pomyślny projekt kompilacji wygeneruje dwa słoiki w ścieżce plik_konfiguracyjny/jarQtAndroidWebView.jar, QtAndroidWebView-bundled.jar.

  6. Wymień słoików w ścieżce ~/Qt/5.10.0/android_armv7/JAR/.

  7. Teraz przebuduj (Wyczyść kompilację) oryginalny projekt, który korzysta z WebView, a problem rozwiązany.

    Uwaga: Ścieżka może ulec zmianie w zależności od odstępu QT Pobierz ścieżkę i systemu operacyjnego, ale zbudowany słoik może być zastąpiony w dowolnym systemie (jak słoików Java).

    Jeśli QT rozwiązuje ten problem w następnym wydaniu, możemy zastąpić zaktualizowane słoiki.