Last active
September 16, 2021 19:06
-
-
Save CyrilNb/cb33953d7b0147562886a92e83e383ce to your computer and use it in GitHub Desktop.
[Android] webview permission camera + file picker
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MoonPayPaymentWebView : AppCompatActivity() { | |
companion object { | |
const val PERMISSION_REQUEST_CODE = 1000 | |
const val REQUEST_SELECT_FILE = 1001 | |
private const val FILECHOOSER_RESULTCODE = 1002 | |
private var mUploadMessage: ValueCallback<Uri?>? = null | |
var uploadMessage: ValueCallback<Array<Uri>>? = null | |
} | |
private fun displayWebView(payload: String) { | |
webView.settings.apply { | |
loadWithOverviewMode = true | |
useWideViewPort = true | |
javaScriptEnabled = true | |
allowFileAccess = true | |
allowFileAccessFromFileURLs = true | |
allowUniversalAccessFromFileURLs = true | |
allowContentAccess = true | |
javaScriptCanOpenWindowsAutomatically = true | |
mediaPlaybackRequiresUserGesture = false | |
domStorageEnabled = true // Set because [WEBSITE] team say to use it. | |
} | |
// webView.webChromeClient = webViewManager.getWebChromeClient() | |
webView.webChromeClient = object : WebChromeClient() { | |
override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean { | |
Log.d("---", "consoleMessage ${consoleMessage?.message()}") | |
return super.onConsoleMessage(consoleMessage) | |
} | |
override fun onPermissionRequestCanceled(request: PermissionRequest?) { | |
Log.d("---", "onPermissionRequestCanceled") | |
super.onPermissionRequestCanceled(request) | |
} | |
override fun onShowFileChooser( | |
webView: WebView?, | |
filePathCallback: ValueCallback<Array<Uri>>?, | |
fileChooserParams: FileChooserParams? | |
): Boolean { | |
Log.d("---", "onshowfilechooser") | |
if (uploadMessage != null) { | |
Log.d("---", "uploadMsg null") | |
uploadMessage!!.onReceiveValue(null) | |
uploadMessage = null | |
} | |
try { | |
uploadMessage = filePathCallback | |
val intent = fileChooserParams?.createIntent() | |
intent?.type = "image/*" | |
try { | |
startActivityForResult(intent, REQUEST_SELECT_FILE) | |
} catch (e: ActivityNotFoundException) { | |
Log.d("---", "exception startactivitynotfound") | |
uploadMessage = null | |
[email protected]("Cannot Open File Chooser") | |
return false | |
} | |
} catch (e: ActivityNotFoundException) { | |
Log.d("---", "activitynotfound exception") | |
uploadMessage = null | |
[email protected]("Cannot Open File Chooser") | |
return false | |
} | |
return true | |
} | |
// Grant permissions for cam | |
@TargetApi(Build.VERSION_CODES.M) | |
override fun onPermissionRequest(request: PermissionRequest) { | |
Log.d("---", "onpermission request") | |
onUi { | |
if ("android.webkit.resource.VIDEO_CAPTURE" == request.resources[0]) { | |
if (ContextCompat.checkSelfPermission( | |
applicationContext, | |
android.Manifest.permission.CAMERA | |
) == PackageManager.PERMISSION_GRANTED | |
) { | |
Log.d("---", String.format("PERMISSION REQUEST %s GRANTED", request.origin.toString())) | |
request.grant(request.resources) | |
} else { | |
Log.d("---", "ELSE") | |
ActivityCompat.requestPermissions( | |
this@MoonPayPaymentWebView, | |
arrayOf( | |
android.Manifest.permission.CAMERA, | |
android.Manifest.permission.READ_EXTERNAL_STORAGE | |
), | |
REQUEST_CODE | |
) | |
} | |
} else { | |
Log.d("---", "${request.resources}") | |
} | |
} | |
} | |
} | |
webView.webViewClient = object : WebViewClient() { | |
override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { | |
checkAndHandleIfUrlIsRedirect(url) | |
} | |
override fun onPageFinished(view: WebView?, url: String?) { | |
onPageLoaded() | |
} | |
override fun onReceivedError(view: WebView?,errorCode: Int,description: String?,failingUrl: String?) { | |
Log.d("---", "$errorCode $description $failingUrl") | |
} | |
} | |
webView.loadUrl("$Url?$payload") | |
} | |
private fun checkAndHandleIfUrlIsRedirect(url: String?) { | |
// We check with `startWitch` because [WEBSITE] appended Query parameter to the url. | |
if (url?.startsWith(WebViewManager.BUY_WEB_VIEW_REDIRECTION) == true) { | |
// launch final activity | |
} | |
} | |
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { | |
Log.d("---", "onActivity result $requestCode $resultCode $data") | |
// if (requestCode == REQUEST_SELECT_FILE) { | |
// Log.d("---", "uploadMessage = $uploadMessage") | |
// uploadMessage?.let { | |
// it.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)) | |
// uploadMessage = null | |
// webViewManager.onActivityResult(requestCode, resultCode, data) | |
// } ?: return | |
// } | |
// | |
// if (requestCode == FILECHOOSER_RESULTCODE) { | |
// | |
// mUploadMessage?.let { | |
// val result = | |
// if (intent == null || resultCode != Activity.RESULT_OK) { | |
// null | |
// } else intent.data | |
// | |
// it.onReceiveValue(result) | |
// mUploadMessage = null | |
// } ?: return | |
// } | |
if (requestCode == REQUEST_SELECT_FILE) { | |
if (null == uploadMessage) { | |
return | |
} | |
uploadMessage?.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data)) | |
uploadMessage = null | |
} | |
if (requestCode == SuccessActivity.REQUEST_CODE) { | |
ReferralEmptyStateActivity.startActivity(this) | |
setResult(Activity.RESULT_OK) | |
finish() | |
} | |
return super.onActivityResult(requestCode, resultCode, data) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment