공부/이모저모

v3demo.mediasoup.org Could not join the room: NotAllowedError: Permission denied 해결

JUNFUTURE 2024. 2. 7. 16:18

mediasoup demo를 위해 v3demo.mediasoup.org 에 접속하려고 시도할때
Could not join the room: NotAllowedError: Permission denied가 뜨며 접속이 안되는 경우가 있다.

특히 webView를 사용하여 접속하면 더욱이나 안되는 경우가 있는데,
이는 "카메라"와 "마이크" 권한이 없기 때문에 그렇다.

그냥 일반 브라우저(chrome.. safari..)로 접속하면 알림이 잘 떠서 권한을 가져오고,
문제없이 실행할 수 있는데

webview와 같이 app내에서 별도로 해당 링크에 접속하게 되면 권한없이 접속하여
그냥 별도의 알림없이 팅겨버리고 만다. 

 

Could not join the room: NotAllowedError: Permission denied

 

그때 아래와 같이 고쳐주면된다.
WebViewClient를 가져올때 WebChromClient를 가져와서 카메라 권한을 함께 가져오면된다.

webView.load(url)

// 웹뷰에서 카메라 권한 등을 처리할 WebChromeClient 설정
webView.setWebChromeClient(new WebChromeClient() {
    @Override
    public void onPermissionRequest(final PermissionRequest request) {
        // 카메라 권한 요청 처리
        request.grant(request.getResources());
    }
});

이렇게 해주면된다.

 

아래는 전체코드

package com.example.anton2319sdocsonwg;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.webkit.PermissionRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.appcompat.app.AppCompatActivity;

import com.wireguard.android.backend.Backend;

import java.net.URISyntaxException;


public class WebActivity extends AppCompatActivity {

    private WebView webView;
    private String url = "https://v3demo.mediasoup.org/?roomId=c8rbh53z";
    Backend backend = PersistentConnectionProperties.getInstance().getBackend();
    //자바

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.startsWith("intent://")) {
            try {
                Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                Intent existPackage = getPackageManager().getLaunchIntentForPackage(intent.getPackage());
                if (existPackage != null) {
                    startActivity(intent);
                } else {
                    Intent marketIntent = new Intent(Intent.ACTION_VIEW);
                    marketIntent.setData(Uri.parse("market://details?id=" + intent.getPackage()));
                    startActivity(marketIntent);
                }
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if (url != null && url.startsWith("market://")) {
            try {
                Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
                if (intent != null) {
                    startActivity(intent);
                }
                return true;
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
        }
        view.loadUrl(url);
        return false;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);

        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true); // JavaScript 활성화

// 웹페이지 로드
        webView.loadUrl(url);

// 웹뷰에서 페이지 로드를 처리할 WebViewClient 설정
        webView.setWebViewClient(new WebViewClient());

// 웹뷰에서 카메라 권한 등을 처리할 WebChromeClient 설정
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                // 카메라 권한 요청 처리
                request.grant(request.getResources());
            }
        });

    }
    private class WebViewClientClass extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    }
}