2017-05-16 5 views
11

Je travaille sur une application mobile dotée d'une fonction de conversation vidéo. J'ai trouvé une belle bibliothèque javascript pour webrtc, qui semble se charger très bien dans QWebView mais je dois lui donner la permission d'accéder à la caméra et au microphone et je n'arrive pas à comprendre comment faire ça. C'est possible? QWebEngineView a un signal pratique et un emplacement pour cela, mais ce n'est pas pris en charge pour mobile.Autorisation de caméra QML WebView

Les autorisations de manifeste ne fonctionnent pas comme décrit here.

correspondant Qt bug: cant access camera and mic with QML WebView

Toutes les idées?

+0

pour Android, vous pouvez simplement ajouter les autorisations au AndroidManifest.xml - détails [ici] (http://doc.qt.io/qtcreator/creator-deploying-android.html) – Skynet

+1

@Derek, Je suis heureux de savoir, avez-vous trouvé une solution pour cela, parce que je suis dans la même situation. Merci d'avance. –

Répondre

5

L'autorisation de manifeste ne fonctionne pas pour Android 22>. Donc, dans votre cas, vous devez accéder à l'autorisation d'exécution. Effectuer cela en 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. 
    } 
} 

Voir à partir de Official Doc. Mais dans votre cas, je pense que vous avez besoin d'un niveau via NDK, pour appeler le même comportement. Il est également décrit here.

+0

merci pour la mise à jour. La réponse ci-dessus concerne la permission d'application. Notre problème est w.r.t. WebView demandant l'accès au média à partir de la fonction js (Contenu Web). Android Native Java le fait en utilisant la classe de soutien 'WebCromeClient' (android.webkit.WebChromeClient). S'il vous plaît vérifier mon commentaire pour la réponse de Hubi. – Swapnil

5

Qt a implémenté le modèle d'autorisation d'Android dans la version 5.10.

Voir ici: http://doc.qt.io/qt-5/qtandroid.html.

Les fonctions que vous devez utiliser sont:

  • checkPermission
  • requestPermissions
  • requestPermissionsSync

Si vous souhaitez accéder à une caméra et d'un microphone, vous devez demander les autorisations avant d'utiliser . Exemple:

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

En fait, nous voulons informer l'application hôte que le contenu Web demande l'autorisation d'accéder aux ressources spécifiées et de l'accorder. Natif Android (java) 'WebView' (android.webkit.WebView) fournit cette fonctionnalité en utilisant 'WebCromeClient' (android.webkit.WebChromeClient) et a la fonction 'onPermissionRequest()', qt WebView a des fonctionnalités similaires. Lorsque la fonction Js demande l'accès au média. – Swapnil

+0

Pas directement, mais peut-être cela peut vous aider: http://doc.qt.io/qt-5/qtwebchannel-index.html – Hubi

2

Nous avons résolu ce bug QT par recompiler le code QT et des pots correspondant de mise à jour. Nous avons téléchargé le code source QT pour Android en utilisant l'outil de maintenance. Tout en passant par le code source QT, nous avons constaté que, pour une raison quelconque, les développeurs Qt ne remplacent pas onPermissionRequest() de WebCromeClient en raison de laquelle WebView ne permet pas l'accès aux médias aux fonctions JS. Veuillez suivre les étapes suivantes pour résoudre le problème.

  1. Téléchargement QT Code source.

  2. Mettre à jour le code dans QtAndroidWebViewController.java. Cette classe est située au ~/Qt/5.10.0/Src/qtwebview/src/jar/src/org/qtproject/qt5/android/view. Ajouter la fonction suivante à la classe interne QtAndroidWebChromeClient.

    @Override public void onPermissionRequest (demande PermissionRequest) { request.grant (request.getResources()); Selon votre sdk Android, vous devrez peut-être commenter/modifier les fonctions obsolètes pour les anciennes versions d'Android. Aussi, vous pouvez changer quelques-unes des méthodes en QtAndroidWebViewClient selon les nouvelles versions de Android.

  3. Ensuite projet d'importation ~/Qt/5.10.0/Src/qtwebview Dans votre créateur de Qt, vous devrez peut-être des connaissances Java pour résoudre les problèmes (si vous avez des problèmes de construction)

  4. Selon votre chemin de dossier de construction Paramètres, projet de construction réussie va générer deux pots dans le chemin build_folder/jarQtAndroidWebView.jar, QtAndroidWebView-bundled.jar.

  5. Remplacer les bocaux dans le chemin ~/Qt/5.10.0/android_armv7/jar/.

  6. Maintenant, reconstruisez (Build propre) votre projet d'origine, qui utilise WebView et le problème est résolu.

    Remarque: Le chemin peut changer en fonction du chemin de téléchargement QT et du système d'exploitation, mais le fichier jar peut être remplacé sur n'importe quel système (en tant que jar java).

    Si QT résout ce problème dans la prochaine version, nous pouvons remplacer les jars mis à jour.