2016-11-13 5 views
0

Ich brauche eine Hilfe. Ich versuche Individuelle Kamera mit Oberfläche zu implementieren vie, aber ich bin in diesen Fehler gestapelt:Android ... Verbindung mit Kamera-Service nicht möglich

Process: visionary.anselmo.camerademo, PID: 7464 
                      java.lang.RuntimeException: Fail to connect to camera service 
                      at android.hardware.Camera.<init>(Camera.java:496) 
                      at android.hardware.Camera.open(Camera.java:360) 
                      at visionary.anselmo.camerademo.CameraActivity.surfaceCreated(CameraActivity.java:149) 
                      at android.view.SurfaceView.updateWindow(SurfaceView.java:608) 
                      at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:160) 
                      at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2201) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
                      at android.view.Choreographer.doFrame(Choreographer.java:619) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Und hier geht die Aktivität, die diese Griffe: public class CameraActivity erweitert AppCompatActivity implementiert SurfaceHolder.Callback {

@SuppressWarnings("deprecation") 
private Camera camera; 
@InjectView(R.id.surface_view) 
SurfaceView surfaceView; 
@InjectView(R.id.btn_take_picture) 
ImageView take_picture; 
SurfaceHolder surfaceHolder; 
@SuppressWarnings("deprecation") 
Camera.PictureCallback pictureCallback; 
@SuppressWarnings("deprecation") 
ShutterCallback shutterCallback; 


@SuppressWarnings("deprecation") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_activity); 
    ButterKnife.inject(this); 
    surfaceHolder = surfaceView.getHolder(); 
    // Install the surfaceHolder.Callback so we get notified when the underlying is created and destroyed 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    take_picture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      cameraImage(); 
     } 
    }); 
    pictureCallback = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outputStream; 
      File imageFile = getDirectory(); 
      if (!imageFile.exists() && !imageFile.mkdirs()) { 
       Toast.makeText(getApplicationContext(), 
         "Nao foi possivel criar o directorio para a imagem.", 
         Toast.LENGTH_SHORT) 
         .show(); 
       return; 
      } 
      SimpleDateFormat format = new SimpleDateFormat("yyyymmddhhmmss", Locale.ENGLISH); 
      String date = format.format(new Date()); 
      String photoFile = "Demo" + date + ".jpg"; 
      String fileName = imageFile.getAbsolutePath() + "/" + photoFile; 
      File picFile = new File(fileName); 
      try { 
       outputStream = new FileOutputStream(picFile); 
       outputStream.write(data); 
       outputStream.close(); 
      } catch (IOException ignored) { 
      } 
      Toast.makeText(getApplicationContext(), "Picture Saved", Toast.LENGTH_SHORT) 
        .show(); 

      refreshCamera(); 
      refreshGallery(picFile); 
     } 
    }; 
} 

private void refreshGallery(File file) { 
    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    intent.setData(Uri.fromFile(file)); 
    sendBroadcast(intent); 
} 

private void refreshCamera() { 
    if (surfaceHolder.getSurface() == null) { 
     // Preview surfave does not exists 
     return; 
    } 
    // Stop the preview before making changes 
    try { 
     camera.stopPreview(); 
    } catch (Exception ignored) { 
    } 
    // Set the preview size, and make any resize, rotate or any reformmating changes here 
    // Start preview with new Settings 
    try { 
     camera.setPreviewDisplay(surfaceHolder); 
     camera.startPreview(); 
    } catch (Exception ignored) { 
    } 
} 

private File getDirectory() { 
    File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    return new File(dics, "CameraActivity"); 
} 

    private void cameraImage() { 
    // Take the picture 
    camera.takePicture(null, null, pictureCallback); 
} 

@SuppressWarnings("deprecation") 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // Open the fuck'n Camera here 
    releaseCamera(); 

    camera = Camera.open(); 

    Camera.Parameters parameters; 
    parameters = camera.getParameters(); 

    // Modify the parameters 
    parameters.setPreviewFrameRate(20); 
    parameters.setPreviewSize(352, 288); 
    camera.setParameters(parameters); 
    camera.setDisplayOrientation(90); 

    try { 
     // The surface has been created, now tell the camera where to draw the preview 
     camera.setPreviewDisplay(surfaceHolder); 
    } catch (Exception ignored) { 
    } 
} 

    private void releaseCamera(){ 
    if(camera != null){ 
     camera.release(); 
     camera = null; 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    refreshCamera(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // Stop the preview and release the camera 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
} 

}

Hilfe Jungs ... Dank ...

+0

Häufig bedeutet dies, dass eine andere App die Kamera verwendet. Dies kann passieren, wenn Ihre App die Kamera öffnet, aber nicht ordnungsgemäß schließt. Versuchen Sie, Ihr Gerät neu zu starten, und prüfen Sie, ob das Problem behoben ist. – CommonsWare

+0

@CommonsWare ... Ich benutze den Android Studio Emulator, und ich habe das Gerät ausgeschaltet und neu gestartet, aber die App immer noch verknallt ... –

+0

irgendwelche Ideen, wie kann ich das lösen? –

Antwort

0

Sie könnten nee d um die Berechtigung zur Laufzeit anzufordern. Weitere Informationen zu diesem Thema finden Sie unter The Android Developers Homepage. Das Anfordern von Laufzeitberechtigungen ist erforderlich, wenn Sie auf Android 6.0 oder höher abzielen.

+0

das hat für mich funktioniert ... Danke @Jonas ... –

Verwandte Themen