본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오 코틀린] WebView에서 카메라 설정

728x90
반응형

 

 

 

 

 

 

Url을 이용해 WebView를 보여주는 코드는 상당히 간단하다.

 

 

manifest 에

<uses-permission android:name="android.permission.CAMERA"/>

 

 

layout

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

 

 

 

MainActivity.kt

 

val webView = findViewById<WebView>(R.id.webView)
webView.webViewClient = WebViewClient()
webView.loadUrl("연결할 주소")

 

 

 

 

 

정도를 추가하면 간단하게 추가할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

하지만 , 더 많은 기능을 사용하기 위해서는 코드를 추가해야 한다.

 

 

 

WebView에서 휴대폰에 있는 카메라를 띄우고 싶었다(webView 내에 있는 절차를 실행하다가 카메라를 켜는 동작이 있을 때) 

그러기 위해선 Manifest.permission.CAMERA를 허락하는 요청을 해야 했고, manifest에 <uses-permission android:name="android.permission.CAMERA"/> 을 추가하는 것으로 해결이 되지 않았다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그래서 코드에서 한 번 더 요청하는 webView 코드를 아래와 같이 구성했다.

 

 

 

 

 

 

 

 

manifest

 

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
    
    
    ...
    
<application

	...
    android:usesCleartextTraffic="true">

 

 

 

 

 

 

 

 

layout_main.xml

 

<WebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

 

 

 

 

 

 

 

MainActivity.kt

class MainActivity : AppCompatActivity() {

    @SuppressLint("SetJavaScriptEnabled")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val webView : WebView = findViewById(R.id.webView)

        webView.webViewClient = WebViewClient()
        webView.webChromeClient = WebChromeClient()
        webView.settings.apply {
            javaScriptEnabled = true
            domStorageEnabled = true
            setSupportMultipleWindows(true)
        }
        webView.webChromeClient = object : WebChromeClient(){
            @SuppressLint("ObsoleteSdkInt")
            override fun onPermissionRequest(request: PermissionRequest) {
                val permission = ContextCompat.checkSelfPermission(this@MainActivity, Manifest.permission.CAMERA)
                if (permission == PackageManager.PERMISSION_GRANTED) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        request.grant(request.resources)
                    }
                } else {
                    ActivityCompat.requestPermissions(this@MainActivity, arrayOf(android.Manifest.permission.CAMERA), 99)
                    ActivityCompat.requestPermissions(this@MainActivity, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE), 99)
                    ActivityCompat.requestPermissions(this@MainActivity, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 99)
                }
            }
        }
        webView.loadUrl("https://naver.com/")
    }

    val FLAG_PERM_CAMERA = 98
    val FLAG_PERM_STORAGE = 99

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            FLAG_PERM_STORAGE -> {
                for (grant in grantResults) {
                    if (grant != PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(this, "저장소 권한이 승인되었습니다.", Toast.LENGTH_SHORT).show()
                    } else {
                    Toast.makeText(this, "저장소 권한을 승인해야합니다..", Toast.LENGTH_SHORT).show()
                }
            }
            FLAG_PERM_CAMERA -> {
                for (grant in grantResults) {
                    if (grant != PackageManager.PERMISSION_GRANTED) {
                        Toast.makeText(this, "카메라 권한이 승인되었습니다.", Toast.LENGTH_SHORT).show()
                    } else {
                    Toast.makeText(this, "카메라 권한을 승인해야합니다.", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

 

 

 

 

 

 

ChromeClient()에 permission함수를 추가해주었고, 허락하지 않은 경우 else에 권한 묻는 코드를 한 번 더 입력하여

카메라가 잘 동작하게 만들어준다.

(간단하게 동작하는 테스트만 해보려고 viewBinding도 사용하지 않았고, 허가 코드가 겹쳐서 작동하는 것 같지만 지금은 실력의 한계다 ㅜ)

 

 

 

 

 

 

 

 

 

참고

https://developer.android.com/guide/webapps/webview?hl=ko 

 

WebView에서 웹 앱 빌드  |  Android 개발자  |  Android Developers

WebView에서 웹 앱 빌드 웹 애플리케이션 또는 웹페이지만 클라이언트 애플리케이션의 일부로 제공하려는 경우 WebView를 사용하면 됩니다. WebView 클래스는 Android의 View 클래스의 확장으로, 웹페이

developer.android.com

 

 

 

 

 

 

 

728x90
반응형