首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在WebView中允许麦克风访问(权限) [Android Studio] [Java]

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

Stack Overflow用户
提问于 2016-10-25 17:59:25
回答 2查看 17.7K关注 0票数 7

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

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

这是我的manifest.xml

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
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/");
 }
}

如果需要我提供更多信息,请让我知道。

谢谢大家!!

EN

回答 2

Stack Overflow用户

发布于 2017-11-21 18:05:58

代码语言:javascript
运行
复制
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

示例:

MainActivity

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
<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:

代码语言:javascript
运行
复制
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'
        }
    }
票数 28
EN

Stack Overflow用户

发布于 2019-02-14 19:21:49

总而言之,您需要以下组件:

onPermissionRequest

  • Inside
  1. MODIFY_AUDIO_SETTINGS权限。
  2. 此回调的WebChromeClient和侦听回调,检查进入request对象的资源,创建此request对象的全局变量,在PermissionRequest类中迭代并查找特定权限,例如。PermissionRequest.RESOURCE_VIDEO_CAPTURE转换为Manifest.permission.CAMERA权限,使用任何你想要的机制检查你的应用程序是否有这个权限,如果没有,请求,如果是这样做4.
  3. 在权限回调中,或者如果权限被授予,使用request对象来授予权限例如。request.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE}),你就可以走了

代码片段:

代码语言:javascript
运行
复制
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)
        }
    }

希望这能有所帮助。

谷歌的示例:https://github.com/googlesamples/android-PermissionRequest

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40236925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档