Yo estoy siguiendo un tutorial sobre la utilización de la cámara en una aplicación de Android. Estoy recibiendo el error «Permiso de Negación: no se puede utilizar la cámara» cuando se ejecuta de depuración, tanto en el emulador de dispositivo físico. He probado una gran variedad de permisos en mi archivo de manifiesto. Parece que la mayoría de las personas que han tenido este error han tenido un error, una falta de permisos, o los permisos no en el lugar correcto en su manifiesto.

Este es mi archivo de manifiesto:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.karudo.dbzrealpowerup" >

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera2" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".DBZHome"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".DBZStartPowerUp"
            android:label="@string/title_activity_dbzstart_power_up" >
        </activity>
    </application>

</manifest>

Aquí está mi actividad:

package com.example.karudo.dbzrealpowerup;
import android.app.Activity;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Bundle;
import android.util.Size;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class DBZStartPowerUp extends Activity {
private Size mPreviewSize;
private String mCameraId;
private TextureView mTextureView;
private TextureView.SurfaceTextureListener mSurfaceTextureListener =
new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
setupCamera(width, height);
openCamera();
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
return false;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}
};
private CameraDevice mCameraDevice;
private CameraDevice.StateCallback mCameraDeviceStateCallback
= new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
mCameraDevice = camera;
Toast.makeText(getApplicationContext(), "Camera Opened!", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisconnected(CameraDevice camera) {
camera.close();
mCameraDevice = null;
}
@Override
public void onError(CameraDevice camera, int error) {
camera.close();
mCameraDevice = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dbzstartpowerup);
mTextureView = (TextureView) findViewById(R.id.dbzCameraPreview);
}
@Override
public void onResume() {
super.onResume();
if(mTextureView.isAvailable()) {
} else {
mTextureView.setSurfaceTextureListener(mSurfaceTextureListener);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_dbzstartpowerup, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle action bar item clicks here. The action bar will
//automatically handle clicks on the Home/Up button, so long
//as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void setupCamera(int width, int height) {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
for(String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
if (cameraCharacteristics.get(CameraCharacteristics.LENS_FACING) ==
CameraCharacteristics.LENS_FACING_FRONT) {
continue;
}
StreamConfigurationMap map = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
mPreviewSize = getPreferredPreviewSize(map.getOutputSizes(SurfaceTexture.class), width, height);
mCameraId = cameraId;
return;
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
private Size getPreferredPreviewSize(Size[] mapSizes, int width, int height) {
List<Size> collectorSizes = new ArrayList<>();
for(Size option : mapSizes) {
if(width > height) {
if(option.getWidth() > width &&
option.getHeight() > height) {
collectorSizes.add(option);
}
} else {
if(option.getWidth() > height &&
option.getHeight() > width) {
collectorSizes.add(option);
}
}
}
if(collectorSizes.size() > 0) {
return Collections.min(collectorSizes, new Comparator<Size>() {
@Override
public int compare(Size lhs, Size rhs) {
return Long.signum(lhs.getWidth() * lhs.getHeight() - rhs.getWidth() * rhs.getHeight());
}
});
}
return mapSizes[0];
}
private void openCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
}

Y el error en mi logcat:

10-04 03:15:02.740     961-8780/? E/CameraService Permission Denial: can't use the camera pid=20601, uid=10059
10-04 03:15:02.741  20601-20601/com.example.karudo.dbzrealpowerup E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.karudo.dbzrealpowerup, PID: 20601
java.lang.SecurityException: Lacking privileges to access camera service
at android.hardware.camera2.utils.CameraBinderDecorator.throwOnError(CameraBinderDecorator.java:108)
at android.hardware.camera2.legacy.CameraDeviceUserShim.connectBinderShim(CameraDeviceUserShim.java:336)
at android.hardware.camera2.CameraManager.openCameraDeviceUserAsync(CameraManager.java:324)
at android.hardware.camera2.CameraManager.openCamera(CameraManager.java:454)
at com.example.karudo.dbzrealpowerup.DBZStartPowerUp.openCamera(DBZStartPowerUp.java:163)
at com.example.karudo.dbzrealpowerup.DBZStartPowerUp.access$100(DBZStartPowerUp.java:23)
at com.example.karudo.dbzrealpowerup.DBZStartPowerUp$1.onSurfaceTextureAvailable(DBZStartPowerUp.java:34)
at android.view.TextureView.getHardwareLayer(TextureView.java:368)
at android.view.View.updateDisplayListIfDirty(View.java:15151)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.updateDisplayListIfDirty(View.java:15169)
at android.view.View.draw(View.java:15948)
at android.view.ViewGroup.drawChild(ViewGroup.java:3609)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)
at android.view.View.draw(View.java:16181)
at com.android.internal.policy.PhoneWindow$DecorView.draw(PhoneWindow.java:2690)
at android.view.View.updateDisplayListIfDirty(View.java:15174)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:606)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Soy nuevo en el desarrollo de la aplicación y es cierto que yo no soy buena en la depuración, pero mi manifiesto aparecen los permisos correctos a partir de lo que he visto de la gente de otros archivos (y el tutorial que está a sólo 4 meses de edad).

Puede alguien por favor decirme qué he hecho mal?

Saludos,
Lee.

ACTUALIZACIÓN: he encontrado a través de la depuración que se bloquea tan pronto como se llega a este método…

private void openCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}

}

… específicamente tan pronto como se ejecuta la instrucción try.

ACTUALIZACIÓN 2: Si me comente las instrucciones try/catch, la aplicación no se bloquee, pero el resultado esperado (que es para imprimir «de la Cámara Abierto!») no sucede. Alguna idea?

ACTUALIZACIÓN 3: Mis disculpas, me di cuenta de lo tonto que mi edición fue. Es obvio por qué ya no se bloquea, pero al menos ahora sé que tengo que depurar mi cameraManager.openCamera parámetros. El código está ahí si alguien puede echar un vistazo 🙂

¿cuál es el uso de la versión del sdk?
Lo siento, ¿te refieres a la versión de la API de mi emulador? Se está ejecutando la API de 23. Mi Samsung Galaxy S5 (físico, no en emulador) se está ejecutando la versión de Android 5.0. Y Android Studio es en 1.3.2.

OriginalEl autor Lee Valentine | 2015-10-04

4 Comentarios

  1. 10

    Si usted está usando Android 6 de Malvavisco este problema podría ser causado por la nueva gestión de permisos.
    En mi caso he resuelto el problema reemplazando el siguiente método de actividad:

    @Override
    public void onRequestPermissionsResult(int requestCode,  String permissions[], int[] grantResults) {
    switch (requestCode) {
    case CAMERA_PERMISSION:
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    if(mClss != null) {
    Intent intent = new Intent(this, ClassUsingCamera);
    startActivity(intent);
    }
    } else {
    Toast.makeText(this, "Please grant camera permission to use the QR Scanner", Toast.LENGTH_SHORT).show();
    }
    return;
    }
    }

    Yo luego puso en marcha la actividad que requiere la cámara (ClassUsingCamera) con el siguiente código:

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
    != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this,
    new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION);
    } else {
    Intent intent = new Intent(this, ClassUsingCamera);
    startActivity(intent);
    }

    En el primer inicio de la aplicación obtendrá la ventana emergente preguntando a conceder el acceso a la cámara.

    Otra opción es utilizar el PermissionsDispatcher como se explica aquí https://github.com/hotchemi/PermissionsDispatcher

    OriginalEl autor Roberto

  2. 3

    tengo el mismo error sólo cuando he probado la aplicación en dispositivos con Android 6.0.0) o emulador con el API (23).
    Pero con los demás funciona bien.

    que es porque los de android por encima de la M hace algunos cambios en los permisos concedidos en la aplicación en tiempo de ejecución.

    para hacerlo, siga estos pasos.

    primera :
    agregar esta variable estática.

    private static final int REQUEST_CAMERA_RESULT = 1;

    luego
    modificar su openCamera método

    private void openCamera() {
    CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
    try {
    Log.v("CAMERA", mCameraId + " " + mCameraDeviceStateCallback);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
    if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
    == PackageManager.PERMISSION_GRANTED){
    cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback,mBackgroundHandler);
    }
    else {
    if (shouldShowRequestPermissionRationale(android.Manifest.permission.CAMERA)){
    Toast.makeText(this,"No Permission to use the Camera services", Toast.LENGTH_SHORT).show();
    }
    requestPermissions(new String[] {android.Manifest.permission.CAMERA},REQUEST_CAMERA_RESULT);
    }
    }
    else {
    cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, mBackgroundHandler);
    }
    } catch (CameraAccessException e) {
    e.printStackTrace();
    }
    }

    siéntase libre de cambiar mBackgroundHandler a null,
    acabo de hacer para manejar el trabajo de la cámara en el subproceso en segundo plano.

    Y,a continuación, Reemplazar este método

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode){
    case  REQUEST_CAMERA_RESULT:
    if (grantResults[0] != PackageManager.PERMISSION_GRANTED){
    Toast.makeText(this, "Cannot run application because camera service permission have not been granted", Toast.LENGTH_SHORT).show();
    }
    break;
    default:
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    break;
    }
    }

    OriginalEl autor Fady Emad

  3. 1

    Pocos puntos que puedo decir :

    1. Si la conexión al servicio de la cámara se produce un error (Por ejemplo, si la cámara se utiliza por parte de los demás de aplicación o dispositivo pesebre ha deshabilitar
      la cámara o de la aplicación no se pudo capaz de liberar la
      cámara).
    1. Asegúrese de que el cerrar de forma segura/versión de la cámara dentro de su código.

    2. Han tratado de comprobar si la cámara está siendo utilizado por algo más, o si su administrador de políticas tiene alguna opción de configuración en el que la cámara está apagada?

    Probablemente Cuando usted podría no poder acceder a la cámara en ambos casos se olvida de dar el permiso o supongamos que a otra es la cámara está siendo utilizado por otros procesos. Se supone que para su aplicación o en otra aplicación
    Hola Bhavdip, gracias por la respuesta. Estoy recibiendo el mensaje de error al ejecutar un emulador con nada de lo que se ejecuta en él, así que no creo que la cámara podría estar ya en uso. Tengo en mi código: public void onDisconnected(CameraDevice cámara) { cámara.close (); } ¿hay algún otro lugar que debo utilizar la cámara.close() ? Idealmente, incluso no me quiere/necesita para tomar una foto. Sólo quiero usar la vista previa de la cámara (tengo que posteriormente aplicar una superposición). Gracias de nuevo!
    <usa-característica de android:name=»android.de hardware.cámara2″ /> Lo que significa ? Creo que puede ser <usa-característica de android:name=»android.de hardware.cámara» />
    Si escribo «de android.de hardware.C» la auto-completar muestra «de android.de hardware.De la cámara», pero con una línea a través de él (para mostrar en desuso). Si escribo «de android.de hardware.c» la función de autocompletar muestra «de android.de hardware.cámara2» así que traté de usar que. También, en la documentación de aquí dice: «declarar el «android.de hardware.cámara2.completa» la característica en su manifiesto», que también he probado. Edit: voy a probar el cambio ahora y le haremos saber si funciona. Edit2: lo Siento, me sigue apareciendo el mismo error con name=»android.de hardware.cámara» />
    Cualquier ayuda sería muy apreciada! 🙂

    OriginalEl autor Bhavdip Sagar

  4. 0

    tratar de poner este código manifest.xml archivo.

     <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="19" />
    <uses-permission
    android:name="android.permission.INTERNET"
    android:maxSdkVersion="19" />
    <uses-permission android:name="android.permission.SET_WALLPAPER" />
    <uses-permission android:name="android.permission.SET_DEBUG_APP"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    Gracias por la respuesta. Desafortunadamente, esto no funciona. Es la mejor forma de orientar sus versiones de SDK en un manifiesto, o en construir.gradle?
    oh…..lo siento . no he mucha idea acerca de gardel herramienta. he utilizado este código utilizando ECLIPSE. Voy a comprobar en androi studio.

    OriginalEl autor uma

Dejar respuesta

Please enter your comment!
Please enter your name here