Android "Erlaubnis Denial: kann nicht in der Kamera"
Bin ich nach einem tutorial auf die Verwendung der Kamera in einem Android-app. Ich bin immer der Fehler "Erlaubnis Denial: kann nicht in der Kamera" beim ausführen von debug, sowohl auf dem emulator und dem physischen Gerät. Ich habe versucht eine Vielzahl von Berechtigungen in meiner manifest Datei. Es scheint, die meisten Menschen, die diese Fehler haben, hatte ein Tippfehler, fehlende Berechtigung oder die Berechtigungen nicht an der richtigen Stelle in Ihrem manifest.
Hier ist mein manifest-Datei:
<?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>
Hier ist meine Aktivität:
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();
}
}
}
Und den Fehler in meinem 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)
Ich bin neu in der app-Entwicklung und zugegeben, ich bin nicht gut im Debuggen, aber mein manifest Berechtigungen korrekt erscheinen von dem, was ich gesehen habe, anderen Menschen die Dateien (und das tutorial, das ist nur 4 Monate alt).
Kann jemand mir bitte sagen, was ich falsch gemacht habe?
Cheers,
Lee.
UPDATE: ich fand über Debuggen, stürzt es ab, sobald es erreicht diese Methode...
private void openCamera() {
CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
cameraManager.openCamera(mCameraId, mCameraDeviceStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
... insbesondere, sobald er ausgeführt wird der try-Anweisung.
UPDATE 2: Wenn ich kommentieren Sie die try/catch-Anweisungen, die app stürzt nicht ab, aber das erwartete Ergebnis (das ist print "Kamera Geöffnet!") nicht passieren. Irgendwelche Ideen?
UPDATE 3: ich entschuldige mich, ich erkannte, wie dumm meine oben genannten edit-war. Es ist offensichtlich, warum es nicht mehr abstürzt, aber zumindest weiß ich jetzt, ich habe zu Debuggen mein cameraManager.openCamera
Parameter. Den code gibt es, wenn jeder sehen können 🙂
Sorry, du meinst die API-version von meinem emulator? Es läuft API-23. Mein Samsung Galaxy S5 (Physischer, nicht emulator) mit Android version 5.0. Und Android Studio ist auf 1.3.2.
InformationsquelleAutor Lee Valentine | 2015-10-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit Android 6 Marshmallow-dieses Problem könnte verursacht werden durch die neue permission-management.
In meinem Fall habe ich das problem durch überschreiben der folgenden Aktivität Methode:
Ich dann startete die Tätigkeit, die die Kamera benötigt (ClassUsingCamera) mit dem folgenden code:
Auf dem ersten app-Start erhalten Sie das popup-Fragen Sie gewähren den Zugriff auf die Kamera.
Andere Möglichkeit ist die Verwendung des PermissionsDispatcher, wie hier beschrieben https://github.com/hotchemi/PermissionsDispatcher
InformationsquelleAutor Roberto
ich habe den gleichen Fehler nur, wenn ich habe versucht, die app auf Geräten mit Android 6.0.0) oder emulator mit (API 23).
Aber mit anderen funktioniert es einwandfrei.
das ist, weil android über M macht einige änderungen in den Berechtigungen auf run-time-Anwendung.
es zu tun, befolgen Sie diese paar Schritte.
ersten :
fügen Sie diese statische variable.
dann
ändern Sie Ihre openCamera-Methode
fühlen Sie sich frei zu ändern mBackgroundHandler auf null,
ich schaffte es gerade noch zu handhaben Kamera-Arbeit im hintergrund-thread.
Und dann diese Methode Überschreiben,
InformationsquelleAutor Fady Emad
Paar Punkte, die ich sagen kann :
Stellen Sie sicher, dass Ihr sicher schließen/lösen der Kamera in Ihrem code.
Haben Sie versucht, zu überprüfen, ob die Kamera benutzt wird, von etwas anderem ist oder wenn Ihre policy manager verfügt über eine Einstellung, wo die Kamera ausgeschaltet ist?
Hi Bhavdip, danke für die Antwort. Ich erhalte eine Fehlermeldung beim ausführen eines emulators mit sonst nichts läuft, so dass ich glaube nicht, dass die Kamera bereits im Einsatz. Ich habe in mein code: public void onDisconnected(CameraDevice Kamera) { camera.close(); } gibt es irgendwo sonst sollte ich benutzen Kamera.schließen() ? Im Idealfall, das ich gar nicht will/brauche, um ein Foto aufzunehmen. Ich will einfach nur, um die Kamera zu verwenden Vorschau (ich werde später ein overlay). Nochmals vielen Dank!
<uses-feature android:name="android.hardware.Kamera2" /> Was bedeutet es ? Ich denke, es kann <uses-feature android:name="android.hardware.Kamera" />
Wenn ich den Typ "android.hardware.C" für die automatische Vervollständigung zeigt "android.hardware.Kamera", aber mit einer Linie durch es (um zu zeigen, veraltet). Wenn ich den Typ "android.hardware.c" die autocomplete zeigt "android.hardware.Kamera2", also habe ich versucht zu verwenden. Auch in die Dokumentation hier heißt es "erklären "android.hardware.Kamera2.voll" - Funktion in Ihrem manifest" das habe ich auch schon versucht. Edit: ich werde versuchen Ihr jetzt ändern und lassen Sie wissen, ob es funktioniert. Edit2: Sorry, ich bekomme immer noch den gleichen Fehler mit name="android.hardware.Kamera" />
Weitere Hilfe wäre sehr geschätzt werden! 🙂
InformationsquelleAutor Bhavdip Sagar
versuchen, diesen code Ihr manifest.xml Datei.
oh.....sorry . ich habe nicht viel Ahnung von gradel-tool. ich habe diesen code mit ECLIPSE. Ich werde prüfen, in der androi-studio zu.
InformationsquelleAutor uma