android webview android-permissions

android - ¿Cómo acceder a la cámara desde una vista web?



webview android-permissions (4)

Estaba intentando lo mismo. El siguiente código me funcionó.

Primero en el archivo de manifiesto tenemos que agregar el permiso de hardware de la cámara verdadero usando la etiqueta de permiso de usos.

Luego, debe aceptar el permiso de la cámara para usar las líneas siguientes en su actividad.

webview.setWebChromeClient(new WebChromeClient() { @Override public void onPermissionRequest(final PermissionRequest request) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { request.grant(request.getResources()); } } });

En mi aplicación de Android, estoy tratando de cargar una página web (que debe acceder a la cámara) en WebView . En mi computadora portátil, cuando cargo la página web, puedo acceder a la cámara.

Se muestra todo lo demás en la página html .

Aquí está el permiso que estoy poniendo en el Manifest.xml

<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.webkit.PermissionRequest" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />

Estoy configurando el SDK de la siguiente manera:

<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="21" />

Aquí está mi configuración de vista web:

private void setMyWebviewSettings(WebSettings MyWebviewSettings){ MyWebviewSettings.setAllowFileAccessFromFileURLs(true); MyWebviewSettings.setAllowUniversalAccessFromFileURLs(true); MyWebviewSettings.setJavaScriptCanOpenWindowsAutomatically(true); MyWebviewSettings.setJavaScriptEnabled(true); MyWebviewSettings.setDomStorageEnabled(true); MyWebviewSettings.setJavaScriptCanOpenWindowsAutomatically(true); MyWebviewSettings.setBuiltInZoomControls(true); MyWebviewSettings.setAllowFileAccess(true); MyWebviewSettings.setSupportZoom(true); }

Si pudiera acceder a la cámara desde mi aplicación directamente (usando una actividad normal), ¿por qué no puedo abrirla desde WebView ?


Esto es ciertamente posible con getUserMedia través de WebRTC.

Configure su WebView para permitir permisos y cargue su HTML con loadUrl ():

WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.getSettings().setAllowFileAccessFromFileURLs(true); myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); myWebView.setWebViewClient(new WebViewClient()); myWebView.setWebChromeClient(new WebChromeClient() { // Grant permissions for cam @Override public void onPermissionRequest(final PermissionRequest request) { Log.d(TAG, "onPermissionRequest"); MainActivity.this.runOnUiThread(new Runnable() { @TargetApi(Build.VERSION_CODES.M) @Override public void run() { Log.d(TAG, request.getOrigin().toString()); if(request.getOrigin().toString().equals("file:///")) { Log.d(TAG, "GRANTED"); request.grant(request.getResources()); } else { Log.d(TAG, "DENIED"); request.deny(); } } }); } }); myWebView.loadUrl(LOCAL_FILE);

Luego use getUserMedia a través de su archivo JS, suponiendo que tenga una etiqueta <video> en su archivo HTML:

var constraints = { video: { width: 800, height: 800 } }; navigator.mediaDevices.getUserMedia(constraints) .then(function(mediaStream) { var video = document.querySelector(''video''); video.srcObject = mediaStream; video.onloadedmetadata = function(e) { video.play(); }; }) .catch(function(err) { console.log(err.name + ": " + err.message); }); // always check for errors at the end.

Por último, asegúrese de tener permisos establecidos en su manifiesto:

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


Esto es lo que funcionó para mí. Espero que esto ayude a alguien.

public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{ WebView myWebView; private String TAG = "TEST"; private PermissionRequest mPermissionRequest; private static final int REQUEST_CAMERA_PERMISSION = 1; private static final String[] PERM_CAMERA = {Manifest.permission.CAMERA}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.getSettings().setAllowFileAccessFromFileURLs(true); myWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); //myWebView.setWebViewClient(new WebViewClient()); myWebView.setWebChromeClient(new WebChromeClient() { // Grant permissions for cam @Override public void onPermissionRequest(final PermissionRequest request) { Log.i(TAG, "onPermissionRequest"); mPermissionRequest = request; final String[] requestedResources = request.getResources(); for (String r : requestedResources) { if (r.equals(PermissionRequest.RESOURCE_VIDEO_CAPTURE)) { // In this sample, we only accept video capture request. AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this) .setTitle("Allow Permission to camera") .setPositiveButton("Allow", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); mPermissionRequest.grant(new String[]{PermissionRequest.RESOURCE_VIDEO_CAPTURE}); Log.d(TAG,"Granted"); } }) .setNegativeButton("Deny", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); mPermissionRequest.deny(); Log.d(TAG,"Denied"); } }); AlertDialog alertDialog = alertDialogBuilder.create(); alertDialog.show(); break; } } } @Override public void onPermissionRequestCanceled(PermissionRequest request) { super.onPermissionRequestCanceled(request); Toast.makeText(MainActivity.this,"Permission Denied",Toast.LENGTH_SHORT).show(); } }); if(hasCameraPermission()){ myWebView.loadUrl("Your URL"); setContentView(myWebView ); }else{ EasyPermissions.requestPermissions( this, "This app needs access to your camera so you can take pictures.", REQUEST_CAMERA_PERMISSION, PERM_CAMERA); } } private boolean hasCameraPermission() { return EasyPermissions.hasPermissions(MainActivity.this, PERM_CAMERA); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) { } @Override public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) { } }

Estoy usando la biblioteca easypermission para el permiso de la cámara y recuerdo agregar permisos de uso para la cámara en el Manifiesto de Android


Si no me equivoco, simplemente desea abrir la cámara de su dispositivo y cargar la foto recién capturada en la vista web sin abrir otra aplicación, entonces también necesita el permiso WRITE_EXTERNAL_STORAGE y métodos para manejar las solicitudes de archivos y crear nuevos archivos con la cámara y escribirlos en su dispositivo almacenamiento.

Espero que esto ayude, Open Source (Android Smart WebView) le permite configurar las cosas por usted.

openFileChooser() buscar los openFileChooser() y onShowFileChooser() para comprender cómo manejar las solicitudes de archivos desde la entrada de la vista web y activar la cámara del teléfono para capturar y crear una nueva imagen sin abrir otras aplicaciones.