在Android应用程序的背景中的实时相机提要

时间:2014-05-28 17:44:12

标签: android android-camera

我想创建一个Android应用程序,它运行后置摄像头在后台捕获的实时视频。我是Android app dev的新手。谁能帮忙。

2 个答案:

答案 0 :(得分:2)

你要问的是相当复杂的,有点太多,无法启动android。但是你可以使用它并且可以工作:

---->>>> !!!!我修改了我的答案。现在你可以按原样使用它并且工作得很好。< -----

package com.mreprogramming.test;

import java.io.IOException;

import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.os.Bundle;


public class CameraActivity extends Activity implements SurfaceHolder.Callback{

    protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;
    private SurfaceView SurView;
    private SurfaceHolder camHolder;
    private boolean previewRunning;
    final Context context = this;
    public static Camera camera = null;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);


    SurView = (SurfaceView)findViewById(R.id.sview);
    camHolder = SurView.getHolder();
    camHolder.addCallback(this);
    camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);


    }


    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    if(previewRunning){
        camera.stopPreview();
    }
    Camera.Parameters camParams = camera.getParameters();
    Camera.Size size = camParams.getSupportedPreviewSizes().get(0); 
    camParams.setPreviewSize(size.width, size.height);
    camera.setParameters(camParams);
    try{
        camera.setPreviewDisplay(holder);
        camera.startPreview();
        previewRunning=true;
    }catch(IOException e){
        e.printStackTrace();
    }
    }

    public void surfaceCreated(SurfaceHolder holder) {
    try{
        camera=Camera.open();
    }catch(Exception e){
        e.printStackTrace();
        Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
        finish();
    }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
    camera=null;
    }


}

对于布局camera.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"   xmlns:app="http://schemas.android.com/apk/lib/com.google.ads"
android:id="@+id/camview">

<SurfaceView
    android:id="@+id/sview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />


</RelativeLayout>
祝你好运

还在清单

中包含此内容
<uses-permission android:name="android.permission.CAMERA" />

同样在清单中,将以下内容添加到&#34; CameraActivity&#34;活动标签,以确保您的活动始终处于横向,因为除非您更改代码,否则将手机保持在横向(直立),它将反转图像的宽高比并严重扭曲它。

<activity
    android:name="com.mreprogramming.test.CameraActivity"
    android:label="@string/app_name"
    android:screenOrientation="landscape" >   <-------ADD THIS ---!!!!!
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

如果您想使布局全屏显示在样式xml

<resources>

<!--
    Base application theme, dependent on API level. This theme is replaced
    by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.NoTitleBar.Fullscreen">
    <!--
        Theme customizations available in newer API levels can go in
        res/values-vXX/styles.xml, while customizations related to
        backward-compatibility can go here.
    -->
</style>

<!-- Application theme. -->
<style name="AppTheme" parent="android:Theme.NoTitleBar.Fullscreen">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowNoTitle">true</item>
</style>

答案 1 :(得分:0)

不要让CameraActivity实现SurfaceHolder.Callback,最好提供一个单独的Callback实现,如:

    camHolder.addCallback(callback);
    private SurfaceHolder.Callback callback = new Callback () {
    public void surfaceCreated(SurfaceHolder holder) {}

    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}

    public void surfaceDestroyed(SurfaceHolder holder) {}
}

在我的Android设备上,三星S3,如果没有单独实现回调,我收到错误,“app传递了null表面”,带有Camera标签。