在WebView中允许麦克风访问(权限)[Android Studio] [Java]

时间:2016-10-25 09:59:25

标签: java android android-studio webview android-permissions

我目前正致力于使用html5和webview来显示“应用程序”的音乐调谐器。我已经写了清单中所需的所有权限,我认为对于webview,还需要另一个权限。

我现在使用此https://jbergknoff.github.io/guitar-tuner/作为示例重定向页面

这是我的manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.raynordev.projectrosin">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MICROPHONE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.audio.low_latency" />
<uses-feature android:name="android.hardware.audio.pro" />
<uses-feature android:name="android.hardware.microphone" android:required="true"/>


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.raynordev.projectrosin.HomeActivity">        

  </activity>
 </application>
</manifest>

这是我的.java

public class HomeActivity extends AppCompatActivity {

private WebView wv;
private String TAG = "HomeActivity";
private static final int REQUEST_INTERNET = 200;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    WebView wv = (WebView) findViewById(R.id.webView);
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);


    wv.setWebViewClient(new WebViewClient());
    wv.setWebChromeClient(new WebChromeClient());

    wv.loadUrl("https://jbergknoff.github.io/guitar-tuner/");
 }
}

如果需要我提供更多信息,请告诉我。

谢谢大家!!

2 个答案:

答案 0 :(得分:9)

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

示例:

MainActivity

public class MainActivity extends AppCompatActivity {
    private static final int MY_PERMISSIONS_REQUEST_RECORD_AUDIO = 101;
    private ActivityMainBinding mBinding;
    private PermissionRequest myRequest;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        setWebView();
    }

    private void setWebView() {
        mBinding.webView.getSettings().setJavaScriptEnabled(true);
        mBinding.webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        mBinding.webView.setWebViewClient(new WebViewClient());

        mBinding.webView.getSettings().setSaveFormData(true);
        mBinding.webView.getSettings().setSupportZoom(false);
        mBinding.webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        mBinding.webViemBinding.webView.getSettings().setPluginState(WebSettings.PluginState.ON);


        mBinding.webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                myRequest = request;

                for (String permission : request.getResources()) {
                    switch (permission) {
                        case "android.webkit.resource.AUDIO_CAPTURE": {
                            askForPermission(request.getOrigin().toString(), Manifest.permission.RECORD_AUDIO, MY_PERMISSIONS_REQUEST_RECORD_AUDIO);
                            break;
                        }
                    }
                }
            }
        });

        mBinding.webView.loadUrl("<your url");
    }

    @Override
    public void onBackPressed() {
        if (mBinding.webView.canGoBack()) {
            mBinding.webView.goBack();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_RECORD_AUDIO: {
                Log.d("WebView", "PERMISSION FOR AUDIO");
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {


                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                    myRequest.grant(myRequest.getResources());
                    mBinding.webView.loadUrl("<your url>");

                } else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
            }
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }
    public void askForPermission(String origin, String permission, int requestCode) {
        Log.d("WebView", "inside askForPermission for" + origin + "with" + permission);

        if (ContextCompat.checkSelfPermission(getApplicationContext(),
                permission)
                != PackageManager.PERMISSION_GRANTED) {

            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    permission)) {

                // Show an expanation 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(MainActivity.this,
                        new String[]{permission},
                        requestCode);
            }
        } else {
            myRequest.grant(myRequest.getResources());
        }
    }

}

Mainfest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MICROPHONE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.audio.low_latency" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-feature android:name="android.hardware.audio.pro" />
<uses-feature android:name="android.hardware.microphone"/>      

的build.gradle:

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "myapp.example.com.myapplication"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

答案 1 :(得分:0)

总结,您需要以下组件:

  1. MODIFY_AUDIO_SETTINGS权限。
  2. 一个WebChromeClient,并监听onPermissionRequest的回调
  3. 在此回调中,检查request对象中提供的资源,创建此request对象的全局变量,进行迭代并在PermissionRequest类内查找特定权限,例如PermissionRequest.RESOURCE_VIDEO_CAPTURE转换为Manifest.permission.CAMERA权限,使用您希望的任何机制检查您的应用是否具有此权限,如果没有,请请求,如果是,请执行4。
  4. 在权限回调中,或者如果授予了权限,请使用请求对象授予权限ex。 request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE}),您一切顺利。

摘要:

webView.webChromeClient = object: WebChromeClient(){
            override fun onPermissionRequest(request: PermissionRequest?) {
                super.onPermissionRequest(request)

                webkitPermissionRequest = request

                request?.resources?.forEach {
                    when(it){
                        PermissionRequest.RESOURCE_AUDIO_CAPTURE-> {
                            askForWebkitPermission(it, Manifest.permission.RECORD_AUDIO, REQUEST_CODE_PERMISSION_AUDIO)
                        }
                        PermissionRequest.RESOURCE_VIDEO_CAPTURE->{
                            askForWebkitPermission(it, Manifest.permission.CAMERA, REQUEST_CODE_PERMISSION_CAMERA)
                        }
                    }
                }
            }
        }

private fun askForWebkitPermission(webkitPermission: String, androidPermission: String, requestCode: Int){
        val context = activity?: return
        if (context.hasPermission(androidPermission)){
            webkitPermissionRequest!!.grant(arrayOf(webkitPermission))
        }else{
            requestPermissions(arrayOf(androidPermission), requestCode)
        }
    }

希望这会有所帮助。

相同的Google示例:https://github.com/googlesamples/android-PermissionRequest