【问题标题】:Managing AndroidPermissionRequest and MediaPermissionRequest using Geckoview Android使用 Geckoview Android 管理 AndroidPermissionRequest 和 MediaPermissionRequest
【发布时间】:2019-05-28 05:34:36
【问题描述】:

我目前在使用 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 Permission Granted',然后显示我输入的日志 'Media Permission Needed',网站显示 '等待麦克风'

我还检查了我手机上的应用程序,它已经拥有麦克风权限。

【问题讨论】:

    标签: android geckodriver gecko geckoview


    【解决方案1】:

    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

    onMediaPermissionaudio 参数包含所有音频源的列表(很可能您只有一个,麦克风),您可以使用它来接受正确音频源呼叫的提示

    @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]);
    }
    

    请注意,如果您还需要视频,您可以使用 video 参数和适当的视频源执行相同的操作。

    要确定哪个是麦克风,您可以使用这个 sn-p 作为示例(查找 SOURCE_MICROPHONEhttps://searchfox.org/mozilla-central/source/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java#1201-1223

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      相关资源
      最近更新 更多