【问题标题】:live camera feed in background of android appandroid应用程序背景中的实时摄像头提要
【发布时间】:2015-06-17 03:15:03
【问题描述】:

我想制作一个 android 应用程序,该应用程序在后台运行后置摄像头捕获的实时视频源。我对 android app dev 相当陌生。谁能帮忙。

【问题讨论】:

  • 我才刚刚开始学习应用开发,这是我的第一个项目。我不知道从哪里开始,所以我发布了这个问题。我用谷歌搜索了这个,但没有多大帮助。请给我一个起点或一些参考资料
  • @Abhimanyu 检查我的答案。您可以按原样使用代码

标签: android android-camera


【解决方案1】:

您所问的内容相当复杂,并且对于启动 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" />

此外,在清单中将以下内容添加到“CameraActivity”活动选项卡中,以确保您的活动始终处于横向,否则除非您更改代码,否则将手机保持在纵向(直立)状态,否则它将反转图像的外观比例并严重扭曲它。

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

【讨论】:

  • 我意识到我必须学习很多才能理解您提供的代码。无论如何,非常感谢。我会在一段时间后看看这个。
  • 与其让CameraActivity实现SurfaceHolder.Callback,不如提供一个单独的Callback实现。参考下面的答案。这是因为在我的 Android 设备中,否则会出现错误,“应用程序通过了空表面”。
【解决方案2】:

与其让 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 中,如果未单独实现回调,我会收到错误消息,“应用程序通过了带有相机标签的空表面”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2012-12-25
    • 2016-06-09
    相关资源
    最近更新 更多