Kamera API'si

Android yapısı, aşağıdaki cihazlarda bulunan çeşitli kamera ve kamera özelliklerini destekler: kullanarak uygulamalarınızda fotoğraf ve video çekebilirsiniz. Bu belgede hızlı ve basit bir yaklaşım sunuyor. Ayrıca, video oluşturmak için gelişmiş bir yaklaşımı deneyebilirsiniz.

Not: Bu sayfada, Camera sınıfının desteği sonlandırılmıştır. Şunu kullanmanızı öneririz: KameraX Jetpack kitaplığı veya belirli kullanım örnekleri için camera2, sınıfını kullanır. Hem CameraX hem de Camera2, Android 5.0 (API düzeyi 21) ve daha yüksek.

Dikkat edilmesi gereken noktalar

Uygulamanızın Android cihazlarda kamera kullanımını etkinleştirmeden önce birkaç noktayı göz önünde bulundurmalısınız. Uygulamanızın bu donanım özelliğini nasıl kullanmayı amaçladığıyla ilgili sorular.

  • Kamera Gereksinimi: Kamera kullanmak işletmeniz için çok mu önemli? bulunmayan bir cihaza yüklenmiş olmasını istemediğiniz bir uygulamayı kamera var mı? Öyleyse kamera şartını manifesto içinde yeniden etkinleştirilmelidir.
  • Hızlı Resim veya Özelleştirilmiş Kamera: Uygulamanız kamera var mı? Sadece hızlı bir resim veya video klip çekmek mi istiyorsunuz yoksa uygulamanız kameraları kullanmak için yeni bir yöntem mi sağlıyor? Hızlı bir çekim veya klip için şunları yapabilirsiniz: Mevcut Kamera Uygulamalarını Kullanma. Özelleştirilmiş bir kamera özelliği geliştirmek için Kamera Uygulaması Oluşturma bölümüne bakın.
  • Ön Plan Hizmeti Şartı: Uygulamanız merak ediyor musunuz? Android 9 (API düzeyi 28) ve sonraki sürümlerde arka plan kameraya erişemiyor. Bu nedenle kamerayı veya bir reklamın parçası olarak veya ekrandayken ön plan hizmeti sunar.
  • Depolama alanı: Uygulamanızın oluşturduğu resim veya videolar yalnızca uygulamanız tarafından görülebilir veya Galeri veya diğer uygulamalar gibi medya uygulamaları ve sosyal uygulamalar bunları kullanabilir mi? Resimlerin ve videoların, yalnızca kaldırılır mı? Şu işlemler için Medya Dosyalarını Kaydetme bölümüne bakın: nasıl uygulayacağınızı öğrenin.

Temel bilgiler

Android yapısı, android.hardware.camera2 API veya kamera Intent. İlgili URL'ler sınıflar:

android.hardware.camera2
Bu paket, cihaz kameralarını kontrol etmek için kullanılan birincil API'dir. Bu rapor, resimler veya videolar paylaşabilirsiniz.
Camera
Bu sınıf, cihaz kameralarını kontrol etmek için desteği sonlandırılmış eski API'dir.
SurfaceView
Bu sınıf, kullanıcıya canlı kamera önizlemesi sunmak için kullanılır.
MediaRecorder
Bu sınıf, kameradan video kaydetmek için kullanılır.
Intent
Doğrudan olmadan resim veya video çekmek için MediaStore.ACTION_IMAGE_CAPTURE ya da MediaStore.ACTION_VIDEO_CAPTURE türünde intent işlemi kullanılabilir Camera nesnesini kullanır.

Manifest beyanları

Kamera API'si ile uygulamanızda geliştirmeye başlamadan önce manifest dosyanız, kamera donanımının ve diğer türden ilgili özellikler.

  • Kamera İzni - Uygulamanızın, bir cihazı kullanmak için izin istemesi gerekir bulun.
    <uses-permission android:name="android.permission.CAMERA" />
    

    Not: Kamerayı tarafından kullanıyorsanız mevcut bir kamera uygulamasını çağırın uygulamanızın bu izni istemesine gerek yok.

  • Kamera Özellikleri - Uygulamanız ayrıca kamera özelliklerinin kullanımını da beyan etmelidir, örneğin:
    <uses-feature android:name="android.hardware.camera" />
    

    Kamera özelliklerinin listesi için manifest dosyasına bakın Özellikler Referans.

    Manifest dosyanıza kamera özellikleri eklemeniz, Google Play'in uygulamanızın şunları yapmasını engellemesine neden olur: kamera içermeyen veya kamera özelliklerini desteklemeyen cihazlara yüklenmesi belirtin. Google Play'de özellik tabanlı filtreleme kullanma hakkında daha fazla bilgi için bkz. Google Oynatma ve Özellik Tabanlı Filtreleme.

    Uygulamanız düzgün çalışmak için kamera veya kamera özelliği kullanabiliyorsa ancak bunları kullanıyorsa zorunlu kılmak istemiyorsanız bunu manifest dosyasında android:required özelliğini ekleyip false olarak ayarlayarak belirtmeniz gerekir:

    <uses-feature android:name="android.hardware.camera" android:required="false" />
    
  • Depolama İzni: Uygulamanız, görselleri veya videoları Android 10'u (API düzeyi 29) hedefliyorsa cihazın harici depolama alanını (SD Kart) veya alt değerini alır ve manifest dosyasında aşağıdakini belirtir.
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • Ses Kayıt İzni: Video yakalama özelliğiyle ses kaydetmek için uygulamasının ses yakalama izni istemesi gerekir.
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  • Konum İzni: Uygulamanız resimleri etiketliyorsa GPS konum bilgileriyle birlikte, ACCESS_FINE_LOCATION izni gerekir. Uygulamanız Android 5.0 (API düzeyi 21) veya daha yüksekse uygulamanızın cihazın GPS'ini kullandığını da beyan etmeniz gerekir:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
    <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
    <uses-feature android:name="android.hardware.location.gps" />
    

    Kullanıcının konumunu alma hakkında daha fazla bilgi için bkz. Konum Stratejileri.

Mevcut kamera uygulamalarını kullanarak

Fazladan kod olmadan uygulamanızda resim veya video çekmenin hızlı bir yolu mevcut bir Android kamera uygulamasını çağırmak için Intent kullanmaktır. Ayrıntılar, Kolayca fotoğraf çekme Basit Video Kaydetme.

Kamera uygulaması oluşturma

Bazı geliştiriciler, cihazlarının görünümüne göre özelleştirilmiş bir kamera kullanıcı arayüzüne özellikler sunar. Kendi resim çekme kodunuzu yazma kullanıcılarınıza daha ilgi çekici bir deneyim sunabilir.

Not: Aşağıdaki kılavuz daha eski, desteği sonlandırılmış Camera içindir API'ye gidin. Yeni veya gelişmiş kamera uygulamaları için daha yeni android.hardware.camera2 API önerilir.

Uygulamanız için özel kamera arayüzü oluşturmaya yönelik genel adımlar aşağıda açıklanmıştır:

  • Kamerayı Algıla ve Eriş: Mevcut olup olmadığını kontrol etmek için kod oluşturun erişim izni isteyin.
  • Önizleme Sınıfı Oluştur - SurfaceView kapsamını genişleten ve SurfaceHolder arayüzünü uygulayan bir kamera önizleme sınıfı oluşturun. Bu sınıfı, kameradan canlı resimlerin önizlemesini yapar.
  • Önizleme Düzeni oluşturun - Kamera önizleme sınıfını aldıktan sonra denetimlerini ve kullanıcı arayüzü denetimlerini içeren görünüm düzenine sahip olması gerekir.
  • Capture için Dinleyicileri Ayarlayın - Arayüzünüz için dinleyicileri bağlayın Kullanıcı işlemlerine yanıt olarak görüntü veya video yakalamayı başlatmaya yönelik kontroller (ör. bir düğmesini tıklayın.
  • Dosyaları Yakala ve Kaydet - Resim çekmek veya resim çekmek için ve çıkışı kaydetmeniz gerekir.
  • Kamerayı bırakın - Kamerayı kullandıktan sonra uygulamanız diğer uygulamaların kullanımına uygun şekilde serbest bırakabilir.

Kamera donanımı, uygulamanızın dikkatle yönetilmesi için paylaşılan bir kaynaktır diğer uygulamalarla çakışmadığından emin olun. Aşağıdaki bölümlerde kamera donanımı nasıl tespit edilir, kameraya erişim nasıl istenir, resim veya video nasıl çekilir ve uygulamanız bittiğinde kamerayı nasıl serbest bırakacağınızı öğrenmek istiyoruz.

Dikkat: Camera etiketini yayınlamayı unutmayın nesnesini tanımlarken Camera.release() öğesini çağırarak bir şey yoktur! Uygulamanız kamerayı düzgün bir şekilde bırakmıyorsa dahil olmak üzere kameraya erişmek için sonraki teşebbüslerin başarısız olması, uygulamalarınızın veya diğer uygulamalarınızın kapatılmasına neden olabilir.

Kamera donanımı algılanıyor

Uygulamanız, özel olarak manifest beyanına sahip bir kamera kullanılmasını gerektirmiyorsa çalışma zamanında bir kamera olup olmadığını kontrol etmelidir. Bu kontrolü yapmak için aşağıdaki örnek kodda gösterildiği gibi PackageManager.hasSystemFeature() yöntemini kullanın:

Kotlin

/** Check if this device has a camera */
private fun checkCameraHardware(context: Context): Boolean {
    if (context.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        // this device has a camera
        return true
    } else {
        // no camera on this device
        return false
    }
}

Java

/** Check if this device has a camera */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

Android cihazların birden çok kamerası olabilir. Örneğin, fotoğrafçılık için bir arka kamera ve bir görüntülü görüşmeler için ön kamera. Android 2.3 (API Düzeyi 9) ve sonraki sürümler Camera.getNumberOfCameras() yöntemi kullanılarak cihazda kullanılabilen kamera sayısı.

Kameralara erişme

Uygulamanızın çalıştığı cihazda kamera olduğunu tespit ettiyseniz Camera örneği alarak erişim izni istemelidir (bunun için kameraya erişme niyeti kullananlar).

Birincil kameraya erişmek için Camera.open() yöntemini kullanın ve aşağıdaki kodda gösterildiği gibi istisnaları yakalamayı unutmayın:

Kotlin

/** A safe way to get an instance of the Camera object. */
fun getCameraInstance(): Camera? {
    return try {
        Camera.open() // attempt to get a Camera instance
    } catch (e: Exception) {
        // Camera is not available (in use or does not exist)
        null // returns null if camera is unavailable
    }
}

Java

/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
}

Dikkat: Camera.open() kullanırken istisnaları her zaman kontrol edin. Kamera açık olduğunda istisnalar kontrol edilemiyor uygulamanızın sistem tarafından kapatılmasına neden olur.

Android 2.3 (API Düzeyi 9) veya sonraki sürümleri çalıştıran cihazlarda belirli kameralara erişmek için şunları kullanabilirsiniz: Camera.open(int) Yukarıdaki örnek kod, birden fazla kamerası olan bir cihazdaki ilk arka kamera.

Kamera özellikleri kontrol ediliyor

Bir kameraya erişim sağladıktan sonra, kameranın sunduğu özellikler hakkında daha fazla bilgi edinmek için Camera.getParameters() yöntemini kullanıp desteklenen özellikler için Camera.Parameters nesnesi döndürdü. Bunu kullanırken API Düzeyi 9 veya sonraki sürümler varsa kameranın ön tarafta olup olmadığını belirlemek için Camera.getCameraInfo() kullanın ve resmin yönü gibi.

Önizleme sınıfı oluşturma

Kullanıcıların etkili bir şekilde resim veya video çekebilmesi için cihazın kamerasının ne olduğunu görebilmesi gerekir. görür. Kamera önizleme sınıfı, canlı resmi gösterebilen bir SurfaceView şeklindedir Kullanıcıların fotoğraf veya video çekmesi ve çerçevelemesi için kullandığı kameradan gelen veriler.

Aşağıdaki örnek kod, View düzenine dahil edildi. Bu sınıf, geri çağırma etkinliklerini yakalamak için SurfaceHolder.Callback öğesini uygular kamera önizleme girişini atamak için gerekli olan, görünümü oluşturmak ve yok etmek için kullanılır.

Kotlin

/** A basic Camera preview class */
class CameraPreview(
        context: Context,
        private val mCamera: Camera
) : SurfaceView(context), SurfaceHolder.Callback {

    private val mHolder: SurfaceHolder = holder.apply {
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        addCallback(this@CameraPreview)
        // deprecated setting, but required on Android versions prior to 3.0
        setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
    }

    override fun surfaceCreated(holder: SurfaceHolder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        mCamera.apply {
            try {
                setPreviewDisplay(holder)
                startPreview()
            } catch (e: IOException) {
                Log.d(TAG, "Error setting camera preview: ${e.message}")
            }
        }
    }

    override fun surfaceDestroyed(holder: SurfaceHolder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }

    override fun surfaceChanged(holder: SurfaceHolder, format: Int, w: Int, h: Int) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.
        if (mHolder.surface == null) {
            // preview surface does not exist
            return
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview()
        } catch (e: Exception) {
            // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        mCamera.apply {
            try {
                setPreviewDisplay(mHolder)
                startPreview()
            } catch (e: Exception) {
                Log.d(TAG, "Error starting camera preview: ${e.message}")
            }
        }
    }
}

Java

/** A basic Camera preview class */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
}

Kamera önizlemeniz için belirli bir boyut ayarlamak isterseniz bunu yukarıdaki yorumlarda belirtildiği gibi surfaceChanged() yönteminde ayarlayın. Önizleme boyutunu ayarlarken getSupportedPreviewSizes() değerlerinden kullanılmalıdır. setPreviewSize() yönteminde rastgele değerler ayarlamayın.

Not: Çoklu Pencere özelliği Android 7.0 (API düzeyi 24) ve sonraki sürümlerde Daha uzun önizlemenin en boy oranının etkinliğinizle aynı olduğunu varsayın setDisplayOrientation() arandıktan sonra bile. Pencere boyutuna ve en boy oranına bağlı olarak dikey bir düzende kamera önizlemesini veya tam tersini sinemaskop düzeni.

Düzene önizleme yerleştirme

Önceki bölümde gösterilen örnekte gösterildiği gibi bir kamera önizleme sınıfı, Fotoğraf veya video çekmek için kullanılan diğer kullanıcı arayüzü denetimleriyle birlikte bir etkinliğin düzeni. Bu bölümünde, önizleme için temel bir düzenin ve etkinliğin nasıl oluşturulacağı gösterilmektedir.

Aşağıdaki düzen kodu, bir kamerayı göstermek için kullanılabilecek çok temel bir görünüm sağlar. önizle. Bu örnekte, FrameLayout öğesinin amacı kamera önizleme sınıfının kapsayıcısıdır. Bu düzen türü, ek resmin bilgiler veya kontroller, canlı kamera önizleme resimlerinin üzerine yerleştirilebilir.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  <FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    />

  <Button
    android:id="@+id/button_capture"
    android:text="Capture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    />
</LinearLayout>

Çoğu cihazda kamera önizlemesinin varsayılan yönü yataydır. Bu örnek düzen bir yatay (yatay) düzeni belirtir ve aşağıdaki kod, yatay olarak kullanılmaktadır. Kamera önizlemesini oluşturmada daha kolay olması için aşağıdakini ekleyerek uygulamanızın önizleme etkinlik yönünü yatay olarak ayarlayabilirsiniz. manifest'ini kullanabilirsiniz.

<activity android:name=".CameraActivity"
          android:label="@string/app_name"

          android:screenOrientation="landscape">
          <!-- configure this activity to use landscape orientation -->

          <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Not: Kamera önizlemesinin yatay modda olması gerekmez. Android 2.2'den (API Düzeyi 8) başlayarak,setDisplayOrientation() önizleme resminin yönünü değiştirin. Kullanıcı yönünüzü yeniden yönlendirdikçe önizleme yönünü değiştirmek için telefon, önizleme sınıfınızın surfaceChanged() yönteminde ilk olarak Camera.stopPreview() ile önizlemeyi durdurun ve ardından önizlemeyi Camera.startPreview() ile tekrar başlatın.

Kamera görünümünüzle ilgili etkinlikte, önizleme sınıfınızı yukarıdaki örnekte gösterilen FrameLayout öğesine ekleyin. Kamera etkinliğiniz de duraklatıldığında veya kapatıldığında kamerayı serbest bıraktığından emin olun. Aşağıdaki örnekte, Oluşturma önizleme dersi'ni ziyaret edin.

Kotlin

class CameraActivity : Activity() {

    private var mCamera: Camera? = null
    private var mPreview: CameraPreview? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Create an instance of Camera
        mCamera = getCameraInstance()

        mPreview = mCamera?.let {
            // Create our Preview view
            CameraPreview(this, it)
        }

        // Set the Preview view as the content of our activity.
        mPreview?.also {
            val preview: FrameLayout = findViewById(R.id.camera_preview)
            preview.addView(it)
        }
    }
}

Java

public class CameraActivity extends Activity {

    private Camera mCamera;
    private CameraPreview mPreview;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create an instance of Camera
        mCamera = getCameraInstance();

        // Create our Preview view and set it as the content of our activity.
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);
    }
}

Not: Yukarıdaki örnekte yer alan getCameraInstance() yöntemi Kameralara erişim bölümünde gösterilen örnek yöntemi ifade eder.

Resim çekiliyor

Bir önizleme sınıfı ve bu sınıfı görüntüleyeceğiniz bir görünüm düzeni oluşturduğunuzda, aşağıdakileri yapmak için uygulamanızla resim çekmeye başlayın. Uygulama kodunuzda işleyicileri ayarlamalısınız kullanıcı arayüzü kontrollerinizin resim çekerek kullanıcı işlemine yanıt vermesini sağlar.

Bir resmi almak için Camera.takePicture() yöntemini kullanın. Bu yöntemde kameradan veri alan üç parametre kullanılır. Verileri JPEG biçiminde almak için, resim verilerini almak üzere bir Camera.PictureCallback arayüzü uygulamanız ve dosyayı bir dosyaya yazacağım. Aşağıdaki kod, kameradan alınan bir resmi kaydetmek için Camera.PictureCallback arayüzünün temel uygulamasını göstermektedir.

Kotlin

private val mPicture = Camera.PictureCallback { data, _ ->
    val pictureFile: File = getOutputMediaFile(MEDIA_TYPE_IMAGE) ?: run {
        Log.d(TAG, ("Error creating media file, check storage permissions"))
        return@PictureCallback
    }

    try {
        val fos = FileOutputStream(pictureFile)
        fos.write(data)
        fos.close()
    } catch (e: FileNotFoundException) {
        Log.d(TAG, "File not found: ${e.message}")
    } catch (e: IOException) {
        Log.d(TAG, "Error accessing file: ${e.message}")
    }
}

Java

private PictureCallback mPicture = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d(TAG, "Error creating media file, check storage permissions");
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
    }
};

Camera.takePicture() yöntemini çağırarak görüntü yakalamayı tetikleyin. Aşağıdaki örnek kod, bu yöntemin View.OnClickListener düğmesi.

Kotlin

val captureButton: Button = findViewById(R.id.button_capture)
captureButton.setOnClickListener {
    // get an image from the camera
    mCamera?.takePicture(null, null, picture)
}

Java

// Add a listener to the Capture button
Button captureButton = (Button) findViewById(R.id.button_capture);
captureButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // get an image from the camera
            mCamera.takePicture(null, null, picture);
        }
    }
);

Not: Aşağıdaki örnekte bulunan mPicture üyesi şunları sağlar: yukarıdaki örnek koda dönelim.

Dikkat: Camera etiketini yayınlamayı unutmayın nesnesini tanımlarken Camera.release() öğesini çağırarak bir şey yoktur! Kameranın serbest bırakılması hakkında bilgi için Kamerayı serbest bırakma başlıklı makaleye bakın.

Video yakalama

Android çerçevesi kullanılarak video yakalama işlemi, Camera nesnesinin dikkatli bir şekilde yönetilmesini ve MediaRecorder ile koordinasyonunu gerektirir. sınıfını kullanır. Camera ile video kaydederken MediaRecorder uygulamasının kamera donanımına erişmesine izin vermek için Camera.lock() ve Camera.unlock() çağrılarını yönetmeniz gerekir. ve Camera.open() ve Camera.release() çağrılarına ek olarak.

Not: Android 4.0 (API düzeyi 14) sürümünden itibaren Camera.lock() ve Camera.unlock() çağrıları sizin için otomatik olarak yönetilir.

Cihaz kamerasıyla resim çekmenin aksine, video çekmek için çok özel bir çağrı gerekir sipariş. Video çekimine başarıyla hazırlanmak ve video çekmek için belirli bir uygulama sırası izlemelisiniz. başvurunuzla birlikte aşağıda açıklandığı şekildedir.

  1. Kamerayı açın - Camera.open() uygulamasını kullanın kamera nesnesinin bir örneğini almak için kullanılır.
  2. Bağlantı Önizleme - Camera.setPreviewDisplay() ile kameraya bir SurfaceView bağlayarak canlı kamera görüntüsü önizlemesi hazırlayın.
  3. Önizlemeyi Başlat - Canlı kamera resimlerini göstermeye başlamak için Camera.startPreview() numaralı telefonu arayın.
  4. Video Kaydını Başlat: Aşağıdaki adımlar Sırala'yı seçin:
    1. Kameranın Kilidini Açın - Camera.unlock() numaralı telefonu arayarak MediaRecorder tarafından kullanılmak üzere kameranın kilidini açın.
    2. MediaRecorder'ı yapılandırın - Aşağıdaki MediaRecorder yöntemlerini bu sırayla çağırın. Daha fazla bilgi için MediaRecorder referans belgelerini inceleyin.
      1. setCamera() - Video çekimi için kullanılacak kamerayı ayarlayın, uygulamanızın mevcut örneğini kullanın / Camera.
      2. setAudioSource() - ses kaynağı, MediaRecorder.AudioSource.CAMCORDER kullan.
      3. setVideoSource() - Ayarla video kaynağı için MediaRecorder.VideoSource.CAMERA değerini kullanın.
      4. Video çıkış biçimini ve kodlamayı ayarlayın. Android 2.2 (API Düzeyi 8) ve daha yüksek ise MediaRecorder.setProfile yöntemini kullanın ve CamcorderProfile.get() ile bir profil örneği alın. Önceki Android sürümleri için: 2.2 için video çıkış biçimini ve kodlama parametrelerini ayarlamanız gerekir:
        1. setOutputFormat() - Ayarla çıkış biçimini, varsayılan ayarı veya MediaRecorder.OutputFormat.MPEG_4 değerini belirtin.
        2. setAudioEncoder() - Ayarla ses kodlama türünü, varsayılan ayarı veya MediaRecorder.AudioEncoder.AMR_NB değerini belirtin.
        3. setVideoEncoder() - Ayarla video kodlama türünü, varsayılan ayarı veya MediaRecorder.VideoEncoder.MPEG_4_SP değerini belirtin.
      5. setOutputFile() - Çıkış dosyasını ayarlayın, örnekteki getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() öğesini kullanın yöntemini Medya Dosyalarını Kaydetme bölümünde bulabilirsiniz.
      6. setPreviewDisplay() - Şu öğe için SurfaceView önizleme düzeni öğesini belirtin: en iyi yoludur. Bağlantı Önizlemesi için belirttiğiniz nesneyi kullanın.

      Dikkat: Bu MediaRecorder yapılandırma yöntemlerini bu sırayla çağırmalısınız. Aksi takdirde Bu durumda uygulama hatalarla karşılaşır ve kayıt başarısız olur.

    3. MediaRecorder'ı Hazırlama - MediaRecorder dosyasını hazırlayın sağlanan yapılandırma ayarlarıyla MediaRecorder.prepare() numaralı telefonu çağırın.
    4. MediaRecorder'ı başlat: MediaRecorder.start() numaralı telefonu arayarak video kaydetmeye başlayın.
  5. Video Kaydını Durdur: Aşağıdaki yöntemleri sırayla çağırın: Video kaydını başarıyla tamamlama:
    1. MediaRecorder'ı durdur - MediaRecorder.stop() numaralı telefonu arayarak video kaydını durdurun.
    2. MediaRecorder'ı Sıfırla: İsteğe bağlı olarak, yapılandırma ayarlarını şuradan kaldırın: MediaRecorder.reset() numaralı telefonu arayarak kaydediciyi tekrar kullanabilirsiniz.
    3. MediaRecorder'ı Yayınlayın - MediaRecorder öğesini yayınlayın MediaRecorder.release() numaralı telefonu arayarak.
    4. Kamerayı Kilitleyin - Sonraki MediaRecorder oturumlarının Camera.lock() numaralı telefonu arayarak kamerayı kullanabilmesi için kamerayı kilitleyin. Android 4.0 (API düzeyi 14) sürümünden itibaren, MediaRecorder.prepare() çağrısı başarısız oldu.
  6. Önizlemeyi Durdurun: Etkinliğiniz kamerayı kullanarak bittiğinde Camera.stopPreview() kullanarak önizleyin.
  7. Kamerayı Bırak - Diğer uygulamaların kullanabilmesi için kamerayı serbest bırakın Camera.release() numaralı telefonu arayarak.

Not: MediaRecorder kullanılabilir. Kamera önizlemesi oluşturmadan önce ve bu işlemin ilk birkaç adımını atlayın. Ancak, Kullanıcılar genellikle kaydı başlatmadan önce bir önizleme görmeyi tercih ettiklerinden, bu işlem ayrı ayrı tartıştık.

İpucu: Uygulamanız genellikle video kaydı için kullanılıyorsa başlamadan önce setRecordingHint(boolean) - true arasında önizle. Bu ayar, kaydı başlatmak için gereken süreyi azaltmaya yardımcı olabilir.

MediaRecorder'ı yapılandırma

Video kaydetmek için MediaRecorder sınıfını kullanırken şunları gerçekleştirmelisiniz: yapılandırma adımlarını belirli bir sırada izler ve ardından MediaRecorder.prepare() yöntemini çağırarak yapılandırma. Aşağıdaki örnek kod, Video kaydı için MediaRecorder sınıf.

Kotlin

private fun prepareVideoRecorder(): Boolean {
    mediaRecorder = MediaRecorder()

    mCamera?.let { camera ->
        // Step 1: Unlock and set camera to MediaRecorder
        camera?.unlock()

        mediaRecorder?.run {
            setCamera(camera)

            // Step 2: Set sources
            setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
            setVideoSource(MediaRecorder.VideoSource.CAMERA)

            // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
            setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))

            // Step 4: Set output file
            setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString())

            // Step 5: Set the preview output
            setPreviewDisplay(mPreview?.holder?.surface)

            setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
            setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
            setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT)


            // Step 6: Prepare configured MediaRecorder
            return try {
                prepare()
                true
            } catch (e: IllegalStateException) {
                Log.d(TAG, "IllegalStateException preparing MediaRecorder: ${e.message}")
                releaseMediaRecorder()
                false
            } catch (e: IOException) {
                Log.d(TAG, "IOException preparing MediaRecorder: ${e.message}")
                releaseMediaRecorder()
                false
            }
        }

    }
    return false
}

Java

private boolean prepareVideoRecorder(){

    mCamera = getCameraInstance();
    mediaRecorder = new MediaRecorder();

    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    // Step 4: Set output file
    mediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

    // Step 5: Set the preview output
    mediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}

Android 2.2'den (API Düzeyi 8) önce, çıkış biçimini ve kodlama biçimlerini ayarlamanız gerekir. parametrelerini doğrudan CamcorderProfile yerine. Bu yaklaşım aşağıdaki kodda gösterildiği gibidir:

Kotlin

    // Step 3: Set output format and encoding (for versions prior to API Level 8)
    mediaRecorder?.apply {
        setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
        setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT)
    }

Java

    // Step 3: Set output format and encoding (for versions prior to API Level 8)
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

MediaRecorder için aşağıdaki video kayıt parametreleri verilmiştir ancak, uygulamanız için bu ayarları düzenlemek isteyebilirsiniz:

MediaRecorder'ı başlatma ve durdurma

MediaRecorder sınıfını kullanarak video kaydını başlatır ve durdururken: aşağıda listelenen belirli bir sırayı takip etmeniz gerekir.

  1. Camera.unlock() ile kameranın kilidini açın
  2. MediaRecorder öğesini yukarıdaki kod örneğinde gösterildiği gibi yapılandırın
  3. MediaRecorder.start() uygulamasını kullanarak kaydı başlat
  4. Videoyu kaydet
  5. MediaRecorder.stop() uygulamasını kullanarak kaydı durdur
  6. Medya kaydediciyi MediaRecorder.release() ile bırakın
  7. Camera.lock() uygulamasını kullanarak kamerayı kilitleyin

Aşağıdaki örnek kod, bir düğmeyi doğru şekilde başlatmak ve durdurmak için nasıl bağlayacağınızı gösterir MediaRecorder sınıfını kullanarak video kaydı yapmasına izin veriliyor.

Not: Video kaydını tamamlarken kamerayı serbest bırakmayın Aksi takdirde önizlemeniz durdurulur.

Kotlin

var isRecording = false
val captureButton: Button = findViewById(R.id.button_capture)
captureButton.setOnClickListener {
    if (isRecording) {
        // stop recording and release camera
        mediaRecorder?.stop() // stop the recording
        releaseMediaRecorder() // release the MediaRecorder object
        mCamera?.lock() // take camera access back from MediaRecorder

        // inform the user that recording has stopped
        setCaptureButtonText("Capture")
        isRecording = false
    } else {
        // initialize video camera
        if (prepareVideoRecorder()) {
            // Camera is available and unlocked, MediaRecorder is prepared,
            // now you can start recording
            mediaRecorder?.start()

            // inform the user that recording has started
            setCaptureButtonText("Stop")
            isRecording = true
        } else {
            // prepare didn't work, release the camera
            releaseMediaRecorder()
            // inform user
        }
    }
}

Java

private boolean isRecording = false;

// Add a listener to the Capture button
Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isRecording) {
                // stop recording and release camera
                mediaRecorder.stop();  // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
                mCamera.lock();         // take camera access back from MediaRecorder

                // inform the user that recording has stopped
                setCaptureButtonText("Capture");
                isRecording = false;
            } else {
                // initialize video camera
                if (prepareVideoRecorder()) {
                    // Camera is available and unlocked, MediaRecorder is prepared,
                    // now you can start recording
                    mediaRecorder.start();

                    // inform the user that recording has started
                    setCaptureButtonText("Stop");
                    isRecording = true;
                } else {
                    // prepare didn't work, release the camera
                    releaseMediaRecorder();
                    // inform user
                }
            }
        }
    }
);

Not: Yukarıdaki örnekte, prepareVideoRecorder() yöntemi, MediaRecorder'ı Yapılandırma bölümünde gösterilen örnek kod anlamına gelir. Bu yöntemle, cihazın kilitlenmesi MediaRecorder örneğini yapılandırıp hazırlama.

Kamera serbest bırakma

Kameralar, bir cihazdaki uygulamalar tarafından paylaşılan kaynaklardır. Uygulamanız, Camera örneği aldıktan sonra kamerayı da kullanabilirsiniz. özellikle uygulamanız çalışmayı durdurduğunda kamera nesnesini bırakmaya dikkat edin ve uygulamanız duraklatıldığında (Activity.onPause()) kısa bir süre içinde görünür. Eğer uygulamanız kamerayı doğru şekilde serbest bırakmazsa, kameraya daha sonra erişmek için yapılan tüm denemelerde, başarısız olur ve sizin veya diğer uygulamalarınızın devre dışı bırakılmasına neden olabilir. kapatabilirsiniz.

Camera nesnesinin bir örneğini serbest bırakmak için aşağıdaki örnek kodda gösterildiği gibi Camera.release() yöntemini kullanın.

Kotlin

class CameraActivity : Activity() {
    private var mCamera: Camera?
    private var preview: SurfaceView?
    private var mediaRecorder: MediaRecorder?

    override fun onPause() {
        super.onPause()
        releaseMediaRecorder() // if you are using MediaRecorder, release it first
        releaseCamera() // release the camera immediately on pause event
    }

    private fun releaseMediaRecorder() {
        mediaRecorder?.reset() // clear recorder configuration
        mediaRecorder?.release() // release the recorder object
        mediaRecorder = null
        mCamera?.lock() // lock camera for later use
    }

    private fun releaseCamera() {
        mCamera?.release() // release the camera for other applications
        mCamera = null
    }
}

Java

public class CameraActivity extends Activity {
    private Camera mCamera;
    private SurfaceView preview;
    private MediaRecorder mediaRecorder;

    ...

    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first
        releaseCamera();              // release the camera immediately on pause event
    }

    private void releaseMediaRecorder(){
        if (mediaRecorder != null) {
            mediaRecorder.reset();   // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

    private void releaseCamera(){
        if (mCamera != null){
            mCamera.release();        // release the camera for other applications
            mCamera = null;
        }
    }
}

Dikkat: Uygulamanız, Google Etiket Yöneticisi'ni kullanarak kendi uygulamanız tarafından yapılanlar da dahil olmak üzere kameraya erişmek için sonraki tüm denemeler, başarısız olur ve uygulamalarınızın veya diğer uygulamalarınızın kapatılmasına neden olabilir.

Medya dosyaları kaydediliyor

Kullanıcılar tarafından oluşturulan resim ve video gibi medya dosyaları, cihazın harici depolama dizinini (SD Kart) kullanarak sistem alanından tasarruf etmek ve kullanıcıların bu dosyalara erişmesini sağlamak paylaşma fırsatınız olacak. Medya dosyalarını bir cihaza kaydetmek için pek çok olası dizin konumu vardır. Ancak geliştirici olarak düşünmeniz gereken yalnızca iki standart konum vardır:

  • Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) - Bu yöntem, paylaşılan ve önerilen standart değeri döndürür resim ve videolar kaydetmek için konum bilgisi. Bu dizin paylaşılıyor (herkese açık). Bu nedenle diğer uygulamalar , bu konuma kaydedilen dosyaları kolayca keşfedebilir, okuyabilir, değiştirebilir ve silebilir. Başvurunuz kullanıcı tarafından kaldırıldığında, bu konuma kaydedilen medya dosyaları kaldırılmayacak. Kaçınılması gerekenler müdahale etmek için, kullanıcılarınızın mevcut resimlerine ve videolarına müdahale etmek istiyorsanız, aşağıdaki kod örneğinde gösterildiği gibi, bu dizin içindeki uygulamanın medya dosyalarını da destekler. Bu yöntem önceki API sürümlerinde eşdeğer çağrılar için Paylaşılan Dosyaları Kaydetme'ye bakın.
  • Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES): Bu yöntem, kaydetmek için standart bir konum döndürür uygulamanızla ilişkilendirilen resimler ve videolar. Uygulamanızın yüklemesi kaldırılırsa bu konuma kaydedilen tüm dosyalar kaldırılır. Bu konum ve diğer uygulamalar bunları okuyabilir, değiştirebilir ve silebilir.

Aşağıdaki örnek kodda, bir cihazın kamerasının çağrılması sırasında kullanılabilecek bir medya dosyası için File veya Uri konumunun nasıl oluşturulacağı gösterilmektedir Intent veya Kamera Oluşturma işleminin parçası olarak Uygulaması.

Kotlin

val MEDIA_TYPE_IMAGE = 1
val MEDIA_TYPE_VIDEO = 2

/** Create a file Uri for saving an image or video */
private fun getOutputMediaFileUri(type: Int): Uri {
    return Uri.fromFile(getOutputMediaFile(type))
}

/** Create a File for saving an image or video */
private fun getOutputMediaFile(type: Int): File? {
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    val mediaStorageDir = File(
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp"
    )
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    mediaStorageDir.apply {
        if (!exists()) {
            if (!mkdirs()) {
                Log.d("MyCameraApp", "failed to create directory")
                return null
            }
        }
    }

    // Create a media file name
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    return when (type) {
        MEDIA_TYPE_IMAGE -> {
            File("${mediaStorageDir.path}${File.separator}IMG_$timeStamp.jpg")
        }
        MEDIA_TYPE_VIDEO -> {
            File("${mediaStorageDir.path}${File.separator}VID_$timeStamp.mp4")
        }
        else -> null
    }
}

Java

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
}

/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "MyCameraApp");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

Not: Environment.getExternalStoragePublicDirectory(), Android 2.2 (API Düzeyi 8) veya daha yüksek. Android'in önceki sürümlerine sahip cihazları hedefliyorsanız Environment.getExternalStorageDirectory() kullanın. . Daha fazla bilgi için Paylaşılan Dosyaları Kaydetme konusuna bakın.

URI'nın iş profillerini desteklemesi için önce dosya URI'sini içerik URI'sine dönüştürün. Sonra, içerik URI'sini EXTRA_OUTPUT Intent.

Android cihaza dosya kaydetme hakkında daha fazla bilgi edinmek için Veri Depolama başlıklı makaleyi inceleyin.

Kamera özellikleri

Android, kamera uygulamanızla kontrol edebileceğiniz çok çeşitli kamera özelliklerini destekler. resim biçimi, flaş modu, odak ayarları ve daha birçok ayar vardır. Bu bölümde, proje yöneticilerinin ve bunların nasıl kullanılacağına kısaca değineceğiz. Çoğu kamera özelliğine erişip ayarlanabilir aracılığıyla Camera.Parameters nesnesini kullanabilirsiniz. Ancak pek çok farklı Camera.Parameters ürününde basit ayarlardan daha fazlasını gerektiren önemli özellikler. Bu özellikler aşağıdaki bölümlerde ele alınmıştır:

Camera.Parameters üzerinden kontrol edilen özelliklerin nasıl kullanılacağı hakkında genel bilgi için Kamerayı kullanma özellikler bölümüne bakın. kamera parametreleri nesnesi olarak), API referansı için aşağıdaki özellik listesinde bulunan bağlantıları izleyin belgelerinden faydalanabilirsiniz.

Tablo 1. Yaygın olarak kullanılan kamera özellikleri, Android API Düzeyi'ne göre sıralanmıştır. tanıtıldı.

Özellik API Düzeyi Açıklama
Yüz Algılama 14 Resimdeki insan yüzlerini tanımlar ve bu yüzleri odaklama, ölçüm ve beyaz için kullanın bakiye
Sayaç Alanları 14 Beyaz dengesini hesaplamak için bir resim içinde bir veya daha fazla alan belirtin
Odaklanılan Alanlar 14 Odaklanmak için resimdeki bir veya daha fazla alanı ayarlayın
White Balance Lock 14 Otomatik beyaz dengesi ayarlamalarını durdurma veya başlatma
Exposure Lock 14 Otomatik pozlama ayarlamalarını durdurma veya başlatma
Video Snapshot 14 Video çekerken fotoğraf çekme (kareyi yakalama)
Zaman Atlama Videosu 11 Zaman atlamalı video kaydetmek için kareleri ayarlanmış gecikmelerle kaydedin
Multiple Cameras 9 Bir cihazda ön ve arka yüz de dahil olmak üzere birden fazla kamera desteği kameralar
Focus Distance 9 Kamera ile odaktaymış gibi görünen nesneler arasındaki mesafeleri bildirir
Zoom 8 Resim büyütmeyi ayarlayın
Exposure Compensation 8 Işık pozlama seviyesini artır veya azalt
GPS Data 5 Görsele coğrafi konum verilerini ekleyin veya dahil etmeyin
White Balance 5 Çekilen görüntüdeki renk değerlerini etkileyen beyaz dengesi modunu ayarlayın
Focus Mode 5 Kameranın otomatik, sabit, makro veya sonsuzluk gibi bir özneye nasıl odaklanacağını ayarlayın
Scene Mode 5 Gece, plaj, kar gibi belirli fotoğrafçılık durumu türleri için önceden ayarlanmış bir mod uygula veya mum ışığı sahneleri
JPEG Quality 5 JPEG resmi için, resim çıkış dosyasını artıran veya azaltan sıkıştırma düzeyini ayarlayın kalite ve boyut
Flash Mode 5 Flaşı açma, kapatma veya otomatik ayarı kullanma
Color Effects 5 Çekilen resme siyah beyaz, sepya tonu veya negatif gibi bir renk efekti uygulayın.
Anti-Banding 5 JPEG sıkıştırması nedeniyle renk gradyanlarında şerit oluşumunun etkisini azaltır
Picture Format 1 Resmin dosya biçimini belirtin
Picture Size 1 Kaydedilen resmin piksel boyutlarını belirtin

Not: Bu özellikler aşağıdaki nedenlerden dolayı tüm cihazlarda desteklenmez: donanım farklılıkları ve yazılım uygulaması. Müsaitlik durumunu kontrol etme hakkında bilgi için özellikleri hakkında bilgi edinmek için Kontrol etme özellik kullanılabilirliği hakkında daha fazla bilgi edinin.

Özelliklerin kullanılabilirliği kontrol ediliyor

Android cihazlarda kamera özelliklerini kullanmak için ilk başlamanız gereken şey şu: tüm kamera özellikleri her cihazda desteklenmez. Ayrıca belirli bir uygulamayı destekleyen özellik, bunları farklı düzeylerde veya farklı seçeneklerle destekleyebilir. Bu nedenle, karar süreci, yeni bir kamera uygulaması geliştirmek istediğiniz kamera özelliklerine karar vermektir. hangi seviyeye taşındığını anlamanızı sağlar. Bu kararı verdikten sonra web sitenize kod eklemeyi cihaz donanımının bu özellikleri destekleyip desteklemediğini kontrol eden ve başarısız olduğunu kontrol eden kamera uygulaması veya mevcut bir özellik yoksa da

Kamera parametrelerinin bir örneğini alarak kamera özelliklerinin kullanılabilirliğini kontrol edebilirsiniz ve ilgili yöntemleri kontrol etmektir. Aşağıdaki kod örneğinde, bir Camera.Parameters nesne seçin ve kameranın otomatik odaklamayı destekleyip desteklemediğini kontrol edin özellik:

Kotlin

val params: Camera.Parameters? = camera?.parameters
val focusModes: List<String>? = params?.supportedFocusModes
if (focusModes?.contains(Camera.Parameters.FOCUS_MODE_AUTO) == true) {
    // Autofocus mode is supported
}

Java

// get Camera parameters
Camera.Parameters params = camera.getParameters();

List<String> focusModes = params.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
  // Autofocus mode is supported
}

Çoğu kamera özelliği için yukarıda gösterilen tekniği kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan Camera.Parameters nesnesi, bir özelliğin başarılı olup olmadığını (ve ne ölçüde) belirlemek için bir getSupported...(), is...Supported() veya getMax...() yöntemi sağlar desteklenir.

Uygulamanızın düzgün çalışması için belirli kamera özellikleri gerekiyorsa şunları yapabilirsiniz: uygulama manifestinize eklenerek bunları gerekli kılmayı amaçlar. Belirli ve otomatik odaklama gibi kamera özelliklerine sahipken Google Play, uygulamanızın ve bu özellikleri desteklemeyen cihazlara yüklenmesidir. Dahil olan kamera özelliklerinin uygulama manifestinizde beyan edilebilir. Manifest'e bakın. Özellikleri Referans.

Kamera özelliklerini kullanma

Çoğu kamera özelliği, Camera.Parameters nesnesi kullanılarak etkinleştirilir ve kontrol edilir. Bu nesneyi, önce Camera nesnesini değiştirerek getParameters() yöntemini çağırarak döndürülen parametrenin değiştirilmesi ardından aşağıdaki örnekte gösterildiği gibi, nesneye alıp tekrar kamera nesnesine yerleştirmek kod:

Kotlin

val params: Camera.Parameters? = camera?.parameters
params?.focusMode = Camera.Parameters.FOCUS_MODE_AUTO
camera?.parameters = params

Java

// get Camera parameters
Camera.Parameters params = camera.getParameters();
// set the focus mode
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
// set Camera parameters
camera.setParameters(params);

Bu teknik neredeyse tüm kamera özellikleri için geçerlidir ve çoğu parametre herhangi bir zamanda değiştirilebilir Camera nesnesinin bir örneğini aldıktan sonra geçen süre. Şu değişiklikler var: parametreleri genellikle uygulamanın kamera önizlemesinde kullanıcı tarafından hemen görülebilir. Yazılım tarafında ise, parametre değişikliklerinin gerçek zamanlı olarak geçerli olması için kamera donanımı yeni talimatları işler ve ardından güncellenmiş görüntü verilerini gönderir.

Önemli: Bazı kamera özellikleri istediğiniz zaman değiştirilemez. İçinde özel olarak, kamera önizlemesinin boyutunu veya yönünü değiştirmek için önce önizlemeyi değiştirin, önizleme boyutunu değiştirin ve ardından önizlemeyi yeniden başlatın. Android 4.0 (API) sürümünden itibaren 14. Seviye) önizleme yönü, önizleme yeniden başlatılmadan değiştirilebilir.

Aşağıdakiler gibi diğer kamera özelliklerinin uygulanması için daha fazla kod gerekir:

  • Ölçme ve odak alanları
  • Yüz algılama
  • Zaman atlamalı video

Aşağıdaki bölümlerde, bu özelliklerin nasıl uygulanacağına ilişkin kısa bir özet sunulmaktadır.

Ölçme ve odak alanları

Bazı fotoğrafik senaryolarda, otomatik odaklanma ve ışık sayacı yardımcı olur. Android 4.0 (API Düzeyi 14) sürümünden itibaren, kamera uygulamanız uygulamanızın veya kullanıcıların bir resimdeki alanları belirlerken kullanacakları alanları belirtmesine olanak tanıyan ek kontroller odak veya ışık seviyesi ayarlarını yapabilir ve bu değerleri, çekimde kullanılması için kamera resim veya video.

Ölçme ve odaklama alanları, kontrol ettiğiniz diğer kamera özelliklerine çok benzer. bunları Camera.Parameters nesnesindeki yöntemlerle değiştirebilirsiniz. Aşağıdaki kod Bu örnek için iki ışık ölçme alanının ayarlanması Camera:

Kotlin

// Create an instance of Camera
camera = getCameraInstance()

// set Camera parameters
val params: Camera.Parameters? = camera?.parameters

params?.apply {
    if (maxNumMeteringAreas > 0) { // check that metering areas are supported
        meteringAreas = ArrayList<Camera.Area>().apply {
            val areaRect1 = Rect(-100, -100, 100, 100) // specify an area in center of image
            add(Camera.Area(areaRect1, 600)) // set weight to 60%
            val areaRect2 = Rect(800, -1000, 1000, -800) // specify an area in upper right of image
            add(Camera.Area(areaRect2, 400)) // set weight to 40%
        }
    }
    camera?.parameters = this
}

Java

// Create an instance of Camera
camera = getCameraInstance();

// set Camera parameters
Camera.Parameters params = camera.getParameters();

if (params.getMaxNumMeteringAreas() > 0){ // check that metering areas are supported
    List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();

    Rect areaRect1 = new Rect(-100, -100, 100, 100);    // specify an area in center of image
    meteringAreas.add(new Camera.Area(areaRect1, 600)); // set weight to 60%
    Rect areaRect2 = new Rect(800, -1000, 1000, -800);  // specify an area in upper right of image
    meteringAreas.add(new Camera.Area(areaRect2, 400)); // set weight to 40%
    params.setMeteringAreas(meteringAreas);
}

camera.setParameters(params);

Camera.Area nesnesi iki veri parametresi içerir: Kameranın görüş alanı içinde bir alan belirtmek için kullanılan Rect nesnesi ve bir ağırlık değeri (kameraya bu alanın ışık sayacında hangi önem düzeyinin verilmesi gerektiğini söyler) ya da odak hesaplamalarını kullanın.

Camera.Area nesnesindeki Rect alanı , 2000 x 2000'lik bir birim ızgara üzerine eşlenen dikdörtgen bir şekli ifade etmektedir. -1000, -1000 koordinatları , kamera görüntüsünün üst, sol köşesini ve 1000, 1000 koordinatları aşağıdaki resimde gösterildiği gibi kamera resminin sağ alt köşesine dokunun.

Şekil 1. Kırmızı çizgiler, koordinat sistemini yalnızca bir Kamera önizlemesinde Camera.Area. Mavi kutu konumu gösterir ve Rect değerleri 333,333,667,667 olan kamera alanının şekli.

Bu koordinat sisteminin sınırları, her zaman Önizleme'yi seçin ve yakınlaştırma düzeyinde küçültmeyin veya genişletmeyin. Benzer bir şekilde, resim Camera.setDisplayOrientation() uygulamasını kullanarak önizle koordinat sistemini yeniden eşlemez.

Yüz algılama

Kişi içeren resimlerde yüzler genellikle resmin en önemli kısmıdır ve özelliği, resim çekerken hem odak hem de beyaz dengesini belirlemek için kullanılmalıdır. Android 4.0 (API Seviye 14) çerçevesi, API'leri kullanarak yüzleri tanımlamak ve resim ayarlarını hesaplamak için yüz tanıma teknolojisinden yararlanın.

Not: Yüz algılama özelliği çalışırken setWhiteBalance(String), setFocusAreas(List<Camera.Area>) ve setMeteringAreas(List<Camera.Area>) özelliğinin herhangi bir etkisi yok.

Kamera uygulamanızda yüz algılama özelliğini kullanmak için birkaç genel adım uygulamanız gerekir:

  • Cihazda yüz algılama özelliğinin desteklendiğinden emin olun
  • Yüz algılama dinleyicisi oluşturun
  • Yüz algılama dinleyiciyi kameranızdaki nesneye ekleyin
  • Önizlemeden sonra (ve her önizleme yeniden başlatıldıktan sonra) yüz algılamayı başlat

Yüz algılama özelliği tüm cihazlarda desteklenmez. Bu özelliğin, yeni özellikler olup olmadığını getMaxNumDetectedFaces() numaralı telefon aranarak desteklenir. Bu kontrolün örneği, aşağıdaki startFaceDetection() örnek yönteminde gösterilmiştir.

Bir yüz algılandığında bildirim almak ve buna yanıt vermek için kamera uygulamanızın ayarlı olması gerekir yüz algılama etkinlikleri için bir dinleyicidir. Bunu yapmak için şu özelliklere sahip bir işleyici sınıfı oluşturmanız gerekir: Camera.FaceDetectionListener arayüzünü aşağıda gösterildiği gibi uygular aşağıdaki örnek kodu kullanabilirsiniz.

Kotlin

internal class MyFaceDetectionListener : Camera.FaceDetectionListener {

    override fun onFaceDetection(faces: Array<Camera.Face>, camera: Camera) {
        if (faces.isNotEmpty()) {
            Log.d("FaceDetection", ("face detected: ${faces.size}" +
                    " Face 1 Location X: ${faces[0].rect.centerX()}" +
                    "Y: ${faces[0].rect.centerY()}"))
        }
    }
}

Java

class MyFaceDetectionListener implements Camera.FaceDetectionListener {

    @Override
    public void onFaceDetection(Face[] faces, Camera camera) {
        if (faces.length > 0){
            Log.d("FaceDetection", "face detected: "+ faces.length +
                    " Face 1 Location X: " + faces[0].rect.centerX() +
                    "Y: " + faces[0].rect.centerY() );
        }
    }
}

Bu sınıfı oluşturduktan sonra, uygulamanızın Camera nesnesini tanımlayın:

Kotlin

camera?.setFaceDetectionListener(MyFaceDetectionListener())

Java

camera.setFaceDetectionListener(new MyFaceDetectionListener());

Uygulamanız, kamera önizlemesi. Gerektiğinde gösterildiği gibi çağırabilmek için yüz algılamayı başlatmak üzere bir yöntem oluşturun aşağıdaki örnek kodda verilmiştir.

Kotlin

fun startFaceDetection() {
    // Try starting Face Detection
    val params = mCamera?.parameters
    // start face detection only *after* preview has started

    params?.apply {
        if (maxNumDetectedFaces > 0) {
            // camera supports face detection, so can start it:
            mCamera?.startFaceDetection()
        }
    }
}

Java

public void startFaceDetection(){
    // Try starting Face Detection
    Camera.Parameters params = mCamera.getParameters();

    // start face detection only *after* preview has started
    if (params.getMaxNumDetectedFaces() > 0){
        // camera supports face detection, so can start it:
        mCamera.startFaceDetection();
    }
}

Kamera önizlemesini her başlattığınızda yüz algılamayı başlatmanız (veya yeniden başlatmanız) gerekir. Eğer Önizleme sınıfı oluşturma bölümünde gösterilen önizleme sınıfını kullanıyorsanız, startFaceDetection() yöntemini kullanarak Önizleme sınıfınızda surfaceCreated() ve surfaceChanged() yöntemleri, aşağıdaki örnek kodda gösterildiği gibidir.

Kotlin

override fun surfaceCreated(holder: SurfaceHolder) {
    try {
        mCamera.setPreviewDisplay(holder)
        mCamera.startPreview()

        startFaceDetection() // start face detection feature
    } catch (e: IOException) {
        Log.d(TAG, "Error setting camera preview: ${e.message}")
    }
}

override fun surfaceChanged(holder: SurfaceHolder, format: Int, w: Int, h: Int) {
    if (holder.surface == null) {
        // preview surface does not exist
        Log.d(TAG, "holder.getSurface() == null")
        return
    }
    try {
        mCamera.stopPreview()
    } catch (e: Exception) {
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error stopping camera preview: ${e.message}")
    }
    try {
        mCamera.setPreviewDisplay(holder)
        mCamera.startPreview()

        startFaceDetection() // re-start face detection feature
    } catch (e: Exception) {
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error starting camera preview: ${e.message}")
    }
}

Java

public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

        startFaceDetection(); // start face detection feature

    } catch (IOException e) {
        Log.d(TAG, "Error setting camera preview: " + e.getMessage());
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

    if (holder.getSurface() == null){
        // preview surface does not exist
        Log.d(TAG, "holder.getSurface() == null");
        return;
    }

    try {
        mCamera.stopPreview();

    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error stopping camera preview: " + e.getMessage());
    }

    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

        startFaceDetection(); // re-start face detection feature

    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}

Not: Çağrı yaptıktan sonra bu yöntemi çağırmayı unutmayın. startPreview(). Yüz algılamayı başlatmaya çalışmayın kamera uygulamanızın ana etkinliğinin onCreate() yönteminde önizleme, uygulamanızın yürütmesinde bu noktada kullanılamaz.

Zaman atlamalı video

Zaman atlamalı video, kullanıcıların birkaç saniye veya birkaç saniyede çekilen resimleri birleştiren video klipler oluşturmasına olanak tanır. dakika arayla. Bu özellik, resimleri belirli bir süreliğine kaydetmek için MediaRecorder kullanır atlama dizisidir.

MediaRecorder ile zaman atlamalı video kaydetmek için kaydedici nesnesini görüntüler. Normal bir video kaydeder gibisiniz. Saniyedeki kare sayısını en az aşağıdaki kod örneğinde gösterildiği gibi, zaman atlamalı kalite ayarlarından birini kullanarak düşük bir sayı ve zaman atlama kalitesi ayarlarından birini seçebilirsiniz.

Kotlin

mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH))
mediaRecorder.setCaptureRate(0.1) // capture a frame every 10 seconds

Java

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH));
...
// Step 5.5: Set the video capture rate to a low number
mediaRecorder.setCaptureRate(0.1); // capture a frame every 10 seconds

Bu ayarlar, MediaRecorder için daha büyük bir yapılandırma prosedürü kapsamında yapılmalıdır. Tam yapılandırma kodu örneği için MediaRecorder'ı Yapılandırma bölümüne bakın. Yapılandırma tamamlandıktan sonra Video kaydını normal bir video klip kaydeder gibi başlatırsınız. Okuyucu Gelirleri Yöneticisi'ni MediaRecorder ayarlarını yapılandırma ve çalıştırma hakkında bilgi için Video çekme bölümüne bakın.

Kamera2Video ve HdrViewfinder'ı kullanın. örnekler, bu sayfada ele alınan API'lerin kullanımını daha ayrıntılı şekilde gösterir.

İzin gerektiren kamera alanları

Android 10 (API düzeyi 29) veya sonraki sürümleri çalıştıran uygulamalar CAMERA iznini kullanarak aşağıdaki alanların değerlerine getCameraCharacteristics() yöntemi şunu döndürür:

  • LENS_POSE_ROTATION
  • LENS_POSE_TRANSLATION
  • LENS_INTRINSIC_CALIBRATION
  • LENS_RADIAL_DISTORTION
  • LENS_POSE_REFERENCE
  • LENS_DISTORTION
  • LENS_INFO_HYPERFOCAL_DISTANCE
  • LENS_INFO_MINIMUM_FOCUS_DISTANCE
  • SENSOR_REFERENCE_ILLUMINANT1
  • SENSOR_REFERENCE_ILLUMINANT2
  • SENSOR_CALIBRATION_TRANSFORM1
  • SENSOR_CALIBRATION_TRANSFORM2
  • SENSOR_COLOR_TRANSFORM1
  • SENSOR_COLOR_TRANSFORM2
  • SENSOR_FORWARD_MATRIX1
  • SENSOR_FORWARD_MATRIX2

Ek örnek kod

Örnek uygulamaları indirmek için şuraya bakın: Kamera2Basic örneği ve Resmi CameraX örnek uygulaması.