2017-05-16 12 views
11

私はビデオチャット機能を備えたモバイルアプリを開発中です。 QWebViewでうまくロードされているように見えるwebrtc用の素晴らしいjavascriptライブラリを見つけましたが、カメラとマイクにアクセスする許可を与える必要があり、それを行う方法を理解できません。出来ますか? QWebEngineViewには便利な信号とスロットがありますが、携帯端末ではサポートされていません。QML WebViewカメラの権限

マニフェストのアクセス許可は、hereと記載されているように機能しません。

対応Qtのバグ:cant access camera and mic with QML WebView

任意のアイデア?

+0

、あなただけのAndroidManifest.xmlに権限を追加することができます - [こちら]詳細(http://doc.qt.io/qtcreator/creator-deploying-android.html) – Skynet

+1

@Derek、私は知ってうれしいです、私は同じ状況にあるので、あなたはこれのための解決策を見つけましたか?前もって感謝します。 –

答えて

5

Android 22のマニフェスト権限は動作しません。したがって、あなたの場合は、実行時アクセス権にアクセスする必要があります。これを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. 
    } 
} 

Official Docからご覧ください。しかし、あなたのケースでは、同じ行動を呼び出すためにNDK経由でレベルが必要だと思います。また、hereと記載されています。

+0

ありがとうございました。上記の回答は、アプリケーションの許可に関するものです。私たちの問題はw.r.tです。 WebViewがjs関数(Webコンテンツ)からMediaアクセスを要求しています。 Androidネイティブjavaは、サポートクラス 'WebCromeClient'(android.webkit.WebChromeClient)を使用してこれを行います。 Hubiの回答に対する私のコメントをチェックしてください。 – Swapnil

5

Qtはバージョン5.10でAndroidの許可モデルを実装しています。

ここをクリックしてください:http://doc.qt.io/qt-5/qtandroid.htmlあなたが使用する必要があり

機能は以下のとおりです。

  • のcheckPermission
  • requestPermissions
  • requestPermissionsSync

あなたがカメラやマイクにアクセスする場合は、使用する前に許可を要求する必要があり。 例:

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

実際には、ホストアプリケーションに、Webコンテンツが指定されたリソースへのアクセス権を要求してそれを許可していることを通知する必要があります。ネイティブAndroid(java) 'WebView'(android.webkit.WebView)は 'WebCromeClient'(android.webkit.WebChromeClient)を使用してこの機能を提供し、 'onPermissionRequest()'機能を備えています。 Jsがメディアアクセスを要求するとき。 – Swapnil

+0

直接ではありませんが、おそらくこれが役に立ちます: http://doc.qt.io/qt-5/qtwebchannel-index.html – Hubi

2

我々はQTコードを再コンパイルし、対応するjarファイルを更新することにより、このQTバグを解決しました。メンテナンスツールを使用してAndroid用のQTソースコードをダウンロードしました。 Qtのソースコードを見ているうちに、何らかの理由でQtの開発者がonPermissionRequest()WebCromeClientを上書きしていないため、WebViewがJS機能へのメディアアクセスを許可していないことがわかりました。問題を解決するには、次の手順に従ってください。

  1. ダウンロードQTソースコード。

  2. QtAndroidWebViewController.javaの更新コード。このクラスは〜/ Qt/5.10.0/Src/qtwebview/src/jar/src/org/qtproject/qt5/android/viewにあります。 内部クラスQtAndroidWebChromeClientに以下の関数を追加します。

    @Override public void onPermissionRequest(PermissionRequest request){ request.grant(request.getResources()); }

  3. あなたのAndroid SDKに応じて、古いバージョンのAndroidではコメント/変更する必要があります( )。また Androidの新しいバージョンごとに いくつかの方法をQtAndroidWebViewClientに変更することができます。

  4. [インポートプロジェクト〜/ QT/5.10.0/srcに応じ

  5. を(あなたには、いくつかのビルドの問題を取得する場合)/ qtwebviewあなたのQt Creatorで、あなたは問題を解決するために、いくつかのJavaの知識が必要になる場合がありますあなたのビルドフォルダのパス設定、成功したビルドプロジェクトは、パスに2つのjarファイルを生成しますbuild_folder/jarQtAndroidWebView.jarQtAndroidWebView-bundled.jar

  6. パス内のジャーを交換してください。〜/ Qt/5.10.0/android_armv7/jar/

  7. WebViewを使用していて元のプロジェクトを再ビルドして問題を解決しました。

    注:QTのダウンロードパスとオペレーティングシステムによってパスが変わることがありますが、ビルドされたjarは任意のシステム(javaジャーとして)に置き換えることができます。

    QTが次のリリースでこの問題を解決した場合、更新されたjarsを置き換えることができます。 Android用