mediasoup demo를 위해 v3demo.mediasoup.org 에 접속하려고 시도할때
Could not join the room: NotAllowedError: Permission denied가 뜨며 접속이 안되는 경우가 있다.
특히 webView를 사용하여 접속하면 더욱이나 안되는 경우가 있는데,
이는 "카메라"와 "마이크" 권한이 없기 때문에 그렇다.
그냥 일반 브라우저(chrome.. safari..)로 접속하면 알림이 잘 떠서 권한을 가져오고,
문제없이 실행할 수 있는데
webview와 같이 app내에서 별도로 해당 링크에 접속하게 되면 권한없이 접속하여
그냥 별도의 알림없이 팅겨버리고 만다.
그때 아래와 같이 고쳐주면된다.
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;
}
}
}
'공부 > 이모저모' 카테고리의 다른 글
인공위성 펌웨어 해킹을 위한 인공위성관련 용어정리 (0) | 2024.03.11 |
---|---|
C++ 클래스 안의 멤버함수 const 키워드 (0) | 2024.02.13 |
JavaScript에서의 null 처리(null과 undefined의 차이 / Object가 비어있는지 확인하는 방법) (0) | 2024.01.30 |
javascript == 와 === 의 차이 (0) | 2024.01.30 |
Ubuntu 환경변수 총정리 (/etc/profile vs .profile vs /etc/zsh vs .zshrc) (0) | 2022.09.08 |