Ich erhalte keine Verbindung zu einem Kameradienst, wenn ich meine Android-App im Emulator ausführte. Ich habe die verschiedenen vorhandenen Beiträge gelesen, aber dies wurde nicht behoben. Es ist eindeutig der Aufruf von Camera.open (), der fehlschlägt. Irgendwann würde ich gerne die Webcam im Emulator zum Laufen bringen, wie viele SO -Posten besprechen, aber jetzt möchten Sie nur, dass die App ohne Bombenangriff läuft. Es ist mir egal, ob ein Kameravideo angezeigt wird oder nicht, da es außer der Kamera noch weitere Funktionen gibt, die ich testen muss, und die Kamera in erster Linie auf meinem Gerät testen wird.
Mein Manifest scheint in Ordnung zu sein. Folgende Zeilen sind drin:
<uses-feature Android:name="Android.hardware.camera" />
<uses-feature Android:name="Android.hardware.camera.autofocus" />
<uses-permission Android:name="Android.permission.CAMERA"></uses-permission>
In meinem AVD-Manager habe ich sowohl die vordere als auch die hintere Kamera auf "Emuliert" und den Wert für die SD-Karte auf 64 eingestellt. Dies scheinen die empfohlenen Werte zu sein. Der vollständige Stack-Trace befindet sich jetzt unten. Die Lösung muss einfach sein, aber was?
10-09 08:14:32.375 2628-2628/com.allinlearning.AILAndroidScanner E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.allinlearning.AILAndroidScanner, PID: 2628
Java.lang.RuntimeException: Fail to connect to camera service
at Android.hardware.Camera.native_setup(Native Method)
at Android.hardware.Camera.<init>(Camera.Java:350)
at Android.hardware.Camera.open(Camera.Java:309)
at com.allinlearning.AILAndroidScanner.AsynCamPreview.surfaceCreated(AsynCamPreview.Java:104)
at Android.view.SurfaceView.updateWindow(SurfaceView.Java:572)
at Android.view.SurfaceView.access$000(SurfaceView.Java:86)
at Android.view.SurfaceView$3.onPreDraw(SurfaceView.Java:175)
at Android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.Java:847)
at Android.view.ViewRootImpl.performTraversals(ViewRootImpl.Java:1871)
at Android.view.ViewRootImpl.doTraversal(ViewRootImpl.Java:1000)
at Android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.Java:5670)
at Android.view.Choreographer$CallbackRecord.run(Choreographer.Java:761)
at Android.view.Choreographer.doCallbacks(Choreographer.Java:574)
at Android.view.Choreographer.doFrame(Choreographer.Java:544)
at Android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.Java:747)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5017)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:779)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:595)
at dalvik.system.NativeStart.main(Native Method)
Der Code für die gesamte Klasse befindet sich unten. Wieder ist es der Aufruf Camera.open (), der die Ausnahme auslöst:
import Java.io.IOException;
import Java.util.List;
import Android.graphics.Bitmap;
import Android.graphics.ImageFormat;
import Android.hardware.Camera;
import Android.os.AsyncTask;
import Android.os.Handler;
import Android.os.Looper;
import Android.util.Log;
import Android.view.SurfaceHolder;
import Android.webkit.MimeTypeMap;
import Android.widget.ImageView;
public class AsynCamPreview extends MainActivity
implements SurfaceHolder.Callback, Camera.PreviewCallback
{
private Camera mCamera;
public Camera.Parameters params;
private SurfaceHolder sHolder;
private ImageView myCameraPreview = null;
private Bitmap mBitmap = null;
// data arrays
private int[] pixels = null;
private float[] floatpixels = null;
private byte[] FrameData = null;
// Camera params
public float maxZoom;
private int imageFormat;
private int previewSizeWidth;
private int previewSizeHeight;
private int camId = 1;
// flags and counts
private boolean bProcessing = false;
private int frameCount = 0;
private boolean doProcessing = false;
public boolean mProcessInProgress = false;
public static final String TAG = "AsynCamPreview";
private long mTiming[] = new long[50];
private int mTimingSlot = 0;
Handler mHandler = new Handler(Looper.getMainLooper());
static {
// System.loadLibrary("ImageProcessing");
Log.i(TAG, "Native library loaded");
}
public AsynCamPreview(int previewLayoutWidth, int previewLayoutHeight, ImageView cameraPreview)
{
previewSizeWidth = previewLayoutWidth;
previewSizeHeight = previewLayoutHeight;
myCameraPreview =cameraPreview;
}
@Override
public void onPreviewFrame(byte[] data, Camera camera)
{
// Do nothing for now
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
sHolder = holder;
if (camId == 0) {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
}
else {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
}
try {
mCamera.setPreviewDisplay(holder);
mCamera.setPreviewCallback(this);
} catch (IOException e) {
mCamera.release();
mCamera= null;
}
params = mCamera.getParameters();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
params = mCamera.getParameters();
List<Camera.Size> sizes = params.getSupportedPictureSizes();
this.params.setPreviewSize(previewSizeWidth, previewSizeHeight);
mBitmap = Bitmap.createBitmap(previewSizeWidth, previewSizeHeight,
Bitmap.Config.ARGB_8888);
myCameraPreview.setImageBitmap(mBitmap);
pixels = new int[previewSizeWidth * previewSizeHeight];
//floatpixels = new float[previewSizeWidth * previewSizeHeight * 3];
imageFormat = params.getPreviewFormat();
mCamera.setParameters(params);
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void onPause() {
this.mCamera.stopPreview();
}
}
Von den Android Developers Docs :
Beim Aufruf von Camera.open () wird eine Ausnahme ausgelöst, wenn die Kamera bereits von einer anderen Anwendung verwendet wird. Wir wickeln sie also in einen try-Block ein.
Versuchen Sie, den Code wie folgt in einen try catch-Block zu packen:
try {
releaseCameraAndPreview();
if (camId == 0) {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
}
else {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
}
} catch (Exception e) {
Log.e(getString(R.string.app_name), "failed to open Camera");
e.printStackTrace();
}
Fügen Sie diese Funktion dann irgendwo hinzu:
private void releaseCameraAndPreview() {
myCameraPreview.setCamera(null);
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
Ist keine Erlaubnis für Android 6.x?
http://developer.Android.com/training/permissions/requesting.html
Bei Android 6.0 kann dieser Fehler angezeigt werden, wenn Sie nicht nach einer Manifestauthentifizierung suchen:
//If authorisation not granted for camera
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
//ask for authorisation
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 50);
else
//start your camera
this.startCamera();
Verwenden
if (ContextCompat.checkSelfPermission(getApplicationContext(), Android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(CodeScanner.this, new String[]{Android.Manifest.permission.CAMERA}, 50);
}
arbeitete für mich
1.Verwenden Sie unterhalb der Berechtigungen in der Manifestdatei und setzen Sie die Berechtigungen immer über dem Application-Tag.
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-feature
Android:name="Android.hardware.camera"
Android:required="false" />
<uses-feature Android:name="Android.hardware.camera.autofocus" />
2.Use entsperren, während die Kamera von einem anderen Dienst wie MediaRecorder verwendet wird.
camera.unlock();
recorder.setCamera(camera);
2.Release hat die Kamera ordnungsgemäß freigegeben. Ich bevorzuge die Sperre, damit ich für andere Anwendungen und den zweiten Gebrauch sicher zugänglich bin (falls wir sie wieder öffnen).
if (camera != null) {
camera.lock();
camera.stopPreview();
camera.release();
camera = null;
}
Wenn Sie in regelmäßigen Abständen stattdessen einen weißen Bildschirm sehen, verwenden Sie Folgendes:
private void releaseCameraAndPreview() {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCameraView.getHolder().removeCallback(mCameraView);
mCamera.release();
mCamera = null;
}
}
und leg es hier hin
try {
releaseCameraAndPreview();
mCamera = getCameraInstance();
}...
und hier
@Override
protected void onPause() {
super.onPause();
releaseCameraAndPreview();
}