iOS&Android 通過(guò)webview打開相冊(cè)和相機(jī), 獲取地理位置信息

iOS 通過(guò)webview打開相冊(cè)和相機(jī), 地理位置信息

1,iOS通過(guò)webview 打開相機(jī)和相冊(cè)
1.1前端在webview里面的代碼
1.2 iOS 需要做的事情就是配置權(quán)限
1.2.1 配置info.plist 配置相機(jī),相冊(cè)和麥克風(fēng)的權(quán)限

Privacy - Camera Usage Description: 相機(jī)權(quán)限描述
Privacy - Photo Library Usage Description:相冊(cè)權(quán)限描述 
Privacy - Microphone Usage Description:麥克風(fēng)權(quán)限

2. iOS通過(guò)WebView獲取地理位置信息

2.1 前端在WebView里面獲取地理位置的代碼
2.2 iOS需要在info.plist配置地理位置權(quán)限, 獲取權(quán)限后h5即可獲得權(quán)限

  Privacy - Location Usage Description:地理位置權(quán)限描述
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    NSLog(@"decidePolicyForNavigationAction");
    NSURLRequest * request = navigationAction.request;
    NSString * scheme = request.URL.scheme;
    // 處理通過(guò)webview 打電話邏輯
    if (scheme != nil && [@"tel" isEqualToString:scheme]) {
        [self hideLoadHud];
        UIApplication * app = [UIApplication sharedApplication];
        if ([app canOpenURL:request.URL]) {
            [app openURL:request.URL];
        }
        decisionHandler(WKNavigationActionPolicyCancel);
        return;
    }
    // 其他邏輯 ......
    
}

Android調(diào)用系統(tǒng)相機(jī)、GPS

相機(jī)調(diào)用準(zhǔn)備工作
聲明權(quán)限:

    <uses-permission android:name="android.permission.CAMERA" />
使用前動(dòng)態(tài)申請(qǐng)相機(jī)權(quán)限。
Android7.0以上需要 聲明FileProvider (http://www.itdecent.cn/p/47fcd7873f39)

相機(jī)調(diào)用開始

    val CAPTURE_REQUEST = 123
    var mFilePathCallback: ValueCallback<Array<Uri>>? = null //webview內(nèi)部回調(diào)
var captureUri: Uri? = null //使用該uri接收系統(tǒng)返回的圖片/視頻   
mWebview.webChromeClient = object : WebChromeClient() {
    fun file2Uri(file: File): Uri {
        //Android 7.0以上需要使用fileprovider
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            val authority = application.packageName + ".provider"
            return FileProvider.getUriForFile(Utils.getApp(), authority, file)
        } else {
            return Uri.fromFile(file)
        }
    }

    /**
     * 復(fù)寫該方法
     */
    override fun onShowFileChooser(webView: WebView?, filePathCallback: ValueCallback<Array<Uri>>?, fileChooserParams: FileChooserParams?): Boolean {


        mFilePathCallback = filePathCallback

        if (fileChooserParams?.acceptTypes?.isNotEmpty() == true) {
            val mipmap = fileChooserParams.acceptTypes[0]

            when (mipmap) {
                "image/*" -> {
                    val file = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "imageCapture${System.currentTimeMillis()}.jpg")
                    ///文件路徑 storage/emulated/0/Android/data/包名/files/Pictures/imageCapture1563956535105.jpg
                    captureUri = file2Uri(file)
                    val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, captureUri)
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                    startActivityForResult(intent, CAPTURE_REQUEST)

                    return true
                }

                "video/*" -> {
                    val file = File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "videoCapture${System.currentTimeMillis()}.mp4")
                    ///文件路徑 storage/emulated/0/Android/data/包名/files/Pictures/videoCapture1563956535105.mp4

                    captureUri = file2Uri(file)

                    val intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE)
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, captureUri)
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                    startActivityForResult(intent, CAPTURE_REQUEST)
                    return true

                }
            }


        }

        return super.onShowFileChooser(webView, filePathCallback, fileChooserParams)
    }


}
接收返回結(jié)果
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == CAPTURE_REQUEST) {
            if (resultCode == Activity.RESULT_OK) {
                mFilePathCallback?.onReceiveValue(arrayOf(captureUri)) //給回調(diào)設(shè)置數(shù)據(jù)
            } else
                mFilePathCallback?.onReceiveValue(arrayOf()) //給回調(diào)設(shè)置空數(shù)據(jù)
        }
    }

GPS調(diào)用準(zhǔn)備工作

申明權(quán)限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
使用時(shí)動(dòng)態(tài)申請(qǐng)權(quán)限
WebSettings webseting = mWebView.getSettings();
webseting.setJavaScriptEnabled(true);

獲取權(quán)限后h5即可獲得權(quán)限

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容