xml地图|网站地图|网站标签 [设为首页] [加入收藏]

相机使用教程,android中camera的基本使用

来源:http://www.ccidsi.com 作者:集成经验 人气:59 发布时间:2020-03-15
摘要:5.2.1 配置 MediaRecorder 接收MediaRecorder录像录制时,必需固守一定顺序推行配置步骤,然后调用MediaRecorder.prepare()方法来检查和贯彻配置。以下示例代码演示怎么样准确配置和思忖Media
5.2.1 配置 MediaRecorder

接收MediaRecorder录像录制时,必需固守一定顺序推行配置步骤,然后调用MediaRecorder.prepare()方法来检查和贯彻配置。以下示例代码演示怎么样准确配置和思忖MediaRecorder举行摄像录像。

private boolean prepareVideoRecorder(){ mCamera = getCameraInstance(); mMediaRecorder = new MediaRecorder(); // Step 1: Unlock and set camera to MediaRecorder mCamera.unlock(); mMediaRecorder.setCamera; // Step 2: Set sources mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); // Step 3: Set a CamcorderProfile (requires API Level 8 or higher) mMediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH)); // Step 4: Set output file mMediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString; // Step 5: Set the preview output mMediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface; // Step 6: Prepare configured MediaRecorder try { mMediaRecorder.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以前的装置,因为 Android 2.2 此前的安顿方式不一致,具体方法能够到官方网站查阅。

MediaRecorder的以下录制录制参数被予以私下认可设置,我们能够通过调用以下方法调解应用程序的那一个设置:

  • setVideoEncodingBitRate()

  • setVideoSize()

  • setVideoFrameRate()

  • setAudioEncodingBitRate()

  • setAudioChannels()

  • setAudioSamplingRate()

访谈相机

设若您鲜明运转应用程序的装置具有摄像头,则必需经过获取录像头实例来倡议访问它(除非你正在使用意图来拜望二个录制头)。
要寻访首要录制机,请使用Camera.open()方法,并保管捕获任何至极,如上面包车型客车代码所示:

/** 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
}

注意:使用Camera.open()时平素检查格外。假如相机正在使用或不真实,则无从检查分外,将造成您的应用程序被系统关闭。

在运维Android 2.3(API Level 9)或更加高版本的配备上,您能够利用Camera.open(int)访谈特定的录像机。上边的演示代码将做客具备八个摄像头的设备上的率先个前置录制头

开始/停止MediaRecorder

当使用MediaRecorder类早前和停止摄像摄像时,必得依照以下列方法的调用顺序。

  1. 解锁相机
  2. 配置MediaRecorder
  3. 开始MediaRecorder
  4. 录像录制
  5. 停止MediaRecorder
  6. 释放MediaRecorder
  7. 锁定相机

当成功摄像后,不要即刻释放相机,不然预览也会告一段落。

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
                mMediaRecorder.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
                    mMediaRecorder.start();

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

5. 照相照片或录制

到底到了激动的时刻了,不管您激不激动,反正自个儿是激动了。

现今预览控件和二个视图结构都早就创办好了,立刻就足以起来应用应用程序捕获图像和录制了。在代码中,大家必得安装顾客分界面控件的监听器,以便响应客商操作。

要想拍戏图片,大家能够使用Camera.takePicture()方法,该方法必要吸收多个参数。为了以 JPEG 格式选择数据,大家不得不达成二个 Camera.PictureCallback 接口来收取图像数据并将其写入文件。下边包车型地铁代码便是二个完成Camera.PictureCallback 接口,来保存从相机选择到的图像的示例 。

private PictureCallback mPictureCallBack = 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: "   e.getMessage; return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write; fos.close(); } catch (FileNotFoundException e) { Log.d(TAG, "File not found: "   e.getMessage; } catch (IOException e) { Log.d(TAG, "Error accessing file: "   e.getMessage; } }};

假设想在拍片截止后管理图片,如下:

File pictureFile = null;try { pictureFile = getOutPutMediaFile();} catch (IOException e) { e.printStackTrace();}if (pictureFile == null) { CustomToast.show("图片保存路径不存在"); return;}Bitmap resource = BitmapFactory.decodeByteArray(data, 0, data.length);Matrix matrix = new Matrix();// 拍出来的照片默认是横向的matrix.setRotate;// 裁剪Bitmap bitmap = Bitmap.createBitmap(resource, startX, startY, newWidth, newHeight, matrix, false);resource.recycle();// 缩放 1.5 倍float scale = 1.5f;Matrix matrix2 = new Matrix();matrix2.setScale(scale, scale);bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix2, false);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);FileOutputStream fileOutputStream = null;try { fileOutputStream = new FileOutputStream(pictureFile); fileOutputStream.write(byteArrayOutputStream.toByteArray; fileOutputStream.close(); bitmap.recycle(); resource.recycle();} catch (IOException e) { e.printStackTrace();} finally { if (fileOutputStream != null) {try { fileOutputStream.close();} catch (IOException e) { e.printStackTrace();}

public File getOutPutMediaFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date; String imageName = "JPEG_"   timeStamp   "_"; File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); return File.createTempFile( imageName, ".jpg", storageDir ); }

经过调用Camera.takePicture()方法捕获图像。以下示例代码展现了什么通过开关的 View.OnClickListener 调用此方式。

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

这里 takePicture(卡塔尔(قطر‎ 方法中的第叁个参数字传送入 null,效果是按下快门键的时候无其余声响;而一旦传入七个Camera.ShutterCallback 接口的得以达成类,就能够暗中认可有“咔擦”一声,如下。

mCamera.takePicture(new Camera.ShutterCallback() { @Override public void onShutter() { }}, null, mPictureCallback);

再次警告:当大家的应用程序使用相机截至时,必须求切记通过调用Camera.release()来刑满释放解除劳教Camera对象!有关如何释放相机的具体操作,后边会介绍。

运用Android框架举办录制捕获须要细致管理Camera对象并与 MediaRecorder 类举办和睦。使用Camera录像录制时,除调用 Camera.open()和Camera.release()之外,还必须管理Camera.lock()和Camera.unlock()的调用以允许MediaRecorder访谈录制机硬件。

只顾:从Android 4.0早先,Camera.lock()和 Camera.unlock()调用将自行举行保管。

与运用设备摄像头拍片照片不一样,拍片录制供给丰盛非常的调用顺序。大家不得不比照一定的实行顺序工夫打响抓获摄像,具体步骤如下。

  1. 开荒相机 - 使用Camera.open()获取相机对象的实例。

  2. 接连几天来预览 - 使用Camera.setPreviewDisplay()将SurfaceView 连接到录制机,计划实时录像机图像预览。

  3. 起来预览 - 调用Camera.startPreview()起初显得实时录像头图像。

  4. 始发录像录制 - 为了成功录像录像,必需完毕以下步骤:a. 解锁相机 - 通过调用Camera.unlock()解锁相机以供MediaRecorder使用。b. 配置MediaRecorder - 按以下顺序调用上边列出的MediaRecorder的章程。有关详细新闻,请参阅 MediaRecorder参谋文书档案。

    1. setCamera() - 使用应用程序当前的Camera实例,并将其设置为用于录制捕获。
    2. setAudioSource() - 使用MediaRecorder.奥迪(Audi卡塔尔国oSource.CAMCORAV4DECR-V,设置音频源。
    3. setVideoSource() - 设置录制源,使用MediaRecorder.VideoSource.CAMERA。
    4. 安装录制输出格式和编码 - 对于Android 2.2及更加高版本,能够利用MediaRecorder.setProfile方法,并采取CamcorderProfile.get()获取配置文件实例。
    5. setOutputFile() - 设置输出文件,使用getOutputMediaFile(MEDIA_TYPE_VIDEO).toString()方法,后边会介绍。
    6. setPreviewDisplay() - 使用我们为总是预览内定的一律对象,为应用程序钦定 SurfaceView 预览构形成分。

    注意:大家必需按此顺序调用那么些MediaRecorder配置形式,不然应用程序将超越错误,并且摄像将战败。

    c. **准备MediaRecorder **- 通过调用MediaRecorder.prepare(),为已提供的安排安装思谋MediaRecorder。d. 启动MediaRecorder - 通过调用MediaRecorder.start()开始摄像摄像。

  5. 悬停录像摄像 - 按顺序调用以下办法,以成功完结拍戏:a. 停止MediaRecorder - 通过调用MediaRecorder.stop()截至摄像摄像。b. 重复设置MediaRecorder - 通过调用MediaRecorder.reset()从录制机中删除配置安装。c. **释放MediaRecorder ** - 通过调用MediaRecorder.release()来释放MediaRecorder。d. 锁定相机 - 锁定相机,以便今后的MediaRecorder会话能够透过调用Camera.lock()来采用它。从Android 4.0起初,除非MediaRecorder.prepare()调用失利,不然不供给调用它。

  6. 悬停预览 - 当大家的页面实现使用相机后,要动用Camera.stopPreview()停止预览。

  7. 获释相机 - 释放相机,以便其余应用程序能够由此调用Camera.release()来使用相机。

唤醒:能够先使用MediaRecorder创立摄像机预览,并跳过此进程的前多少个步骤。可是,由于大家日常更欣赏在最初录制在此以前便见到预览,所以这里就不切磋该进度。

本领:假使大家的应用程序主要用以摄像摄像,能够在开发银行预览在此以前将setRecordingHint设置为true。此设置能够扶植大家减少伊始录像所需的大运。

创立预览类

为了让顾客有效地拍录照片或录像,他们无法或不能见到器材相机见到的剧情。相机预览类是SurfaceView,能够展现来自相机的实时图像数据,由此客商能够框架并抓获图片或录像。
以下示例代码演示了怎么创设可含蓄在视图结构中的基本录制机预览类。这些类完结了SurfaceHolder.Callback,以便捕获用于创立和销毁视图的回调事件,那是分配录制机预览输入所须要的。

/** 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());
        }
    }
}

如若要为相机预览设置一定大小,请在上述注释中所述的三星GALAXY TabChanged()方法中安装此尺寸。设置预览大小时,必得接受getSupportedPreviewSizes()的值。不要在setPreviewSize()方法中设置任意值。

注意:随着Android 7.0(API级别24)及更高版本中多窗口作用的引进,固然在调用setDisplayOrientation()之后,也不能够再即使预览的驰骋比与您的移位一律。根据窗口大小和宽高比,您或许必需使用信箱布局将宽相机预览适配为纵向构造,反之亦然。

注意事项

在使用相机以前,首先要思虑以下关于如何利用相机的难点:

  • 相机必要:如若选拔要运用相机,不容许行使设置在并未有相机的道具上时,应该在manifest中表明必要。
  • 敏捷拍照/自定义相机:应用中是不是要提供相机新的不二秘籍,假诺仅仅拍照恐怕摄像,推荐使用系统自带的相机应用,假诺急需付出定制的双反相机功效,请看后边创设相机应用 章节。
  • 积累:是或不是想让使用中变化的肖像/录制仅本金和利息用可以知道,只怕分享使别的使用(相册、别的社交应用等)可知,是还是不是想在应用被卸载后,图片/录像依然可用,请看前边保存媒体文件 章节。

1. 检查评定相机硬件

若是我们的应用程序未有在 manifest 中声称非常必要相机,则应检查相机是不是在运作时可用。要推行此操作,大家得以选拔PackageManager.hasSystemFeature()方法,如以下示例代码所示:

/** 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设备为主都有八个摄像头,例如用于拍戏的前置录制头和用于录像通话的松手摄像头。 Android 2.3及更加高版本的系统允许大家使用Camera.getNumberOfCameras()方法检查装置上可用的摄像机数量。

相机效能(用来安装越发详细的视屏,比如种种比例和白平衡等。后期再补偿详细State of Qatar

Android扶助您可以应用相机应用程控的各类相机功效,举例图片格式,闪光方式,对焦设置等。本节列出司空见惯的摄影机作用,并简短探究什么运用它们。大超级多摄像机成效可以行使通过Camera.Parameters对象访问和安装。可是,有多少个重点的功力,须要的不单是Camera.Parameters中的简单设置。那一个职能就要以下部分中介绍:

  1. 测光和对焦区域
  2. 人脸检查实验
  3. 时光流逝录制

单反相机成效:应用必得声宾博(Karicare卡塔尔些与相机的局地功力。

<uses-feature android:name="android.hardware.camera" />

精晓越多的单反相机成效,移步至卡片机成效清单,通过在manifest中声称相机功效,可避防止利用棉被服装置在尚未相机或然不协助某个特定相机作用的的装备上。
一旦运用能够在还没相机可能有些特定相机效用的器械上也能寻常运营,则改善为如下代码:

<uses-feature android:name="android.hardware.camera" android:required="false" />
5.2.2 运维和结束MediaRecorder

利用MediaRecorder类运营和结束摄像摄像时,必需据守以下列出的一定顺序。

  1. 用Camera.unlock()解锁相机
  2. 陈设MediaRecorder,如行清节的代码示例所示
  3. 接受MediaRecorder.start()起先录像
  4. 录像录制
  5. 动用MediaRecorder.stop()结束录制
  6. 用MediaRecorder.release()释放媒体录音机
  7. 接受Camera.lock()锁定相机

以下示例代码演示怎么样使用相机和MediaRecorder 连接开关以科学运营和终止录像摄像。

当心:和拍摄分裂的是,完毕拍戏时毫无释放相机,不然将结束预览。

private boolean isRecording = false;// Add a listener to the Capture buttonButton captureButton =  findViewById(id.button_capture);captureButton.setOnClickListener( new View.OnClickListener() { @Override public void onClick { if (isRecording) { // stop recording and release camera mMediaRecorder.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 mMediaRecorder.start(); // inform the user that recording has started setCaptureButtonText; isRecording = true; } else { // prepare didn't work, release the camera releaseMediaRecorder(); // inform user } } } });

注意:在上边包车型客车示范中,prepareVideoRecorder()方法指的是结构MediaRecorder 中的示例代码。此措施负担锁定相机,配置和希图MediaRecorder实例。

开发银行和安息MediaRecorder

当使用MediaRecorder类运转和苏息录制摄像时,必需依据以下列出的一定顺序。

  1. 选取Camera.unlock()解锁相机
  2. 安顿MediaRecorder,如上边的代码示例所示
  3. 使用MediaRecorder.start()伊始摄像
  4. 摄像录像
  5. 运用MediaRecorder.stop()停止摄像
  6. 动用MediaRecorder.release()释放媒体记录器
  7. 使用Camera.lock()锁定相机

以下示例代码演示了如何连接贰个开关,以利用相机和MediaRecorder类精确运营和苏息录制录像。

注意:达成摄像录制时,请勿释放相机,不然将终止预览。

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
                mMediaRecorder.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
                    mMediaRecorder.start();

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

注意:在上头的为人师表中,prepareVideoRecorder()方法援用配置MediaRecorder中显示的现身说法代码。此措施担当锁定相机,配置和准备MediaRecorder实例。(详见例子)

利用本地相机应用

最简便的摄影/摄像的诀窍正是直接行使Inten运营本地相机应用,具体选择查看拍照、录像。

反省职能可用性

在Android设备上设置使用相机作用时,首先要领会的是,并非全部设备都扶助全数相机效能。其余,帮忙特定效用的器材或然会将其扶持到差异的等第或差异的选项。因而,大家要调节使用什么相机作用以至支持到怎样程序。做出决定后,我们理应先反省装置硬件是不是支持那几个功效,若是效果不可用,给客户提醒。

作者们能够透过获得相机参数对象的实例并检查不无关系措施来检查相机功效的可用性。以下代码示例呈现怎么获得Camera.Parameters对象并检查相机是否援救活动对焦成效:

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

我们能够利用方面包车型大巴不二诀窍来赢得好多相机功效。 Camera.Parameters对象提供了一个getSupported ...(),is... Supported()或getMax...()方法来鲜明是或不是作用被扶助。假使我们的应用程序需求一些相机功能能力健康运维,则足以由此抬高应用程序项目清单来供给它们。当大家注解使用一定的相机成效(举个例子闪光灯和自动对焦)时,GooglePlay将应用程序限定为不帮助这么些效用的装置上。有关可以在应用程序清单中宣示的​​录制头作用的列表,请参阅清单效果与利益的 API Features Reference。

破获图片

假使营造了预览类和出示它的视图结构,就足以起头选取应用程序捕获图像。在应用程序代码中,您必得为客商分界面控件设置侦听器,以通过摄像图片来响应客商操作。在应用程序代码中,您必得为客户分界面控件设置侦听器,以通过拍戏图片来响应客商操作。

为了找出图片,请使用Camera.takePicture()方法。此办法须要多个参数,从相机选拔数据。为了选拔JPEG格式的数额,您必需落到实处三个Camera.PictureCallback接口来接过图像数据并将其写入文件。以下代码突显了Camera.PictureCallback接口的主导贯彻,用于保存从相机接纳的图像。

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: "  
                e.getMessage());
            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()方法触发捕获图像。以下示例代码展现了哪些从按键View.OnClickListener调用此情势。

// 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) {
            // get an image from the camera
            mCamera.takePicture(null, null, mPicture);
        }
    }
);

警告:记住,当您的应用程序使用它时,通过调用Camera.release()来释放Camera对象!有关怎样释放相机的新闻,请参阅释放相机。

累积媒体文件

肖像/摄像媒体文件应该寄存在外表存款和储蓄,以节省系统空间。上边是二种标准措施:

  • Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES卡塔尔(قطر‎:方法再次回到照片/录制的专门的学问、分享、推荐的囤积地点。别的应用能够访谈,应用卸载后,文件不会被删除。为了幸免震撼客商现存的图样和录制,应该在那目录中开创七个子目录,如下代码所示。
  • Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES卡塔尔:方法再次来到用于保存于接收相关联的图纸/摄像地方,假使使用卸载,那么些文件将会被剔除。
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;
}

注意:Environment.getExternalStoragePublicDirectory()在Android 2.2(API等第8)或越来越高版本中可用。 假诺你使用最先版本的Android定位装置,请改用Environment.getExternalStorageDirectory()。

上一篇介绍了怎么着行使系统相机轻便、急忙的拓宽拍录,本篇将介绍怎么着使用框架提供的API间接决定摄像机硬件。

刑释相机

摄电影放映机是由器具上的应用程序分享的财富。您的应用程序能够在收获相机实例后使用相机,何况您的应用程序结束使用时,以至应用程序暂停后(Activity.onPause()),您必得非常小心放出相机对象。借使应用程序未正确释放相机,则随着尝试访问相机(富含你本身的应用程序)将会失利,并大概变成您的或任何应用程序关闭。

要释放Camera对象的实例,请使用Camera.release()方法,如下边包车型大巴演示代码所示。

public class CameraActivity extends Activity {
    private Camera mCamera;
    private SurfaceView mPreview;
    private MediaRecorder mMediaRecorder;

    ...

    @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 (mMediaRecorder != null) {
            mMediaRecorder.reset();   // clear recorder configuration
            mMediaRecorder.release(); // release the recorder object
            mMediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

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

警示:假若你的应用程序未正确释放相机,则接着尝试访谈相机(包涵你自个儿的应用程序)将会退步,并或许招致您的或其余应用程序关闭。

检查评定相机硬件

借使应用还未有在mainfest中声称须求相机,在运作时将在动用PackageManager.hasSystemFeature(卡塔尔方法检查测试相机是或不是可用。

/** 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设备得以有多个摄像头,例如用于拍戏的前置录像头和用于录像通话的放置录制头。 Android 2.3(API品级9)及越来越高版本允许行使Camera.getNumberOfCameras()方法检查装置上可用的录制机数量。

7. 保留文件

客户创立的媒体文件应封存在器材的外表存款和储蓄目录中,以节省系统空间,并允许客户在未有器材的景况下访问那么些文件。有广大或然的目录地方来保存设备上的媒体文件,不过作为开采人士我们一定要选取多少个正规地方:

  • Environment.getExternalStoragePublicDirectory - 此情势重返的是Android系统推荐的用于保存图片和录像的正规化的地点。该目录是分享的,所以任何应用程序能够轻易地读取,校正和删除保存在这里职责的公文。假若我们的应用程序被顾客卸载,保存到此岗位的媒体文件将不会被剔除。为了幸免震撼客户现存的图片和录像,大家理应在该目录中为我们的应用程序创设三个子目录,如上边的代码示例所示。

  • Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) - 此措施重临的是用来保存与应用程序相关联的图纸和录制的正式地点。就算大家的应用程序被卸载,则保留在这里岗位的保有文件都将被剔除。保存在该岗位的文本别的应用程序也足以读取,订正和删除。

以下示例代码演示如何为媒体文件创设二个文书或 Uri 地点,以便在运用Intent或调用设备的卡片机时利用。

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{ return Uri.fromFile(getOutputMediaFile;}/** Create a File for saving an image or video */private static File getOutputMediaFile{ // 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;}

在乎:Environment.getExternalStoragePublicDirectory()在Android 2.2或更加高版本中可用。若是利用较早版本的Android定位装置,应改用Environment.getExternalStorageDirectory()。有关详细音讯,请参阅保存分享文件。

要使UPAJEROI扶持职业安顿文件,首先将 file UHavalI转变为 content UMuranoI。然后,将 content U景逸SUVI加多到Intent的EXTRA_OUTPUT中。

清单证明

在动用Camera API初步支付应用程序从前,应确定保证您的清单具备相当的宣示,以允许使用相机硬件和其余有关职能。

  • 相机权限 - 您的应用程序必需央浼使用设备相机的权位。

    <uses-permission android:name="android.permission.CAMERA" />

    只顾:若是你通过调用现成的录像头应用程序来使用摄像头,则应用程序无需伏乞此权限。

  • 卡片机成效 - 您的应用程序还非得证明使用相机效能,举例:

    <uses-feature android:name="android.hardware.camera" />

  • 积攒权限 - 假设应用程序将图像或录像保存到道具的外表存款和储蓄设备(T-Flash卡),则还必需在项目清单中钦命此选项。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  • 节奏录像权限 - 对于利用摄像捕获录制音频,应用程序必需须要获取音频捕获权限。

    <uses-permission android:name="android.permission.RECORD_AUDIO" />

自由相机

相机是由器械上的应用程序分享的能源。 获取相机实例后,应用能够应用相机,当使用结束使用时,或许只要应用程序暂停(Activity.onPause()),必得极其小心放出相机对象。 假设您的应用程序未有精确地放出相机,则有所继续访谈相机的品味(满含你本人的行使)都将失利,并大概招致应用关闭。代码如下:

public class CameraActivity extends Activity {
    private Camera mCamera;
    private SurfaceView mPreview;
    private MediaRecorder mMediaRecorder;

    ...

    @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 (mMediaRecorder != null) {
            mMediaRecorder.reset();   // clear recorder configuration
            mMediaRecorder.release(); // release the recorder object
            mMediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

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

满脸检测

对此富含人物的图纸,脸部平时是图片中最主要的部分,并且应在抓获图像时用来鲜明宗旨和白平衡。Android 4.0(API Level 14)框架提供用于识别人脸和利用脸部识别技巧总括图像设置的API。

只顾:当脸部检查测试成效正在运营时,setWhiteBalance,setFocusAreas(List <Camera.Area>)和setMeteringAreas(List <Camera.Area>)未有别的功能。

行使相机应用程序中的人脸检查评定功能必要多少个正规步骤:

  • 自己探讨设备是或不是支持人脸检查评定
  • 开创壹人脸检查测验监听器
  • 将脸部检查测量检验侦听器增加到你的双反相机对象
  • 预览后开发银行脸部检验

实际不是有着设施都补助人脸检验功用。您能够经过调用getMaxNumDetectedFaces()来检查此效能是不是受补助。此检查的身教重于言教呈现在底下的startFaceDetection()示例方法中。

为了获取文告并对脸部的检验做出响应,您的双反相机应用程序必需安装三个用于人脸检验事件的侦听器。为此,您必需创立二个监听器类,达成Camera.FaceDetectionListener接口,如下边包车型客车示范代码所示。

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; } }}

成立此类之后,然后将其设置到应用程序的Camera对象中,如上面包车型地铁为人师表代码所示:

mCamera.setFaceDetectionListener(new MyFaceDetectionListener;

每趟运营相机预览时,应用程序都一定要启摄人心魄脸检查测验作用。创设一种伊始面部检查测量试验的不二等秘书诀,以便你可以依附须要调用它,如下边包车型客车自己要作为轨范固守规则代码所示。

public void startFaceDetection(){ // Try starting Face Detection Camera.Parameters params = mCamera.getParameters(); // start face detection only *after* preview has started if (params.getMaxNumDetectedFaces{ // camera supports face detection, so can start it: mCamera.startFaceDetection(); }}

每一遍运维相机预览时,都不得不从头面部检验。假如运用“创设预览”类中呈现的预览类,请在预览类中将startFaceDetection()方法增多到GALAXY TabCreated()和华为平板Changed()方法,如下边包车型地铁亲自去做代码所示。

public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay; 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 (mHolder.getSurface() == null){ // preview surface does not exist Log.d(TAG, "mHolder.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; 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; }}

唤醒:调用startPreview()后,不忘记调用那几个措施。不要在相机应用程序的要害运动的onCreate()方法中品尝初阶人脸质量评定,因为在应用程序的推行进度中预览不可用。

配置MediaRecorder

当使用MediaRecorder类记录摄像时,必得按一定顺序施行配置步骤,然后调用MediaRecorder.prepare()方法来检查和兑现配置。以下示例代码演示怎样科学配置和思虑MediaRecorder类举行摄像录像。

private boolean prepareVideoRecorder(){

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

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

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

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

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

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

    // Step 6: Prepare configured MediaRecorder
    try {
        mMediaRecorder.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(API品级8)在此之前,您必需向来设置输出格式和编码格式参数,实际不是行使CamcorderProfile。这种方法在底下的代码中示范:

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

MediaRecorder的以下摄像摄像参数被给与私下认可设置,可是,您恐怕想要为应用程序调节那些设置:

setVideoEncodingBitRate()
setVideoSize()
setVideoFrameRate()
setAudioEncodingBitRate()
setAudioChannels()
setAudioSamplingRate()

录像

接收android framework摄像时,要认真管理Camera对象,并与MediaRecord类举行相互作用。

留意:从Android 4.0(API等第14)开头,调用Camera.lock()和Camera.unlock()方法就能够自行对Camera实行关押。

与拍戏分化,录制须要一定的函数调用顺序,以盘活拍照的备选干活。流程如下:

  1. 展开相机:通过Camera.open(卡塔尔国获取相机实例。
  2. 接连预览:通过Camera.setPreviewDisplay(State of Qatar连接SurfaceView,为预览相机实时图像做策动。
  3. 开首预览:调用Camera.startPreview(卡塔尔(قطر‎展现相机实时图像。
  4. 开班录像:步骤如下:
    • 解锁相机:调用Camera.ulock(卡塔尔(قطر‎解锁相机,以供MediaRecordr使用。
    • 配置MediaRecorder:调用下列方式成功MediaRecorder的配备,越来越多新闻参谋MediaRecorder
      1. setCamera(卡塔尔:通过Camera实例中的setCamera(卡塔尔方法设置用来照相的卡片机。
      2. set奥迪oSource(卡塔尔国:通过MediaRecorder.奥迪oSource.CAMCO酷威DE陆风X8,设置声源。
      3. setVideoSource(卡塔尔(قطر‎:通过MediaRecorder.VideoSource.CAMERA,设置摄像源。
      4. 安装输出摄像编码格式,对于Android 2.2(API 8级)及更加高版本,请使用MediaRecorder.setProfile(卡塔尔(قطر‎方法,并动用CamcorderProfile.get()获取配置文件实例。对于2.2事前的Android版本,必得安装如下录制输出格式和编码参数:
        • setOutputFormat(State of Qatar:内定输出格式,默以为MediaRecorder.OutputFormat.MPEG_皇家赌场手机版,4。
        • set奥迪(Audi卡塔尔国oEncoder(卡塔尔:内定声音编码类型,默以为MediaRecorder.奥迪(Audi卡塔尔国oEncoder.AM牧马人_NB。
        • setVideoEncoder(State of Qatar:钦命录像编码类型,暗中同意为MediaRecorder.VideoEncoder.MPEG_4_SP。
      5. setOutputFile(卡塔尔(قطر‎:设置输出文件。
      6. setPreviewDisplay(卡塔尔:用前面内定的三番五次预览的类,设置SurfaceView预览布局成分。
    • 未雨打算MediaRecorde:依照上述配置,调用MediaRecorder.prepare(卡塔尔国。
    • 开首录像:调用MediaRecorder.start(State of Qatar开端摄像摄像。
  5. 终止录像:按顺序调用如下方法:
    • 停止MediaReorder:调用MediaRecorder.stop()。
    • 重新载入参数MediaRecorder(可选):肃清MediaRecorder中的配置。
    • 释放MediaRecorder:调用MediaRecorder.release()释放。
    • 锁定相机:锁定相机,以便后续MediaRecorder通过Camera.lock(卡塔尔(قطر‎使用相机,从Android 4.0(API等级14)开头,除非MediaRecorder.prepare()调用退步,不然无需此情势。
  6. 停下预览:当使用完相机后,通过调用Camera.stopPreview(State of Qatar甘休预览。
  7. 获释相机:释放相机,以作保别的应用可以选用相机,调用Camera.release(State of Qatar。

只顾:能够先接收MediaRecorder创立相机预览,并跳过此进度的前多少个步骤。 但是,由于客户日常钟爱在起来录像在此之前见到预览,所以那边不切磋该进程。
提醒:如若采纳平日用于录像录制,在开发银行预览此前将setRecordingHint(boolean)设置为true。 此设置可以扶植减削最早录像所需的时光

本文由68399皇家赌场发布于集成经验,转载请注明出处:相机使用教程,android中camera的基本使用

关键词: 68399皇家赌场 Android开发 Android 教程 相机

上一篇:OkHttp实现全局过期token自动刷新

下一篇:没有了

最火资讯