使用Geckoview Android管理AndroidPermissionRequest和MediaPermissionRequest

时间:2019-05-28 05:34:36

标签: android geckodriver gecko

我目前在使用geckoview管理请求时遇到问题。内置webview的Android对我来说不是一个选择,因为我要打开的网站与chrome不兼容。只能使用mozilla打开它,因此geckoview是我的选择。

我遇到的问题是授予使用麦克风和录制音频的权限。因为我要在geckoview中打开的网站记录了音频(语音收集)。

我是android和geckoview的新手,这就是为什么我使用的指南是这个项目https://searchfox.org/mozilla-central/source/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java

我能够显示请求权限并接受它,但是看来我的应用程序没有存储该权限结果。目前,我正在尝试将程序访问此网站https://www.onlinemictest.com

这是我的PermissionDelegate

private class ExamplePermissionDelegate implements GeckoSession.PermissionDelegate {
    public int androidPermissionRequestCode = 1;
    @Override
    public void onAndroidPermissionsRequest(GeckoSession session, String[] permissions, Callback callback)
    {
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED){
            Log.i(TAG, "Android Permission Needed");
            requestPermissions(permissions, androidPermissionRequestCode);
            callback = new ExamplePermissionCallback();
            callback.grant();
        }
        else{
            Log.i(TAG, "Android Permission Granted");
            callback.grant();
        }
    }
    @Override
    public void onContentPermissionRequest (GeckoSession session, String uri, int type, String access, Callback callback)
    {
        Log.i(TAG, "Content Permission Needed");
    }
    @Override
     public void onMediaPermissionRequest (GeckoSession session, String uri, MediaSource[] video, MediaSource[] audio, MediaCallback callback)
    {
        Log.i(TAG, "Media Permission Needed");   
        }
    }

这是我的PermissionDelegateCallback

 public class ExamplePermissionCallback implements GeckoSession.PermissionDelegate.Callback{
    @Override
    public void grant() {
        int permission = ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.RECORD_AUDIO);
        if (permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.RECORD_AUDIO},
                    RECORD_REQUEST_CODE);}
    }
    @Override
    public void reject() {
    }
}

结果显示为'已授予Android权限',此后,它显示我输入的日志为'需要媒体权限',网站显示为等待麦克风”

我还检查了手机上的应用程序,它已经具有麦克风许可。

1 个答案:

答案 0 :(得分:0)

GeckoView具有两个级别的权限:

  • Android授予您的应用的Android级权限,您似乎请求正确
  • GeckoView授予特定网页的内容级别权限,但在您的示例中未授予。

简而言之,仅仅因为您的应用有权收听麦克风,并不意味着您在GeckoView中打开的所有网页都可以访问麦克风。

当页面请求媒体许可时,您会收到onMediaPermission回调,您需要使用callback.grant接受该回调,此处是一个示例:https://searchfox.org/mozilla-central/rev/3483fb259b4edbe4594cfcc3911db97d5441b67d/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/BasicGeckoViewPrompt.java#927

audio的{​​{1}}自变量包含所有音频源(很可能只有一个麦克风)的列表,可用于接受正确音频源的提示打电话

onMediaPermission

请注意,如果您还需要视频,则可以使用@Override public void onMediaPermissionRequest( GeckoSession session, String uri, MediaSource[] video, MediaSource[] audio, MediaCallback callback) { // Find out which audio source is the microphone final int MICROPHONE_INDEX = ...; // Grant the request callback.grant(null, audio[MICROPHONE_INDEX]); } 参数和适当的视频源来做同样的事情。

要弄清楚哪一个是麦克风,您可以使用以下代码段作为示例(查找videohttps://searchfox.org/mozilla-central/source/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java#1201-1223