Android每5秒拍照一次

2023-11-27

使用相机 API,我能够成功拍摄照片并将其保存到文件夹中。这是我正在使用的代码:

主要.xml:

<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:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Capture" />

辅助类:

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CameraPreview extends SurfaceView implements
        SurfaceHolder.Callback {
    private SurfaceHolder mSurfaceHolder;
    private Camera mCamera;

    // Constructor that obtains context and camera
    @SuppressWarnings("deprecation")
    public CameraPreview(Context context, Camera camera) {
        super(context);
        this.mCamera = camera;
        this.mSurfaceHolder = this.getHolder();
        this.mSurfaceHolder.addCallback(this);
        this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        try {
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.setDisplayOrientation(90);
            mCamera.startPreview();
        } catch (IOException e) {
            // left blank for now
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        mCamera.stopPreview();
        mCamera.release();
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
            int width, int height) {
        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(surfaceHolder);
            mCamera.startPreview();
        } catch (Exception e) {
            // intentionally left blank for a test
        }
    }

}

活动类别:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

public class MyCamera extends Activity {
    private Camera mCamera;
    private CameraPreview mCameraPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mCamera = getCameraInstance();
        mCameraPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mCameraPreview);

        Button captureButton = (Button) findViewById(R.id.button_capture);
        captureButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCamera.takePicture(null, null, mPicture);
            }
        });
    }

    /**
     * Helper method to access the camera returns null if it cannot get the
     * camera or does not exist
     * 
     * @return
     */
    private Camera getCameraInstance() {
        Camera camera = null;
        try {
            camera = Camera.open();
        } catch (Exception e) {
            // cannot get camera or does not exist
        }
        return camera;
    }

    PictureCallback mPicture = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            File pictureFile = getOutputMediaFile();
            if (pictureFile == null) {
                return;
            }
            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {

            } catch (IOException e) {
            }
        }

    };

    private static File getOutputMediaFile() {
        File mediaStorageDir = new File(
                Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                "MyCameraApp");
        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;
        mediaFile = new File(mediaStorageDir.getPath() + File.separator
                + "IMG_" + timeStamp + ".jpg");

        return mediaFile;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.my_camera, menu);
        return true;
    }

}

我还在清单文件中添加了以下内容:

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

我有以下问题:

我想做以下事情:

  1. 按下拍摄按钮后,我希望相机通过使用倒计时器自动继续每 5 秒拍摄一次照片。所以我添加了以下内容:

    while(true){
       new CountDownTimer(5000,1000){
    
                @Override
                public void onFinish() {
                    mCamera.takePicture(null, null, mPicture);
                }
    
                @Override
                public void onTick(long millisUntilFinished) {
    
                }
    
            }.start();
    }
    

然而,我再也看不到照片了。我添加了 while(true) 以使代码不重复。我已经在没有 while(true) 的情况下尝试过,并且正如预期的那样,图像捕获延迟了 5 秒

第二件事是:如何改变拍摄图片的质量?

任何帮助将不胜感激。


去除while(true),您不需要它,并且将创建无限的倒计时器。

将倒计时开始更改为此

new CountDownTimer(5000,1000){

    @Override
    public void onFinish() {

    }

    @Override
    public void onTick(long millisUntilFinished) {
        mCamera.startPreview();
        mCamera.takePicture(null, null, mPicture);
    }

}.start();

onTick在本例中每 1000 毫秒调用一次,并且onFinish当定时器倒计时完成时调用。

如果你想每 5 秒重复一次某件事,我不认为CountDownTimer适合您的需求...Timer会更好。

Timer timer = new Timer();
timer.schedule(new TimerTask()
{
    @Override
    public void run()
    {
        mCamera.startPreview();
        mCamera.takePicture(null, null, mPicture);
    }
}, 0, 1000);

记得保存Timer实例阻止它!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android每5秒拍照一次 的相关文章

  • 从存储访问框架 UI 获取文件夹后保存图像

    我设置了一个首选项 让用户使用存储访问框架为我的应用程序选择保存文件夹 获取uri后onActivityResult我将其保存到SharedPreferences作为字符串并在要保存时保存图像 我正在使用此方法成功保存图像 public v
  • 如何列出我的应用程序以供下载文件?

    我想通过我的应用程序从浏览器下载文件 我正在尝试将我的应用程序列在complete action using对话 它显示其他操作 例如查看文件等 但在下载文件的情况下 它不会显示在对话框中 我怎样才能像图片中那样列出我的应用程序 我在我的活
  • 使用 Android/Firebase 实时数据库时,Single.Create()...blockingGet() 在 RxJava 2.1.3 中挂起

    当使用以下模式从Firebase实时数据库同步获取数据时 String s Single create new SingleOnSubscribe
  • 视图绑定对应用程序大小的影响有多大?

    View Binding 按照文档的规定 为每个XML元素生成一个Binding类 以方便访问和检查 并减轻如下的时间负担 findViewById 虽然findViewById通过更昂贵的关联搜索进行操作 由于映射 绑定应该 直接 访问
  • 如何从 Cursor 获取行 ID

    如何从游标获取行 ID 我不认为 Cursor 直接暴露了这一点 SQLiteDatabase insert 返回新插入行的行 ID 或者在 Android 中 惯例是有一个名为 id 包含表的主自动增量键 所以cursor getLong
  • Camera2设置预览(View)并获取预览回调

    我想从 Camera2 获取预览以及用于处理帧的 byte 回调 mImageReader ImageReader newInstance largest getWidth largest getHeight ImageFormat RAW
  • 请求超级用户权限编辑文件

    我正在规划一个需要编辑系统文件的应用程序 我只能使用 root 权限编辑该文件 我有一个已 root 且安装了 Superuser apk 的开发手机 其他需要 root 的应用程序会在首次启动时请求 root 访问权限 我想做同样的事情
  • 如何在默认浏览器或webview中打开按钮点击url

    我怎样才能打开一个网址webview或者点击按钮后在默认浏览器中 目前 当我单击btn1按钮 它提示我从手机中选择一个浏览器 我想在默认浏览器或其他浏览器中打开此网址webview 这是我的java代码 public class myact
  • 如何使用 Android 处理在 Google Cardboard 设备中显示立体图像?

    处理的目的是使使用 Java 绘图变得更加容易 Android 的处理功能具有桌面版的强大功能以及来自传感器的信息 将这些东西放在一起 显示立体图像并像 Oculus Rift 或 Google Cardboard 一样在其周围移动不是很容
  • Kotlin Room 数据库单例模式

    我正在尝试创建单人房间数据库 我找到了两种解决方案 但我不知道它们之间有什么区别 根据这个文件 companion object Volatile private var INSTANCE AppDatabase null fun getI
  • Android 中的垂直和水平滚动视图

    我真的很累了寻找垂直和水平滚动视图的解决方案 我读到框架中没有任何视图 布局实现此功能 但我需要这样的东西 我需要在其他布局中定义一个布局 子布局必须实现垂直 水平滚动才能移动 最初实现了一个逐像素移动布局的代码 但我认为这不是正确的方法
  • eclipse - 在android虚拟设备中卡住中文

    当我在 Eclipse 中运行 Android 模拟器时 当我尝试编写文本时 所有键盘字符都会被翻译为中文 为什么是这样 Thanks 点击并按住EditText Select 输入法 Select 安卓键盘
  • 单击输入字段会触发窗口调整大小

    我有一个带有徽标 菜单和搜索的标题 当我在桌面上时 我会按该顺序显示所有元素 但如果我的窗口宽度小于 980 像素 菜单会隐藏 有一个切换按钮 并且徽标会与nav并附在徽标之后 如果宽度更大 则徽标将再次分离并附加到 DOM 中的旧位置 w
  • Facebook Android 意图

    我对这个意图有疑问 这个意图是发送文本类型的消息 一切正常 电子邮件 短信 推特以及手机上的任何内容 但唯一有问题的是facebook 它会尝试以链接而不是文本的形式发布 Intent s new Intent android conten
  • 点击当前选项卡刷新页面时的 Xamarin.Forms TabbedPage 事件

    我正在使用 Xamarin Forms 构建 iOS Android 应用程序 并有一个 TabbedPage 如果用户已经在选项卡 2 上 并且单击了选项卡 2 并且我希望刷新选项卡 2 或者运行我自己的函数 以便我可以自己刷新它 有没有
  • 带动画的 ScrollTo(0,250) Android ScrollView

    当我滚动到 0 250 时 我想在滚动动作中包含一个动画 我做了这段代码 但它没有根据动画滚动 scrollMe 是滚动小部件 id ObjectAnimator anim ObjectAnimator ofInt scrollMe tra
  • 停止前台运行的服务的正确方法是什么

    我正在尝试停止作为前台服务运行的服务 当前的问题是当我打电话时stopService 通知仍然保留 因此 在我的解决方案中 我添加了一个接收器 我正在将其注册到onCreate 在 的里面onReceive 我调用的方法stopforegr
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是
  • Android - 保留或删除应用程序卸载时创建的文件

    我创建了一个应用程序 用于创建文件并将其存储到 SD 卡 有没有办法将文件夹与应用程序绑定 以便当用户在 Android 设备上运行卸载时删除所有文件 自 2009 年以来似乎有了一些进展 来自文档 http developer andro
  • 如何检测用户是否禁用 GPS(Android - Play 服务)

    我使用 gms location LocationListener Google Play 服务 来获取用户的位置 它工作正常 但我想检测用户何时禁用或启用他 她的 GPS 就像这张照片一样 当我打开 关闭位置时 不会调用任何方法 当我切换

随机推荐

  • 删除超过 2 小时的 Firebase 数据

    我想删除超过两个小时的数据 目前 在客户端 我循环遍历所有数据并对过时的数据运行删除 当我这样做时 db on value 每次删除某些内容时都会调用该函数 另外 只有当客户端连接时才会删除内容 如果两个客户端同时连接会发生什么 我在哪里可
  • 有没有办法与 Netbeans 和 Github 一起工作,同步它们

    有没有办法与 Netbeans 和 Github 一起工作 同步它们 Netbeans 或其他东西的 Github 插件 Update NetBeans 7 0 现在在某些功能级别上对 Git 提供本机支持 它可以从 插件门户 更新中心 工
  • 如何更改 NuGet 包中的目标文件名?

    JavaScript 命名约定要求文件名中包含版本号 例如jQuery 1 34 min js 我有将输出的文本模板my library js在输出文件夹中 我想创建 NuGet 包my library js以这种方式 在安装时应将其部署为
  • 需要在 Singleton 类中私有化赋值运算符

    有人可以证明在 Singleton 类实现中私有化赋值运算符的必要性吗 它解决了什么问题Singleton operator Singleton const 私人的 class Singleton public static Singlet
  • 将对象的 NSMutableArray 保存/写入磁盘?

    最初我认为这会起作用 但现在我明白它不会起作用 因为artistCollection是一个 Artist 对象的NSMutableArray interface Artist NSObject NSString firName NSStri
  • 如何保存使用rhandsontable r包所做的编辑

    我的 R 程序按预期工作 它显示了一个包含我的数据帧的表 并允许我编辑值 如何捕获这些值并将它们保存到我的数据框或数据框的副本中 require shiny library rhandsontable DF data frame val 1
  • JavaFX 8 3D场景交点

    是否有可能在 JavaFX 8 3D 场景中沿着射线 例如 PickRay 找到点 从 3D 空间中具有某个 3D 方向向量的任意点开始 其中射线与网格中的三角形 MeshView 内的 TriangleMesh 相交 我知道这是在 Cam
  • 使用严格的 null 检查处理 Typescript 2.0 中的数组移位返回类型

    在我的具有严格 null 检查的 Typescript 2 0 项目中 我有一个数组 private timers ITimer 和一个 if 语句 if this timers length gt 0 this timers shift
  • 检查返回的文件是否为XML

    我需要检查网站输出的返回值 如果登录详细信息有效 它会返回一个 XML 文件 如果登录详细信息无效 它只会返回一个字符串 显示 您输入了无效 ID 我的问题是我用这个代码来检查 ch curl init curl setopt ch CUR
  • C# - 从特定应用程序捕获 Windows 消息

    我正在编写一个需要拦截的 C 应用程序窗口消息另一个应用程序正在发送 编写我正在监视的应用程序的公司向我发送了一些示例代码 但它是用 C 编写的 我不太了解 在 C 示例代码中 我得到了它们使用以下代码 UINT uMsg Register
  • 在 AXIOS 中发送 GET 方法的请求正文会引发错误

    我有一个 React 应用程序 我将 POST 方法更改为 GET 并按原样请求正文 它适用于 POST 请求 但是当我将方法更改为 GET 时 它给了我错误 message org springframework http convert
  • 基于gradle构建更新IntelliJ中的单一依赖

    是否可以让 IntelliJ 更新单个依赖项 而不必通过 Gradle 侧选项卡中的 刷新所有 Gradle 项目 按钮刷新所有依赖项 我问的原因是 我们的项目的完全刷新需要几分钟 足够长的时间让我写这个问题 我只想更新对我正在本地更新的另
  • 是否可以获得转换后的绘图数据? (例如点图中的点坐标、密度曲线)

    我想知道是否可以在 ggplot2 图中获取转换后的数据 特别是 我有兴趣获取点图中点的坐标和大小 以便在另一个绘图库中使用它们 d3 js 我怎样才能提取这些信息 这是情节 g ggplot data frame x rnorm 100
  • 控制台应用程序 - 当前工作线上方的 WriteLine

    我看过其他一些与此非常相似的帖子 但他们给出的答案并没有正确回答问题 抱歉 如果有什么隐藏的东西我找不到 我想使用 Console WriteLine 打印当前 Console ReadLine 上方的内容 例如 我的应用程序打印 Hell
  • 将变量编号分配给复数数组

    我想将复杂数组分配为变量 我的代码就像 complex indx 3 3 integer i j do i 1 3 do j 1 3 indx i j i j write indx i j end do end do 在这种情况下我收到类似
  • 在后面的代码中设置显示属性

    如何将显示属性设置为在后面的代码中阻止
  • 升级到 Gradle 7 后 Android Gradle Javadoc 损坏

    几天前 我升级到了新的 Android Studio Arctic Fox 版本 现在也需要 Gradle 7 在升级之前 我有以下 javadoc 任务 它运行得很好 def javaDocsAllowList com mycompany
  • 根据外部值有条件地应用管道步骤

    鉴于 dplyr 工作流程 require dplyr mtcars gt tibble rownames to column var model gt filter grepl x model pattern Merc gt group
  • “谓词下推”和“投影下推”有什么区别?

    我找到了多种信息来源 例如发现的一个here 将 谓词下推 解释为 如果您可以将部分查询 下推 到数据存储的位置 从而过滤掉大部分数据 那么您可以大大减少网络流量 但是 我还在其他文档中看到了术语 投影下推 例如here 这似乎是同一件事
  • Android每5秒拍照一次

    使用相机 API 我能够成功拍摄照片并将其保存到文件夹中 这是我正在使用的代码 主要 xml