当前位置:操作系统 > 安卓/Android >>

Android Camera(三)

把预览类放到布局中

Camera的预览类,如上文所示的示例,必须要跟用户界面控件一起放到一个Activity的布局中,以便拍照或录像。本段向你显示如果构建一个基本的用于预览的Activity布局。

下面的布局代码提供了一个很基本的View,它能够用于显示Camera的预览图像。在这个示例中,FrameLayout元素被用于Camera预览类的容器。使用这个布局类型可以让额外的图像信息或控件能够覆盖在实时的Camera预览图像之上。

<?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>

在大多数设备上,Camera预览的默认方向是横向。这个示例布局指定了一个水平(横向)布局,并且下面的代码把应用程序固定为横向。为了简化Camera预览中的展现,你应该通过在你的清单文件中添加以下设置,把应用程序的预览Activity的方向改变为横向的:

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

注意:Camera的预览不一定就是横屏模式。从Android2.2(API Level8)开始,你能够使用setDisplayOrientation()方法来设置预览图像的旋转。为了重新定位用户手的预览方向,在你的预览类的su易做图ceChanged()方法中,首先要用Camera.stopPreview()方法停止预览,然后改变方向,再用Camera.startPreview()方法启动预览。

在Camera View的Activity中,把你的预览类添加到上例所示的FrameLayout元素中。你的Camera Activity还必须确保在它被挂起或关闭时,要释放Camera对象。以下示例显示如何把上文中创建的预览类添加到Camera的Activity中:

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

    }

}

注意:上例中的getCameraInstance()方法引用了上文“访问Camera”中的示例方法。

采集图片

一旦你构建了一个预览类,并把它放到了一个View中,你就可以开始用你的应用程序来采集应用程序了。在你的应用程序代码中,必须建立用于响应用户拍照操作的用户界面控件的易做图。

要使用Camera.takePicture()方法来获取一张图片。这个方法需要3个参数来接收来自Camera的数据。为了接收JPEG格式的数据,你必须实现接收图片数据的Camera.PictureCallback接口,并把接收到数据写到一个文件中。下面的代码显示了一个Camera.PictureCallback接口的基本实现,它把从Camera接收到的数据保存到一个图片文件中:

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

        }

    }

);

注意:代码中的mPicture成员变量会在下面的示例代码中引用。

警告:记住,在应用程序使用完Camera对象后,一定要调用Camera.release()方法来释放Camera对象。

采集视频

使用Android框架采集视频需要认真的管理Camera对象,以及跟MediaRecorder类的协调。当使用Camera对象记录视频时,除了Camera.open()和Camera.release()方法的调用以外,还必须管理Camera.lock()和Camera.unlock()方法的调用,从而允许MediaRecorder对象访问Camera硬件。

注意:从Android4.0(API Level 14)开始,Camera.lock()和Camera.unlock()方法调用系统会为你自动管理。

跟拍照不一样,采集视频需要非常特殊的调用顺序,必须按照一个特定执行顺序

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,