I telecamere non vengono mai catturati in servizio di background (Android)

Voglio eseguire la telecamera anteriore di un dispositivo da un servizio di background, get i fotogrammi catturati dalla camera nel servizio di background utilizzando il callback che viene chiamato eachqualvolta viene catturata una nuova camera dalla camera (ad esempio, onPreviewFrame ) e applicare un reale l'elaborazione del tempo sui fotogrammi ottenuti.

Dopo la ricerca ho capito che ci sono due modi per eseguire la camera in background:

  • Utilizzo di layout personalizzati per la libreria del croutone
  • L'errore Volley string l'errore mentre passano string con valore null come parametro
  • Indicatore di pagina Android per l'image scorrevole
  • Mixaggio di file audio
  • NETWORK_PROVIDER non fornisce posizioni aggiornate
  • Individuazione dell'orientamento del telefono con events del sensore
  • 1- Impostazione di un SurfaceView con size 1 X 1.

    2- Utilizzo di SurfaceTexture (questo non richiede alcuna vista che sembra più efficiente.)

    Ho provato entrambi i modi, ho potuto eseguire solo la camera dal fondo, ma le richieste di richiamo per get frame non sono mai state chiamate, anche se ho provato diversi trucchi.

    Il codice usato per il metodo 1 è disponibile qui:

    https://stackoverflow.com/questions/35160911/why-onpreviewframe-is-not-being-called-from-a-background-service

    Notare che ho anche cercato di call onPreviewFrame all'interno della superficieChanged, ma ho sempre trovato che la camera è nullo quando si tenta di utilizzarlo per impostare la callback! Ho persino cercato di ri- camera = Camer.open() come camera = Camer.open() , ma ho un errore che dice "Imansible connettersi al servizio della camera".

    Ecco il codice del metodo 2:

     public class BackgroundService extends Service implements TextureView.SurfaceTextureListener { private Camera camera = null; private int NOTIFICATION_ID= 1; private static final String TAG = "OCVSample::Activity"; // Binder given to clients private final IBinder mBinder = new LocalBinder(); private WindowManager windowManager; private SurfaceTexture mSurfaceTexture= new SurfaceTexture (10); public class LocalBinder extends Binder { BackgroundService getService() { // Return this instance of this service so clients can call public methods return BackgroundService.this; } }//end inner class that returns an instance of the service. @Override public IBinder onBind(Intent intent) { return mBinder; }//end onBind. @Override public void onCreate() { // Start foreground service to avoid unexpected kill startForeground(NOTIFICATION_ID, buildNotification()); } private Notification buildNotification () { NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this); notificationBuilder.setOngoing(true); //this notification should be ongoing notificationBuilder.setContentTitle(getString(R.string.notification_title)) .setContentText(getString (R.string.notification_text_and_ticker)) .setSmallIcon(R.drawable.vecsat_logo) .setTicker(getString(R.string.notification_text_and_ticker)); return(notificationBuilder.build()); } @Override public void onDestroy() { Log.i(TAG, "surfaceDestroyed method"); } /***********Ok now all service related methods were implemented**************/ /************now implement surface texture related methods*****************/ @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int i, int i2) { //Now the surfaceTexture available, so we can create the camera. camera = Camera.open(1); mSurfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() { @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { Log.e(TAG, "frame captured"); } }); //now try to set the preview texture of the camera which is actually the surfaceTexture that has just been created. try { camera.setPreviewTexture(mSurfaceTexture); } catch (IOException e){ Log.e(TAG, "Error in setting the camera surface texture"); } camera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] bytes, Camera camera) { Log.e(TAG, "frame captured"); } }); // the preview was set, now start it camera.startPreview(); } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int i, int i2) { //super implementation is sufficient. } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { //stop the preview. camera.stopPreview(); //release camera resource: camera.release(); return false; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { mSurfaceTexture.setOnFrameAvailableListener(new SurfaceTexture.OnFrameAvailableListener() { @Override public void onFrameAvailable(SurfaceTexture surfaceTexture) { Log.e(TAG, "frame captured from update"); } }); camera.stopPreview(); //stop current preview. try { camera.setPreviewTexture(mSurfaceTexture); } catch (IOException e){ Log.e(TAG, "Error in setting the camera surface texture"); } camera.setPreviewCallback(new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] bytes, Camera camera) { Log.e(TAG, "frame captured"); } }); camera.startPreview(); // start the preview again. } 

    Ecco come chiamo il servizio da un'attività:

     @Override protected void onCreate(Bundle savedInstanceState) { //call the method in the super class.. super.onCreate(savedInstanceState); //inflate the xml layout. setContentView(R.layout.main); //prepare buttons. ImageButton startButton = (ImageButton) findViewById(R.id.start_btn); ImageButton stopButton = (ImageButton) findViewById(R.id.stop_btn); //prepare service intent: final Intent serviceIntent = new Intent(getApplicationContext(), BackgroundService.class); //set on click listeners for buttons (this should respond to normal touch events and simulated ones): startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //startActivity(serviceIntent); //start eye gazing mode as a service running in the background: isBound= getApplicationContext().bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE); } }); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //stop eye gazing mode as a service running in the background: getApplicationContext().unbindService(mConnection); } }); }//end onCreate. private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { BackgroundService.LocalBinder binder = (BackgroundService.LocalBinder) service; mService = binder.getService(); isBound = true; } @Override public void onServiceDisconnected(ComponentName className) { isBound = false; } }; 

    Aiuti prego, come posso get il callback per i frame? Ho provato molto ma non riuscivo a capire.

    Qualsiasi aiuto è altamente apprezzato se utilizza il metodo 1 o 2.

    Grazie.

  • Come ascoltare un URI personalizzato
  • java.lang.VerifyError
  • Iniettare codice in APK
  • Cordova SQLite: Imansible leggere la properties; 'transazione' di null
  • Perché il mio codice non viene aggiornato sulla mia app? (Dopo l'eclipse aggiornata)
  • Come smuovere AlertDialog.Builder?
  • L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.