SORU
15 Temmuz 2012, Pazar


Nasıl SurfaceHolder geri Aktivite yaşam döngüsü ile ilgili?

Bir yüzey üzerinde kamera önizleme gerektiren bir uygulama uygulamak için çalışıyorum. Şeyler görüyorum, hem aktivite ve yüzey ömürleri aşağıdaki durumları içerir:

  1. Ben benim ilk Etkinlik başlatmak zaman: onResume()->onSurfaceCreated()->onSurfaceChanged()
  2. Benim Etkinlik çıktığımda: onPause()->onSurfaceDestroyed()

Bu düzende, açık/serbest kamera gibi karşılık gelen çağrılar ve/onPause/onResume onSurfaceCreated()/onSurfaceDestroyed() önizleme durdurmak başlayabilirim.

Ekran kilidi sürece gayet iyi çalışıyor. Ben uygulamayı başlatmak, ekranı kilitle ve sonra kilidini açmak görüyorum

onPause() - ve sonra ekrana başka bir şey - o onResume() sonra unlock - kilitli ve hiçbir yüzey sonra geri aramaları. Aslında onResume() güç düğmesine basıldığında ekranda, ama kilit ekranı hala aktif, sonra denir, bu aktivite görünür hale geldiğinde bile önce.

Bu plan ile, ben siyah bir ekran sonra kilidini ve yüzey geri çağrılır.

İşte kamera, ama SurfaceHolder geri aramalar ile fiili çalışma içermeyen bir kod parçası. Sorun yukarıdaki telefonuma bu kodu bile ("Geri" düğmesini, ama eksik ekranı kilitlediğinizde): . bastığınızda geri normal bir sırayla verilir yeniden

class Preview extends SurfaceView implements SurfaceHolder.Callback {

    private static final String tag= "Preview";

    public Preview(Context context) {
        super(context);
        Log.d(tag, "Preview()");
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        Log.d(tag, "surfaceCreated");
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.d(tag, "surfaceDestroyed");
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Log.d(tag, "surfaceChanged");
    }
}

Yüzey Aktivite duraklatıldı sonra undestroyed kalır neden herhangi bir fikir? Ayrıca, böyle durumlarda kamera ömrü ne yapmalıyım?

CEVAP
2 Aralık 2012, Pazar


Her iki Aktivitenin yaşam döngüsü ve benim gingerbread üzerinde küçük bir kamera uygulaması telefonun SurfaceView baktım. Tamamen doğru; yüzeyi güç düğmesi telefonun uyku moduna basıldığında yok edilir. Telefon uyku moduna geçtiğinde, Aktivite onPause. (*.* 13) yok mu Bu biraz tuhaf olduğunu onResume telefon uyandığında, ve senin de işaret ettiğin gibi, kilit ekranı hala görünür olduğunda bunu yapar ve kabul giriş yapar. Etkinliğin Ev düğmesine basarak görünmez yaptığım zaman Etkinliği onPause onStop hem yok. Bir şey onPause sonu onStop başlangıcı arasında bu durumda surfaceDestroyed bir geri arama neden olur. Çok açık değil, ama çok tutarlı görünüyor.

Güç düğmesine bir şey açıkça bunu durdurmak için yapılır sürece telefon uyku bastırdı, zaman, kamera çalışmasını sağlar! Eğer varsa kamera bir Oturum ile her önizleme çerçeve için her görüntü için bir geri arama yapın.() d orada, günlük deyimleri telefon uyuyormuş gibi olsa da gelmeye devam ediyor. Olduğunu düşünüyorumÇok Sinsi.

Başka bir karışıklık olarak, surfaceCreated surfaceChanged için geri aramalar oldusonraYüzey faaliyet, onResume oluşturulmaktadır.

Bir kural olarak, SurfaceHolder geri aramalar uygulayan sınıf kamerayı idare ediyorum.

class Preview extends SurfaceView implements SurfaceHolder.Callback {
    private boolean previewIsRunning;
    private Camera camera;

    public void surfaceCreated(SurfaceHolder holder) {
        camera = Camera.open();
        // ...
        // but do not start the preview here!
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // set preview size etc here ... then
        myStartPreview();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        myStopPreview();
        camera.release();
        camera = null;
    }

   // safe call to start the preview
   // if this is called in onResume, the surface might not have been created yet
   // so check that the camera has been set up too.
   public void myStartPreview() {
       if (!previewIsRunning && (camera != null)) {
           camera.startPreview();
           previewIsRunning = true;
       }
   }

   // same for stopping the preview
   public void myStopPreview() {
       if (previewIsRunning && (camera != null)) {
           camera.stopPreview();
           previewIsRunning = false;
       }
   }
}

ve aktivitede sonra:

@Override public void onResume() {
    preview.myStartPreview();  // restart preview after awake from phone sleeping
    super.onResume();
}
@Override public void onPause() {
    preview.myStopPreview();  // stop preview in case phone is going to sleep
    super.onPause();
}

sorun benim için iş gibi görünüyor. Dönme olayları SurfaceView yok olur ve yeniden çok hangi Aktivite yok ve yeniden neden olur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alex maybury

    alex maybury

    20 Aralık 2007
  • arnejann

    arnejann

    3 Kasım 2007
  • Ricardo Cerqueira

    Ricardo Cerq

    28 Mayıs 2008