0

我目前在使用geckoview. 内置 Androidwebview对我来说不是一个选项,因为我要打开的网站与 chrome 不兼容。它只能使用mozillageckoview的替代方法打开。

我遇到的问题是授予使用麦克风和录制音频的权限。因为我试图在 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权限”,然后显示我输入的日志“需要媒体权限”,网站显示“等待麦克风”

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

4

1 回答 1

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

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

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

于 2019-11-23T00:03:42.227 回答