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
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오 코틀린] OkHttp버전에 따른 JsonObject 사용법 (1) | 2022.07.27 |
---|---|
[안드로이드 스튜디오 코틀린] JavaScript와 연결해주는 Android Bridge - Kotlin 정리 (0) | 2022.06.28 |
[안드로이드 스튜디오] MVVM 패턴 (0) | 2022.05.24 |
[안드로이드 스튜디오] Figma로 Layout 디자인하기 ! (1) | 2022.05.23 |
[안드로이드 스튜디오] RxJava에 대해 알아보자 (0) | 2022.05.16 |