android webview打开前置摄像头
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.webkit.JsResult;
import android.webkit.PermissionRequest;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class WebTestActivity extends Activity {
private WebView webView;
private final int REQUEST_CAMERA_PERMISSION = 100;
private PermissionRequest pendingPermissionRequest;
@SuppressLint("SetJavaScriptEnabled")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_test);
webView = findViewById(R.id.webView);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
// 允许自动播放
settings.setMediaPlaybackRequiresUserGesture(false);
String url = "file:///android_asset/camera_test.html";
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onPermissionRequest(final PermissionRequest request) {
// 检查权限
if (ContextCompat.checkSelfPermission(WebTestActivity.this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
request.grant(request.getResources());
} else {
// 保存请求以便在用户授予权限后使用
pendingPermissionRequest = request;
// 请求权限
ActivityCompat.requestPermissions(WebTestActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
}
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// 自动确认 JavaScript Alert
result.confirm();
return true; // 表示我们已经处理了这个 alert
}
});
webView.loadUrl(url);
}
@Override
protected void onDestroy() {
webView.destroy();
super.onDestroy();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户允许了摄像头权限,授予权限
if (pendingPermissionRequest != null) {
pendingPermissionRequest.grant(pendingPermissionRequest.getResources());
pendingPermissionRequest = null;
}
} else {
// 用户拒绝了摄像头权限
Toast.makeText(this, "摄像头权限被拒绝", Toast.LENGTH_SHORT).show();
// 清理请求
pendingPermissionRequest = null;
}
}
}
}
camera_test.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>摄像头测试</title>
</head>
<body>
<button id="cameraButton">打开前置摄像头</button>
<video id="video" width="320" height="240" autoplay></video>
<script>
document.getElementById('cameraButton').addEventListener('click', async () => {
try {
const constraints = {
video: {
facingMode: 'user'
}
};
const stream = await navigator.mediaDevices.getUserMedia(constraints);
const videoElement = document.getElementById('video');
videoElement.srcObject = stream;
} catch (error) {
console.error('Error accessing camera: ', error);
alert('Error accessing camera: ' + error.message);
}
});
</script>
</body>
</html>
效果
浙公网安备 33010602011771号